基于FPGA形态学开运算、闭运算和梯度的实现

基于FPGA形态学开运算、闭运算和梯度的实现

作者:OpenS_Lee

1 概述

    开运算一般平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。闭运算同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线的中的断裂。

形态学开运算与闭运算:

形态学开运算就是先对图像进行腐蚀然后在膨胀,表达式即:                     

                                      

形态学闭运算就是先对图像进行膨胀然后在腐蚀,表达式即:

                                  

基于FPGA形态学开运算、闭运算和梯度的实现_第1张图片

1 开运算和闭运算演示(原图由美国国家标准和技术研究所提供)

如图1所示,a为噪声图像,b为结构元,c为腐蚀后的图像,dA的开运算,e为开运算的膨胀,f为开运算的闭运算。f相对于a经过了一系列的形态学运算之后纹理变得更加清晰,只为后期的指纹识别打下基础。

膨胀和腐蚀可与图像相减结合起来得到一幅图像的形态学梯度。

形态学梯度:

灰度图像的膨胀减去灰度图像的腐蚀就是形态学梯度,表达式:

                                    

基于FPGA形态学开运算、闭运算和梯度的实现_第2张图片

2 CT扫描头部图像

如图2所示,a为头部CT扫描图像,b为膨胀后的结果,c为腐蚀后的结果,d为形态学梯度。计算图b与图c的差得到图d,图d显示出了区域间的边界被清楚地描绘出来。这与二维微分图像的预期结果相同。

2 matlab实现

基于matlab的形态学开运算以及闭运算源码:

%% image open close

clear all

img_a = imread('flower.bmp');

figure,imshow(img_a);

title('rgb');

img_b = rgb2gray(img_a);

figure,imshow(img_b);

title('gray');

a = [1,1,1;

     1,1,1;

     1,1,1];

 

 img_c = imopen(img_b,a);

 figure,imshow(img_c);

 title('open');

 img_d = imclose(img_b,a);

 figure,imshow(img_d);

 title('close');

基于FPGA形态学开运算、闭运算和梯度的实现_第3张图片 

3 实验原图

基于FPGA形态学开运算、闭运算和梯度的实现_第4张图片

 

4 灰度图像

基于FPGA形态学开运算、闭运算和梯度的实现_第5张图片

 

5 开运算的结果

基于FPGA形态学开运算、闭运算和梯度的实现_第6张图片

 

6 闭运算的结果

基于matlab的形态学梯度源码:

%%gradient

clear all

img_a = imread('flower.bmp');

figure,imshow(img_a);

title('rgb');

img_b = rgb2gray(img_a);

figure,imshow(img_b);

title('gray');

a = [1,1,1;

     1,1,1;

     1,1,1];

img_c = imerode(img_b, a);

figure,imshow(img_c);

title('erode');

img_d = imdilate(img_b, a);

figure,imshow(img_d);

title('dilate');

img_e = img_d -img_c;

figure,imshow(img_e);

title('gradient');

img_f = img_b -img_c;

figure,imshow(img_f);

title('gradient1');

img_g = img_d -img_b;

figure,imshow(img_g);

title('gradient2');

 

基于FPGA形态学开运算、闭运算和梯度的实现_第7张图片

 

7 梯度0

基于FPGA形态学开运算、闭运算和梯度的实现_第8张图片

 

8 梯度1

 

基于FPGA形态学开运算、闭运算和梯度的实现_第9张图片

9 梯度2

3 FPGA实现

 

基于FPGA形态学开运算、闭运算和梯度的实现_第10张图片

10 为整个设计的RTL级电路图

形态学开运算源码:

//--------------------------------

// open

//--------------------------------

erode erode_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(o_hs),

.vs_in(o_vs),

.din(o_y_8b),

.din_valid(o_de),

.dout(erode_out),

.dout_valid(erode_de),

.hs_out(erode_hs),

.vs_out(erode_vs)

);

 

dilate dilate_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(erode_hs),

.vs_in(erode_vs),

.din(erode_out),

.din_valid(erode_de),

.dout(dilate_out),

.dout_valid(TFT_de),

.hs_out(TFT_hs),

.vs_out(TFT_vs)

);

assign TFT_rgb = {dilate_out[7:3],dilate_out[7:2],dilate_out[7:3]};     //Y

结果:

基于FPGA形态学开运算、闭运算和梯度的实现_第11张图片

 

11 FPGA开运算效果

 

形态学闭运算源码:

//--------------------------------

// close

//--------------------------------

dilate dilate_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(o_hs),

.vs_in(o_vs),

.din(o_y_8b),

.din_valid(o_de),

.dout(dilate_out),

.dout_valid(dilate_de),

.hs_out(dilate_hs),

.vs_out(dilate_vs)

);

erode erode_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(dilate_hs),

.vs_in(dilate_vs),

.din(dilate_out),

.din_valid(dilate_de),

.dout(erode_out),

.dout_valid(TFT_de),

.hs_out(TFT_hs),

.vs_out(TFT_vs)

);

assign TFT_rgb = {erode_out[7:3],erode_out[7:2],erode_out[7:3]};     //Y

结果:

基于FPGA形态学开运算、闭运算和梯度的实现_第12张图片

 

12 FPGA闭运算效果

形态学梯度源码:

//---------------------------------------------

//Morphological gradient.

//---------------------------------------------

erode erode_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(o_hs),

.vs_in(o_vs),

.din(o_y_8b),

.din_valid(o_de),

.dout(erode_out),

.dout_valid(TFT_de),

.hs_out(TFT_hs),

.vs_out(TFT_vs)

);

dilate dilate_inst(

      .clk(TFT_clk),

.rst_n(Rst_n),

.hs_in(o_hs),

.vs_in(o_vs),

.din(o_y_8b),

.din_valid(o_de),

.dout(dilate_out),

.dout_valid(),

.hs_out(),

.vs_out()

);

assign dout = dilate_out - erode_out;

assign TFT_rgb = {dout[7:3],dout[7:2],dout[7:3]};     //Y

//assign TFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};     //Y

结果:

基于FPGA形态学开运算、闭运算和梯度的实现_第13张图片

 

13  FPGA形态学梯度效果

总结:

    迄今为止许多形态学的技术都是以灰度级形态学概念为基础。这包括形态学平滑、形态学梯度、顶帽变换、底帽变换、粒度测定和纹理分割等。

推荐阅读:

  《基于FPGA灰度图像的形态学膨胀算法的实现

  《基于FPGA灰度图像的形态学腐蚀

  

 

你可能感兴趣的:(基于FPGA形态学开运算、闭运算和梯度的实现)