理论基础:
RGB图像呈现彩色,是因为RGB三通道组成的值不同,而图像二值化,是将图像的灰度图的像素值固定在两个灰度值值黑色或者白色。图像二值化作为图像分割,可用于图像预处理。综上所述要将灰度图像值分类需要一个阈值来进行分割,有两种常用的方法。
全局阈值:图像中整个图像的像素都以这个阈值作为标准。
自适应阈值:对于局部受光影响的图像采取全局阈值,很明显效果不好。因此采用局部阈值,它采用滑窗扫描图像,如果滑窗中心像素值大于邻域的像素值,则中心点像素值置1,否则置0。
如下图所示为局部受光的图像,采用全局阈值:
二值化模块设计:
本模块中输入因为灰度图了。 在第一个时钟上升沿到来时grey_data_in变为高电平,同时ans=0,故ans延迟grey_data_in一拍。 而第二个时钟上升沿到来时,grey_data_in为第一次到来的值。 因此输出信号有效需要延迟输入信号有效一拍,因此借助寄存器实现延迟一拍,当第一个时钟上升沿到来时输入信号有效,当第二个时钟上升沿到来时输出信号有效。
代码实现
module binarization(clk,rst_n,gray_data_vaild,grey_data_in)
input clk,rst_n;
input gray_data_vaild;
input [7:0]grey_data_in;
output binary_data_vaild;
output [7:0]binary_data_out;
parameter THRSEHOLD = 8'd127; //二值化全局阈值
//定义寄存器存储输出有效信号,定义寄存器存储状态
reg grey_data_vaild_d;
reg ans; //存储二值化值
assign binary_data_vaild = grey_data_vaild_d;
assign binary_data_out = {8{ans}};
//二值化
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
ans <= 1'b0;
else if(grey_data_in >THRSEHOLD)
ans <= 1'b1;
else
ans <= 1'b0;
end
//输出信号控制,使得输出信号延迟一拍输入有效信号
always@(posedge clk or negedge rst_n) begin
if(!rst_n)
grey_data_vaild_d <= 1'b0;
else
grey_data_vaild_d <= grey_data_vaild;
endmodule