Image 尝试反转二值图像会给我带来全黑屏
我有一个黑白图像,我想反转(黑色到白色,白色到黑色),其中黑色=0,白色=255。我试图使用下面的代码,但它没有反转我的图像,而是使整个屏幕变黑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
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;