目录
1.1 腐蚀 1.2 膨胀 2 高级形态学转换 3 举例
形态学操作可以分为二值形态学和灰度形态学,灰度形态学由二值形态学扩展而来。数学形态学有2个基本的运算,即腐蚀和膨胀,而腐蚀和膨胀通过结合又形成了开运算和闭运算。
cv2.erode(src, kernel, dst, anchor, iterations, borderType, borderValue)
腐蚀可以使目标区域范围“变小”,其实质造成图像的边界收缩,可以用来消除小且无意义的目标物。
cv2.dilate(src, kernel, dst, anchor, iterations, borderType, borderValue)
粗略地说,膨胀会使目标区域范围“变大”,将于目标区域接触的背景点合并到该目标物中,使目标边界向外部扩张。作用就是可以用来填补目标区域中某些空洞以及消除包含在目标区域中的小颗粒噪声。 膨胀也可以用来连接两个分开的物体。
cv2.morphologyEx(src, op, kernel, dst, anchor, iterations, borderType, borderValue)
开运算: cv2.MORPH_OPEN
先进性腐蚀再进行膨胀就叫做开运算。就像我们上面介绍的那样,它被用 来去除噪声。
闭运算: cv2.MORPH_CLOSE
先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。
形态学梯度: cv2.MORPH_GRADIENT
结果看上去就像前景物体的轮廓。
礼帽: cv2.MORPH_TOPHAT
原始图像与进行开运算之后得到的图像的差。
黑帽: cv2.MORPH_BLACKHAT
进行闭运算之后得到的图像与原始图像的差。
它们与基础形态学转换之间的关系也可表示为:
Opening: dst = open(src, element) = dilate(erode(src, element), element)
Closing: dst = close{src, element) = erode(dilate(src, element), element)
Morphological gradient: dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)
“Top hat”: dst = tophat(src, element) = src - open(src, element)
“Black hat”: dst = blackhat(src, element) = close(src, element) - src
输入图像如下:
开运算,闭运算的输入图像
其他的输入图像:
代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('test17.png')
img1 = cv2.imread('test16.png')
kernel = np.ones((5, 5), np.uint8) # 卷积核
kernel2 = np.ones((10, 10), np.uint8) # 卷积核
erosion = cv2.erode(img, kernel, iterations=1) # 腐蚀
dilation = cv2.dilate(img, kernel, iterations=1) # 膨胀
opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel) # 开运算
closing = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel) # 闭运算
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # 形态学梯度
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel2) # 礼帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel2) # 黑帽
plt.subplot(241), plt.imshow(img), plt.title('Original')
plt.subplot(242), plt.imshow(erosion), plt.title('Erosion')
plt.subplot(243), plt.imshow(dilation), plt.title('Dilation')
plt.subplot(244), plt.imshow(opening), plt.title('Opening')
plt.subplot(245), plt.imshow(closing), plt.title('Closing')
plt.subplot(246), plt.imshow(gradient), plt.title('Gradient')
plt.subplot(247), plt.imshow(tophat), plt.title('Tophat')
plt.subplot(248), plt.imshow(blackhat), plt.title('Blackhat')
plt.show()
结果如下: