FPGA 图像篇(图像二值化)

595 阅读2分钟

理论基础:

RGB图像呈现彩色,是因为RGB三通道组成的值不同,而图像二值化,是将图像的灰度图的像素值固定在两个灰度值值黑色或者白色。图像二值化作为图像分割,可用于图像预处理。综上所述要将灰度图像值分类需要一个阈值来进行分割,有两种常用的方法。

全局阈值:图像中整个图像的像素都以这个阈值作为标准。 自适应阈值:对于局部受光影响的图像采取全局阈值,很明显效果不好。因此采用局部阈值,它采用滑窗扫描图像,如果滑窗中心像素值大于邻域的像素值,则中心点像素值置1,否则置0。 如下图所示为局部受光的图像,采用全局阈值: image.png

二值化模块设计:

本模块中输入因为灰度图了。 在第一个时钟上升沿到来时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