FPGA实现图像的边缘检测:灰度形态学梯度

您所在的位置:网站首页 灰度图像的灰度值 FPGA实现图像的边缘检测:灰度形态学梯度

FPGA实现图像的边缘检测:灰度形态学梯度

2023-04-20 18:04| 来源: 网络整理| 查看: 265

  前几篇博客介绍了二值图像的形态学图像处理,本篇博客整理一下灰度形态学的相关图像处理,最后实现基于灰度形态学梯度的边缘检测效果。

 

一、腐蚀(Erode)

  灰度形态学腐蚀,即求局部最小值。以 3x3 模板为例,即找出该模板的最小值作为输出即可。

  通过灰度形态学腐蚀,图像中的高亮区域被腐蚀掉了,类似于“领域被蚕食”。可以预见的是腐蚀过后的图像将会拥有比原图更小的高亮区域,亮度会有所下降。同时,腐蚀操作还会连通相邻的比较暗的区域。这无疑对小尺寸的高亮区域识别是有益的。

  Verilog代码类似中值滤波,sort是一个排序模块,在中值滤波的博客中已经给出。

//========================================================================== //== 腐蚀,求出局部最小值 //========================================================================== //每行像素降序排列,clk1 //--------------------------------------------------- //第1行 sort u1 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_11 ), .data2 (matrix_12 ), .data3 (matrix_13 ), .max_data (max_data1 ), .mid_data (mid_data1 ), .min_data (min_data1 ) ); //第2行 sort u2 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_21 ), .data2 (matrix_22 ), .data3 (matrix_23 ), .max_data (max_data2 ), .mid_data (mid_data2 ), .min_data (min_data2 ) ); //第3行 sort u3 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_31 ), .data2 (matrix_32 ), .data3 (matrix_33 ), .max_data (max_data3 ), .mid_data (mid_data3 ), .min_data (min_data3 ) ); //三行的最小值取最小值,clk2 //--------------------------------------------------- //min-max sort u4 ( .clk (clk ), .rst_n (rst_n ), .data1 (min_data1 ), .data2 (min_data2 ), .data3 (min_data3 ), .max_data ( ), .mid_data ( ), .min_data (min_min_data ) ); assign erode_data = min_min_data;

 

二、膨胀(Dilate)

  灰度形态学膨胀,即求局部最大值。以 3x3 模板为例,即找出该模板的最大值作为输出即可。

  通过灰度形态学膨胀,图像中的高亮区域逐渐增长,类似于“领域扩展”。可以预见的是膨胀过后的图像将会拥有比原图更大的高亮区域,亮度会有所增加。同时,腐蚀操作还会连通相邻的比较亮的区域。通过膨胀我们可以将图像中的裂缝得以填补。例如,破镜子照片通过膨胀可以恢复出完整的样子。

  Verilog代码类似中值滤波,sort是一个排序模块,在中值滤波的博客中已经给出。

//========================================================================== //== 腐蚀,求出局部最大值 //========================================================================== //每行像素降序排列,clk1 //--------------------------------------------------- //第1行 sort u1 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_11 ), .data2 (matrix_12 ), .data3 (matrix_13 ), .max_data (max_data1 ), .mid_data (mid_data1 ), .min_data (min_data1 ) ); //第2行 sort u2 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_21 ), .data2 (matrix_22 ), .data3 (matrix_23 ), .max_data (max_data2 ), .mid_data (mid_data2 ), .min_data (min_data2 ) ); //第3行 sort u3 ( .clk (clk ), .rst_n (rst_n ), .data1 (matrix_31 ), .data2 (matrix_32 ), .data3 (matrix_33 ), .max_data (max_data3 ), .mid_data (mid_data3 ), .min_data (min_data3 ) ); //三行的最大值取最大值,clk2 //--------------------------------------------------- //min-max sort u4 ( .clk (clk ), .rst_n (rst_n ), .data1 (max_data1 ), .data2 (max_data2 ), .data3 (max_data3 ), .max_data (max_max_data ), .mid_data ( ), .min_data ( ) ); assign dilate_data = max_max_data;

 

三、开运算(Open)和闭运算(Close)

  和二值形态学的开闭运算完全一样。

  开运算:先腐蚀后膨胀。常用于去除较小的高灰度区域,图像的整体灰度基本保持不变。

  闭运算:先膨胀后腐蚀。常用于去除图像中的暗细节部分,相对地保留高灰度部分不受影响。

 

四、顶帽变换(top-hat)和底帽变换(bottom-hat)

  二者都常用于处理光照不均的图像。

  顶帽变换:原图像 - 开运算。用于暗背景上的亮物体,又称为白顶帽变换。

  底帽变换:闭运算 - 原图像。用于亮背景上的暗物体,又称为黑底帽变换。

 

五、灰度形态学梯度(Morphological Gradient)

  灰度形态学梯度,即:膨胀 - 腐蚀。

  膨胀粗化一幅图像中的区域, 而腐蚀则细化它们。膨胀和腐蚀的差强调了区域间的边界。同质区域不受影响(只要SE相对较小),因此相减操作趋于消除同质区域。最终结果是是边缘被增强而同质区域的贡献被抑制掉了的图像,从而产生“类似于微分”(梯度)的效果。

assign data = dilate_data - erode_data;

  灰度形态学梯度最后呈现的效果类似边缘检测,比较酷炫。

   这种边缘检测效果具有层次感,但线条略暗。截图看起来很普通,实际视频效果是非常惊艳的。

 

 参考资料:

[1] OpenS Lee:FPGA开源工作室(公众号)

[2] Rafael C.Gonzalez、Richard E.Woods著,阮秋琦、阮宇智等译.数字图像处理(第三版).电子工业出版社.2013.

[3] 牟新刚、周晓、郑晓亮.基于FPGA的数字图像处理原理及应用[M]. 电子工业出版社,2017.

[4] 张铮, 王艳平, 薛桂香. 数字图像处理与机器视觉[M]. 人民邮电出版社, 2010.

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3