前几篇博客介绍了二值图像的形态学图像处理,本篇博客整理一下灰度形态学的相关图像处理,最后实现基于灰度形态学梯度的边缘检测效果。
一、腐蚀(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.