形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。
膨胀:减少亮区; 腐蚀:扩大亮区
腐蚀
这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。
实现原理:卷积核B沿着图像A滑动,并将B所对应的最小值赋值给A像素中心点。
对于二值图像,如果与卷积核对应的原图像的所有像素值都是 1,那么中心元素就保持原来的像素值,否则就变为零。
代码:
1 import numpy as np
2 import cv2
3 from matplotlib import pyplot as plt
4
5 # 灰度模式读取图像
6 img = cv2.imread("../image/girl.jpg", cv2.IMREAD_GRAYSCALE)
7
8 # 生成深度为8的卷积核
9 kernel = np.ones((5, 5), np.uint8)
10
11 # iterations表示迭代的次数
12 erosion = cv2.erode(img, kernel, iterations=1)
13
14 plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
15 plt.subplot(122), plt.imshow(erosion, cmap="gray"), plt.title("Erosion")
16 plt.show()
结果:
一般灰度图 转成二值图像:
膨胀
实现原理:卷积核B沿着图像A滑动,并将B所对应的最大值赋值给A像素中心点。
对于二值图像,如果与卷积核对应的原图像只要有一个像素值是 1,那么中心元素就为1。
代码:
1 dilation = cv2.dilate(img, kernel, iterations=1)
结果:
一般灰度图: 转换成二值图像:
开运算
对图像进行先腐蚀再膨胀,主要用来出去图像中的白噪声,也可以将图像中两个粘在一起的物体分开。
函数是 cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
代码:
1 import numpy as np
2 import cv2
3 from matplotlib import pyplot as plt
4
5 # 灰度模式读取图像
6 img = cv2.imread("../image/erosion.jpg", cv2.IMREAD_GRAYSCALE)
7 # ret, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
8
9 # 生成深度为8的卷积核
10 kernel = np.ones((5, 5), np.uint8)
11
12 # cv2.MORPH_OPEN表示开运算
13 opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
14
15 plt.subplot(121), plt.imshow(img, cmap="gray"), plt.title("Original")
16 plt.subplot(122), plt.imshow(opening, cmap="gray"), plt.title("Opening")
17 plt.show()
结果:
闭运算
先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。
代码:
# cv2.MORPH_CLOSE表示闭运算 close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
结果:
形态学梯度
它是膨胀与腐蚀的差,该操作能描述图像亮度变化的剧烈程度。当我们想突出高亮区域的外围时,通常可以使用形态学梯度,因为从原区域的膨胀中减去了原区域的收缩,所以留下了图像的外围边缘
代码:
# cv2.MORPH_GRADIENT 表示形态学梯度 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
结果:
礼貌、黑帽
礼貌操作时原始图像与进行开运算后的图像的差。
黑帽操作是进行闭运算得到的图像与原始图像的差
开运算带来的结果是放大裂缝或局部低亮度区域,因此A - Open(A)可以突出比A周围的区域更明亮的区域,并跟核的大小相关;相反,黑帽操作则能突出比A的周围区域黑暗的区域
代码:
# cv2.MORPH_TOPHAT 表示礼貌操作 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # cv2.MORPH_BLACKHAT 表示黑帽 # gradient = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
结果:
礼貌: 黑帽:
OpenCV-形态学转换-腐蚀、膨胀、开运算、闭运算、形态学梯度
原文:https://www.cnblogs.com/bingma/p/11219591.html