形态学操作主要包括腐蚀、膨胀、开运算、闭运算等,在opencv-python中,有相关函数可以满足要求,如cv2.erode(),cv2.dilate(),cv2.morphologyEx()等。形态学操作是根据图像形状进行的简单操作,一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀,它们的变体构成了开运算、闭运算、梯度等,以下图为例逐一介绍。
就像土壤侵蚀一样,腐蚀操作会把前景物体的边界腐蚀掉,如下例所示:
首先对这张图进行腐蚀,代码如下:
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
运行效果为:
可见腐蚀效果比较明显。查看函数说明,如下图所示:
其原理为:找kernel尺寸中图片区域中灰度值最小值,并原图片的中心值替换。我们对其原理进行分析,人为构造一个小维度数组,以此代表一张图像,代码如下所示:
img = np.uint8([[1,2,3,4,5],
[5,4,3,2,1],
[2,4,6,8,10],
[10,8,6,4,2],
[5,10,15,10,5]])
kernel = np.ones((3,3),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)
print('img:', img)
print('erosion:', erosion)
运行结果为:
将原图片图示化,如下图所示:
可见,除了边缘以外的中部像素灰度值,均为以本体为中心3✖️3区域内的最小灰度值。而目标图像边缘的像素值,亦为kernel框大小范围内的最小像素值,只是可选择像素由于边缘效果减少了。
而在实际项目中,腐蚀通常是对二值图像进行操作,二值图像的特点是非黑即白,因此二值图像腐蚀之后的效果为:卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。卷积核内如果有黑色,则中心像素灰度值即被替换为0,卷积核越大,中心像素被替换为0的概率就越大,表现出来的腐蚀效果就越“狠“。
对于膨胀操作,其原理与腐蚀操作正好相反,与卷积核对应的原图像的像素值中只要有一个是 1,中心元素的像素值就是 1。所以这个操作会增加图像中的白色区域(前景)。**从经验上看,一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。**膨胀函数cv2.dilate()的官方说明文档为链接和如下图所示:
公式中的min被替换为了max。膨胀前后的效果为: