前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于FPGA形态学开运算、闭运算和梯度的实现

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

作者头像
FPGA开源工作室
发布2019-10-29 10:58:40
1.1K0
发布2019-10-29 10:58:40
举报
文章被收录于专栏:FPGA开源工作室FPGA开源工作室

基于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闭运算效果

形态学梯度源码:

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

//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形态学梯度效果

总结:

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

推荐阅读:

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档