试图反转二进制图像给我全黑屏

时间:2014-11-20 20:32:28

标签: 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]   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  Greyscale_Filter    (
    input       [7:0]   filtered_red,
    input       [7:0]   filtered_green,
    input       [7:0]   filtered_blue,
    output  [7:0]   greyscale_red,
    output  [7:0]   greyscale_green,
    output  [7:0]   greyscale_blue);

    assign greyscale_red = (filtered_red != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 0;
    assign greyscale_green = (filtered_green != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 0;
    assign greyscale_blue = (filtered_blue != 0) ? (299*filtered_red/1000)+(587*filtered_green/1000)+(114*filtered_blue/1000) : 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)
                    );

1 个答案:

答案 0 :(得分:1)

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

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

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

到目前为止显示的所有内容都是针对单个像素,而不是整个阵列。此时任何人都可以提供的最佳调试建议是测试每个阶段并隔离问题。确保滤波器给出正确的输出,然后是灰度滤波器,然后是二进制滤波器,最后是倒置滤波器。

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