形态学转换是基于图像形状的⼀些简单操作。它通常在⼆进制图像上执⾏。腐蚀和膨胀是两个基本的形态学运算符。然后它的变体形式如开运算,闭运算,礼帽⿊帽等。它需要两个输入,一个是我们的原始图像,第二个是决定操作性质的结构元素或内核。
结构元素
我们可以手动创建了一个结构元素,OpenCV具有一个函数cv.getStructuringElement()。只需传递内核的形状和大小,即可获得所需的内核。
# 矩形内核
kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
# 十字内核
kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))
# 椭圆内核
kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
1、腐蚀
原始图像中的一个像素(无论是1还是0)只有当内核下的所有像素都是1时才被认为是1,否则它就会被侵蚀(变成0)
cv.erode(img,kernel,iterations)
参数:img: 要处理的图像 kernel: 核结构 iterations: 腐蚀的次数,默认是1
2、 膨胀
它与侵蚀正好相反。如果内核下的至少一个像素为“ 1”,则像素元素为“ 1”。
cv.dilate(img,kernel,iterations)
参数:img: 要处理的图像 kernel: 核结构 iterations: 腐蚀的次数,默认是1
def test():
# 矩形内核
kernel = np.ones((5, 5), np.uint8)
kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
# 十字内核
kernel2 = cv.getStructuringElement(cv.MORPH_CROSS, (5, 5))
# 椭圆内核
kernel3 = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5, 5))
img = cv.imread('img_2.png')
# 腐蚀
img1 = cv.erode(img, kernel3, iterations=5)
# 膨胀
img2 = cv.dilate(img, kernel3, iterations=5)
titles = ["原图","腐蚀","膨胀"]
mpl.rcParams['font.family'] = 'SimHei'
for i,img in enumerate([img,img1, img2]):
plt.subplot(1, 3, i + 1), plt.imshow(img, 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
3、开运算
侵蚀然后膨胀,它对于消除噪音很有用。
cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
4、闭运算
闭运算与开运算相反,膨胀然后侵蚀。在关闭前景对象内部的小孔或对象上的小黑点时很有用。
cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
5、形态学梯度
cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
6、顶帽
输入图像和图像开运算之差。
cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
7、 黑帽
输入图像和图像闭运算之差。
cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
def test():
img = cv.imread('cat.jpg',0)
kernel = np.ones((5, 5), np.uint8)
# 开运算
opening = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
# 闭运算
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
# 形态学梯度
gradient = cv.morphologyEx(img, cv.MORPH_GRADIENT, kernel)
# 顶帽
tophat = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
# 黑帽
blackhat = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
titles = ["开运算","闭运算","形态学梯度","顶帽","黑帽"]
mpl.rcParams['font.family'] = 'SimHei'
for i,img in enumerate([opening,closing, gradient,tophat, blackhat]):
plt.subplot(2, 3, i + 1), plt.imshow(img, 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()