资讯详情

FPGA实现图像二值形态学滤波——腐蚀膨胀

一、二值图像

二值图像(Binary Image)指图像上的每个像素只有两个可能的值或灰度等级状态。简而言之,图像中只有两个灰度等级0或255(黑或白).

二、形态学

形态学,即数学形态学(Mathematical Morphology),它是图像处理中应用最广泛的技术之一,主要用于从图像中提取有意义的图像重量,如边界和连接区域,以便于后续别。

:边缘检测、孔填充、纹理分析、形状骨架提取、形状识别、图像分割、角提取、图像恢复与重建、图像压缩等。

基本的算法:膨胀腐蚀,开闭操作;

先腐蚀后膨胀的过程称为开操作。它可以消除小物体,在细处分离物体,平滑大物体的边界。 先膨胀后腐蚀的过程称为闭操作。它可以填充物体中的小空洞,连接相邻物体和光滑边界。

:在图像中移动结构元素(滤波窗口),然后将结构元素与下面的二值图像并行集合。因此,这种二值算法可以转换为集合逻辑操作,简单,适用于并行处理,本文采用硬件FPGA实现。

三、腐蚀膨胀

腐蚀膨胀,输入图像必须是二值图像,各种功能可以通过腐蚀膨胀操作实现,如: (1)抑制噪音 (2)分割独立元素 (3)连接相邻元素 (4)在图像中找到明显的极大值和极小值区域 (5)图像梯度

腐蚀膨胀的原理

腐蚀(Erode)对于局部最小值的操作,可以消除边界点,使边界向内收缩,从而消除小而无意义的物体。 以 3x3 模板为例,1 代表白色,0代表黑色。 腐蚀就是用这3*3.窗口遍历二值图像上的每个像素,窗口中的9个像素相与运算,结果为 1 则输出为 1,否则为0。 在这里插入图片描述

膨胀(Dialate)是局部最大值的操作,可以将与物体接触的所有背景点合并到物体中,使边界向外扩展,从而填补物体的空洞。 膨胀即这 9 像素相或。 注:如果背景和图像的颜色交换(0表示白色,1表示黑色),则只需颠倒图像膨胀和腐蚀的和或操作。

四、matlab腐蚀膨胀

clc; clear all; close all;  RGB = imread(二值化图像.bmp');                %读图 [ROW,COL, DIM] = size(RGB);              获得图像行列数的% %------------------------------< Erode >----------------------------------- Erode_img = zeros(ROW,COL); for r = 2:ROW-1     for c = 2:COL-1         and1 = bitand(RGB(r-1, c-1), bitand(RGB(r-1, c), RGB(r-1, c 1)));         and2 = bitand(RGB(  r, c-1), bitand(RGB(  r, c), RGB(  r, c 1)));         and3 = bitand(RGB(r 1, c-1), bitand(RGB(r 1, c), RGB(r 1, c 1)));         Erode_img(r, c) = bitand(and1, bitand(and2, and3));     end end %------------------------------
       
        < Dilate 
        >---------------------------------- Dilate_img 
        = zeros
        (ROW,COL
        )
        ; 
        for r 
        = 
        2:ROW-1 
        for c 
        = 
        2:COL-1 or1 
        = bitor
        (RGB
        (r-1, c-1
        ), bitor
        (RGB
        (r-1, c
        ), RGB
        (r-1, c+1
        ))
        )
        ; or2 
        = bitor
        (RGB
        ( r, c-1
        ), bitor
        (RGB
        ( r, c
        ), RGB
        ( r, c+1
        ))
        )
        ; or3 
        = bitor
        (RGB
        (r+1, c-1
        ), bitor
        (RGB
        (r+1, c
        ), RGB
        (r+1, c+1
        ))
        )
        ; Dilate_img
        (r, c
        ) 
        = bitor
        (or1, bitor
        (or2, or3
        ))
        ; end end %------------------------------
        < show 
        >------------------------------------ figure
        ; imshow
        (RGB
        )
        ; title
        (
        '原图'
        )
        ; subplot
        (
        2,2,1
        )
        ; imshow
        (Erode_img
        )
        ; title
        (
        '腐蚀'
        )
        ; imwrite 
        (Erode_img,
        'Erode_img.bmp'
        )
        ; subplot
        (
        2,2,2
        )
        ; imshow
        (Dilate_img
        )
        ;title
        (
        '膨胀'
        )
        ; imwrite 
        (Dilate_img,
        'Dilate_img.bmp'
        )
        ; 
       

五、FPGA实现腐蚀

二值化模块、3*3窗口生成模块、腐蚀模块

verilog实现二值化

module two(
    input            clk,
    input            rst_n,
	 
    input   wire		iValid,

	 input [7:0]  iData,
	 output  reg out_Valid,
    output reg  [7:0]oData_two   
);

 parameter THRESHOLD = 8'd150; //二值化的阈值 always @ (posedge clk or negedge rst_n) if(!rst_n) oData_two <= 0; else if (iData > THRESHOLD) oData_two <= 8'd255;
	 else
	     oData_two <= 0;
		  
always @ (posedge clk or negedge rst_n)
    if(!rst_n)
	     out_Valid <= 0;
	 else 
	     out_Valid <= iValid;
endmodule

verlog实现腐蚀

module Erode(
    input            clk,
    input            rst_n,
	 
    input   wire		iValid					,

    input   [7:0]     filter_11,filter_12,filter_13, //生成的3*3窗口数据
    input   [7:0]     filter_21,filter_22,filter_23,
    input   [7:0]     filter_31,filter_32,filter_33,

    output  			 Erode_de    ,//de同步信号
	 
    output  wire  [7:0]    Erode_data  

);

reg [1:0]           de_shift1 ;  


reg  g1,g2,g3,g;


//---------------------------------------------------
//                   腐蚀算法的流水并行运算
//---------------------------------------------------

//clk1,进行所有行的与运算 , &&逻辑与

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	     g1 <= 1'b0; g2 <= 1'b0;
		  g3 <= 1'b0; end else begin g1 <= filter_11 && filter_12 && filter_13; g2 <= filter_21 && filter_22 && filter_23; g3 <= filter_31 && filter_32 && filter_33; end //clk2,每行与运算的结果再次与运算 always @ (posedge clk or negedge rst_n) if(!rst_n) g <= 1'b0;

	 else 
	     g <= g1 && g2 && g3;
		  	  
assign 	Erode_data =  g ? 8'd255 : 8'd0;

// 打拍做同步

    always @(posedge clk or  negedge rst_n) begin
        if(!rst_n)begin
            de_shift1   <=  2'b0;
				
				end
        else begin
            de_shift1 <= { 
        de_shift1[0], iValid};
				end
    end

    assign Erode_de   = de_shift1[1];


  endmodule

可看到此时窗口中九个像素进行相与操作, 下一个clk计算出g1,g2,g3,均为高电平,下一clk计算出g,为高电平,因此可输出255。同理g为低电平输出0。

六、FPGA实现膨胀

和腐蚀相同,不同在于是进行或运算,核心代码如下:

//clk1,进行所有行的或

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	      g1 <= 1'b0; g2 <= 1'b0;
		  g3 <= 1'b0; end else begin g1 <= filter_11 || filter_12 || filter_13; g2 <= filter_21 || filter_22 || filter_23; g3 <= filter_31 || filter_32 || filter_33; end //clk2,每行与运算的结果再次或运算 always @ (posedge clk or negedge rst_n) if(!rst_n) g <= 1'b0;

	 else 
	     g <= g1 || g2 || g3;
		  

	  
assign 	Erode_data =  g ? 8'd255 : 8'd0;

FPGA实现腐蚀膨胀的效果图如下: 左:腐蚀 右:膨胀

七、先膨胀后腐蚀的RTL框图:

这里比较简单,就是上述模块之间的互相连接,代码不再赘述。 同样的,我们也可以先腐蚀后膨胀。 最终,将腐蚀、膨胀,先膨胀后腐蚀的FPGA实现效果进行对比:

标签: d150steel连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台