Image 尝试反转二值图像会给我带来全黑屏

Image 尝试反转二值图像会给我带来全黑屏,image,verilog,Image,Verilog,我有一个黑白图像,我想反转(黑色到白色,白色到黑色),其中黑色=0,白色=255。我试图使用下面的代码,但它没有反转我的图像,而是使整个屏幕变黑 module Inverter ( input [7:0] binary_red, input [7:0] binary_green, input [7:0] binary_blue, output [7:0] inverted_red, output [7:0] invert

我有一个黑白图像,我想反转(黑色到白色,白色到黑色),其中黑色=0,白色=255。我试图使用下面的代码,但它没有反转我的图像,而是使整个屏幕变黑

module Inverter (
    input   [7:0]   binary_red,
    input   [7:0]   binary_green,
    input   [7:0]   binary_blue,
    output  [7:0]   inverted_red,
    output  [7:0]   inverted_green,
    output  [7:0]   inverted_blue);

    parameter black = 0;
    parameter white = 255;

    assign inverted_red = (binary_red == black) ? white : black;
    assign inverted_green = (binary_green == black) ? white : black;
    assign inverted_blue = (binary_blue == black) ? white : black;
endmodule 
关于为什么这不是我想要的反转,有什么想法吗?谢谢你的帮助

编辑:所以有些人要求看更多的代码,因为可能不是这个模块把事情搞砸了。有一个颜色过滤器,它先接收原始RGB数据,然后过滤掉红色数据:

module  Color_Filter (
    input       [9:0]   oVGA_Red,
    input       [9:0] oVGA_Green,
    input   [9:0]   oVGA_Blue,
    output  [7:0]   filtered_Red,
    output  [7:0]   filtered_Green,
    output  [7:0]   filtered_Blue);

    parameter redFilterValue = 150;
    parameter greenFilterValue = 110;
    parameter blueFilterValue = 110;

    assign  filtered_Red = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Red[9:2] : 0;
    assign  filtered_Green = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Green[9:2] : 0;
    assign  filtered_Blue = (oVGA_Red[9:2] >= redFilterValue && oVGA_Green[9:2] <= greenFilterValue && oVGA_Blue[9:2] <= blueFilterValue) ? oVGA_Blue[9:2] : 0;

endmodule
然后它进入一个二进制图像,在那里它查看灰度值,并根据其值转换为二进制,如下所示:

module Binary_Filter (
    input   [7:0]   greyscale_red,
    input       [7:0]   greyscale_green,
    input       [7:0]   greyscale_blue,
    output  [7:0] binary_red,
    output  [7:0] binary_green,
    output  [7:0]   binary_blue);

    parameter black = 0;
    parameter white = 255;

    assign binary_red = ((greyscale_red > 51) ? white : black); 
    assign binary_green = ((greyscale_green > 51) ? white : black); 
    assign binary_blue = ((greyscale_blue > 51) ? white : black); 

endmodule
在此之后,它会转到我最初发布的反转模块。在我的顶层模块中,这是通过执行以下操作完成的:

Color_Filter    color_filter    (
                                    .oVGA_Red(oVGA_R),
                                    .oVGA_Green(oVGA_G),
                                    .oVGA_Blue(oVGA_B),
                                    .filtered_Red(filtered_R),
                                    .filtered_Green(filtered_G),
                                    .filtered_Blue(filtered_B)
                                    );

Greyscale_Filter    greyscale_Filter    (
                                            .filtered_red(filtered_R),
                                            .filtered_green(filtered_G),
                                            .filtered_blue(filtered_B),
                                            .greyscale_red(greyscale_R),
                                            .greyscale_blue(greyscale_G),
                                            .greyscale_green(greyscale_B)
                                            );

Binary_Filter   binary_filter   (
                                    .greyscale_red(greyscale_R),
                                    .greyscale_green(greyscale_G),
                                    .greyscale_blue(greyscale_B),
                                    .binary_red(binary_R),
                                    .binary_green(binary_G),
                                    .binary_blue(binary_B)
                                    );

Inverter    inverter    (
                    .clk(VGA_CTRL_CLK),
                    .binary_red(binary_R),
                    .binary_green(binary_G),
                    .binary_blue(binary_B),
                    .inverted_red(inverted_R),
                    .inverted_green(inverted_G),
                    .inverted_blue(inverted_B)
                    );

您的输入数据可能不是纯黑白的,而是灰色的。例如,如果
binary_red
为1(接近黑色),则
inversed_red
将为0(黑色),而不是254(接近白色)

尝试使用
~
运算符进行位反转

assign inverted_red = ~binary_red;
assign inverted_green = ~binary_green;
assign inverted_blue = ~binary_blue;

到目前为止显示的所有内容都是针对单个像素,而不是整个阵列。在这一点上,任何人都能给出的最好的调试建议是测试每个阶段并隔离问题。确保滤波器输出正确,然后是灰度滤波器,然后是二进制滤波器,最后是反转滤波器


还可以尝试在模拟中运行,在放置FPGA之前可以看到波形中的所有内部信号。一个非常简单的测试环境示例:

您真的有二进制图像(每像素1位)还是简单的黑白图像?我猜从技术上讲它是黑白图像。我进行颜色过滤以找到红色灯光,然后在红色的任何地方,我将三个颜色通道设置为255(白色),而在非0(黑色)的任何地方,您的输入可能不是纯黑色和白色,而是灰色阴影。例如,如果
binary_red
为1(接近黑色),则
inversed_red
将为0(黑色),而不是254(接近白色)。尝试使用
~
运算符进行位反转:ex
赋值反转\u red=~二进制\u red我不确定。我通过首先拍摄灰度图像并在每个像素处检查其值来设置红、绿和蓝的二进制值。如果其灰度值高于100(不是超黑),则将其设置为0,否则将其设置为255。所以我认为所有的值都是0或255,对吗?@Mike:这是错误的方法。您应该编写一个适用于所有可能值(
0-255
)的模块,Greg解决方案是一个很好的方法。@Greg:我继续尝试了,但仍然得到了一个完全黑屏(使用~operator)。@Mike:问题可能不在逆变器模块上。你需要分享更多的代码。找到答案。我也翻转了前后门廊,这使得整个图像变成了黑色。只需将其限制为屏幕上的像素(本例中为640x480)
assign inverted_red = ~binary_red;
assign inverted_green = ~binary_green;
assign inverted_blue = ~binary_blue;