基于FPGA形态学开运算、闭运算和梯度的实现 作者:OpenS_Lee 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闭运算效果 形态学梯度源码: //--------------------------------------------- //Morphologicalgradient. //--------------------------------------------- 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 //assignTFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]}; //Y 结果: 图13 FPGA形态学梯度效果 总结: 迄今为止许多形态学的技术都是以灰度级形态学概念为基础。这包括形态学平滑、形态学梯度、顶帽变换、底帽变换、粒度测定和纹理分割等。
|