`1 概述
开运算一般平滑物体的轮廓、断开较窄的狭颈并消除细的突出物。闭运算同样也会平滑轮廓的一部分,但与开操作相反,它通常会弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线的中的断裂。
形态学开运算与闭运算:
形态学开运算就是先对图像进行腐蚀然后在膨胀,表达式即:
形态学闭运算就是先对图像进行膨胀然后在腐蚀,表达式即:
图1 开运算和闭运算演示(原图由美国国家标准和技术研究所提供)
如图1所示,a为噪声图像,b为结构元,c为腐蚀后的图像,d为A的开运算,e为开运算的膨胀,f为开运算的闭运算。f相对于a经过了一系列的形态学运算之后纹理变得更加清晰,只为后期的指纹识别打下基础。
膨胀和腐蚀可与图像相减结合起来得到一幅图像的形态学梯度。
形态学梯度:
灰度图像的膨胀减去灰度图像的腐蚀就是形态学梯度,表达式:
图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');
图3 实验原图
图4 灰度图像
图5 开运算的结果
图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');
图7 梯度0
图8 梯度1
图9 梯度2
3 FPGA实现
图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
结果:
图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
结果:
图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
结果:
图13 FPGA形态学梯度效果
总结:
迄今为止许多形态学的技术都是以灰度级形态学概念为基础。这包括形态学平滑、形态学梯度、顶帽变换、底帽变换、粒度测定和纹理分割等。
`
|