数学形态学(Mathematical Morphology),是图像处理过程中一个非常重要的研究方向。形态学主要从图像内提取分量信息,该分量信息通常对于表达和描绘图像的形状具有重要意义,通常是图像理解时所使用的最本质的形状特征。
形态处理在视觉检测、文字识别、医学图像处理、图像压缩编码等领域都有非常重要的应用。
形态学操作主要包含:腐蚀、膨胀、开运算、闭运算、形态学梯度运算、顶帽运算(礼帽运算)、黑帽运算等操作。腐蚀操作和膨胀操作是形态学运算的基础,二者结合就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算。
1.腐蚀
腐蚀是最基本的形态学操作之一,它能够将图像的边界点消除,使图像沿着边界向内收缩。也可以将小于指定结构体元素的部分去除。
腐蚀用来“收缩”或者“细化”二值图像中的前景,借此实现去除噪声、元素分割等功能。在腐蚀过程中,通常使用一个结构元来逐个像素地扫描要被腐蚀的图像,并根据结构元和被腐蚀图像的关系来确定腐蚀结果。
腐蚀操作等形态学操作是逐个元素地来决定值的,每次判定的点都是与结构元中心点所对应的点。
在OpenCV中,使用函数cv2.erode()来实现腐蚀操作。
dst=cv2.erode(src,kernel,anchor=None,iterations=None,borderType=None,borderValue=None)
src: 是需要处理的图像。可以有任意数量的通道。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
kernel: 代表腐蚀操作时所采用的结构类型,它可以自定义,也可以通过cv2.getStructuringElement()生成。
anchor: 锚点,其默认值是(-1,-1),表示当前计算均值的点位于核的中心点位置。
iterations: 是腐蚀操作迭代次数,默认是1.
borderType: 边界样式,决定了以何种方式处理边界。一般用默认值是BORDER_CONSTANT。
borderValue: 是边界值,一般采用默认值。
![](https://img.haomeiwen.com/i15722988/be1c24302f61e497.png)
![](https://img.haomeiwen.com/i15722988/423b62156f38142c.png)
2.膨胀
膨胀操作是形态学中另外一种基本操作。膨胀操作和腐蚀操作是相反的,膨胀操作能对图像的边缘进行扩张。膨胀操作将与当前对象(前景)接触到的背景点合并到当前对象内,从而实现将图像的边界点向外扩张。
如果图像内两个对象的距离较近,那么在膨胀的过程中,两个对象可能会连通在一起。膨胀操作对填补图像分割后图像内所存在的空白很有帮助。
在OpenCV内,采用cv2.dilate()实现膨胀操作:
dst = cv2.dilate(src,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
![](https://img.haomeiwen.com/i15722988/d142b74b45c79c0f.png)
3.通用形态学函数
腐蚀操作和膨胀操作是形态学运算的基础,二者结合就可以实现开运算、闭运算、形态学梯度运算、顶帽运算、黑帽运算、击中击不中等不同形式的运算
OpenCV提供了函数cv2.morphologyEX()来实现上述形态学运算。
dst = cv2.morphologyEx(src,op,kernel[,anchor[,iterations[,borderType[,borderValue]]]])
dst: 经形态学处理后得到的图像和原始图像有相同的大小和类型。
src: 是需要处理的图像。可以有任意数量的通道。图像深度应该是CV_8U、CV_16U、CV_16S、CV_32F或者CV_64F中的一种。
op: 代表操作类型,如下说明:
![](https://img.haomeiwen.com/i15722988/be9afe2e08320bbc.png)
4.开运算
开运算进行的操作是先将图像腐蚀,在对腐蚀的结果进行膨胀。开运算可以用于去噪、计数等等。
![](https://img.haomeiwen.com/i15722988/897fe02633b2e6af.png)
5.闭运算
闭运算是先膨胀后腐蚀的运算。它有助于关闭前景物体内部的小孔,或去除物体上的小黑点。还可以将不同的前景图像进行连接。
![](https://img.haomeiwen.com/i15722988/133967928f524b9d.png)
运行结果:
![](https://img.haomeiwen.com/i15722988/f47be4b27a1c5da8.png)
6.形态学梯度运算
形态学运算是用图像的膨胀运算减去图像的腐蚀运算的操作,该操作可以获取图像中前景图像的边缘。设置op=cv2.MORPH_GRADIENT
![](https://img.haomeiwen.com/i15722988/80d20a3d60f69ede.png)
运行结果:可以看到几乎得到了j的边缘。
![](https://img.haomeiwen.com/i15722988/feb0693a8e8aee3d.png)
7.礼帽运算
礼帽运算是用原始图像减去其开运算图像的操作。礼帽运算能获取图像的噪声信息,或者得到比原始图像的边缘更亮的边缘信息。通过设置op=cv2.MORPH_TOPHAT实现。
例如:
![](https://img.haomeiwen.com/i15722988/bbcd229344436738.png)
运行结果:
![](https://img.haomeiwen.com/i15722988/b516b949c4095f89.png)
8.黑帽运算
黑帽运算是用闭运算减去原始图像的操作。黑帽运算能够获取图像内部的小孔,或者前景色中的小黑点,或者得到比原始图像的边缘更暗的边缘部分。
例如:
![](https://img.haomeiwen.com/i15722988/98e65f20d97f976f.png)
运行结果:
![](https://img.haomeiwen.com/i15722988/f32ddc237592f07a.png)
9.核函数
在进行形态学操作时,必须使用一个特定的核(结构元)。该核可以自定义生成,也可以通过函数构造:
retval = cv2.getStructuringElement(shape,ksize [,anchor])
该函数返回一个用于形态学操作的结构元素,其中参数shape来指定核的形状(矩形、十字形、椭圆形);ksize指定核的大小;anchor代表核中的锚定点位置,默认值是(-1,-1),是形状的中心。
例如:
![](https://img.haomeiwen.com/i15722988/398233d26111694e.png)
运行结果:
![](https://img.haomeiwen.com/i15722988/5d8b2ad5e7705a90.png)
![](https://img.haomeiwen.com/i15722988/e738b485c4eaadfc.png)
网友评论