3.3 OpenCV形态学运算
形态学运算是指基于形状对图像进行处理,常用的形态学运算方法包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽运算、底帽运算。最基本、最常用的方法就是膨胀与腐蚀,其他方法都是在这两种运算的基础上组合而产生的。
膨胀和腐蚀的用处非常广泛,可以用于噪声消除、图像分割、寻找图像的极大值区域或极小值区域等。
3.3.1 案例6:进行膨胀操作
以结构元素(kernel区域)的最大值填充锚点(kernel区域中心点)的做法为膨胀。
对于如下所示的灰色区域,膨胀操作需要选取其中的最大值作为锚点位置的像素值。因此,类似于中值滤波,膨胀操作也需要两个步骤:
(1)将3×3的kernel区域的像素值按大小顺序进行排序,即40,65,78,146,156,200,201,234,245。
(2)选取步骤(1)中排序的最大值245作为锚点位置的像素值。
OpenCV提供了膨胀操作的函数dilate()。
C++版本对应的函数如下:
Python版本对应的函数如下:
dilate函数对应的参数及其含义如表3.6所示。
表3.6
下面介绍使用dilate函数进行膨胀操作的案例。
进行膨胀操作之后的图像结果如图3.13所示。
图3.13
上面获取膨胀核使用的是getStructuringElement函数,该函数会返回指定形状和尺寸的核矩阵,在形态学运算中具有重要作用。
C++版本对应的函数如下:
Python版本对应的函数如下:
getStructuringElement函数对应的参数及其含义如表3.7所示。
表3.7
shape表示生成的核的形状,OpenCV目前提供三种形状的核,由枚举MorphShapes的值定义。
需要注意的是,shape在MORPH_CROSS情况下对锚点位置有依赖。
3.3.2 案例7:进行腐蚀操作
以结构元素的最小值填充锚点的做法为腐蚀。对于如下所示的灰色区域,腐蚀操作会选取最小的像素值40作为锚点处的像素值。
OpenCV提供了腐蚀操作的函数erode()。
C++版本对应的函数如下:
Python版本对应的函数如下:
erode函数对应的参数及其含义如表3.8所示。
表3.8
下面介绍使用erode函数进行腐蚀操作的案例。
进行腐蚀操作之后的图像结果如图3.14所示。
图3.14
3.3.3 案例8:使用形态学运算
另外的几种形态学运算是开运算、闭运算、形态学梯度、顶帽运算和底帽运算,它们是由膨胀和腐蚀两种操作组合形成的,运算过程如表3.9所示。
表3.9
开运算用于消除毛刺、放大缝隙等。
闭运算用于消除小的黑色区域。
形态学梯度用于保留边缘轮廓。
顶帽运算用于分离比邻近点亮的区域。
底帽的作用和顶帽相反,用于分离亮背景上的暗区域。
OpenCV提供了形态学操作的函数morphologyEx()。
C++版本对应的函数如下:
Python版本对应的函数如下:
morphologyEx对应的参数及其含义如表3.10所示。
表3.10
op表示形态学运算的类型,由枚举MorphTypes的值定义。
下面介绍使用形态学运算的案例。
本案例使用的源图像如图3.1所示,进行腐蚀运算后的图像结果如图3.15所示。
图3.15
进行膨胀运算后的图像结果如图3.16所示。
图3.16
进行开运算后的图像结果如图3.17所示。
图3.17
进行闭运算后的图像结果如图3.18所示。
图3.18
进行形态学梯度后的图像结果如图3.19所示。
图3.19
进行顶帽运算后的图像结果如图3.20所示。
图3.20
进行底帽运算后的图像结果如图3.21所示。
图3.21
在计算机视觉的数据集处理中,经常会使用滤波算法和形态学运算对数据集做增强。