深度学习计算机视觉实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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

在计算机视觉的数据集处理中,经常会使用滤波算法和形态学运算对数据集做增强。