首页 > 技术文章 > FPGA实现图像的边缘检测:灰度形态学梯度

xianyufpga 2020-03-25 21:10 原文

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

 

一、腐蚀(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.

 

推荐阅读