OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)

  • 腐蚀
    就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在一块的物体等
import cv2
import numpy as np
#腐蚀
img = cv2.imread('str.jpg')
ret,binary = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
kernel_1 = np.ones((5,5),dtype=np.uint8)
erosion1 = cv2.erode(binary,kernel_1,iterations=1)
plt.subplot(121),plt.imshow(binary),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(erosion1),plt.title('Eroded1')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第1张图片

  • 膨胀
    这个操作会增加图像中的白色区域(前景)。一般在去噪声时先用腐蚀再用膨胀。因为腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。膨胀也可以用来连接两个分开的物体。
#膨胀
kernel_1 = np.ones((5,5),dtype=np.uint8)
dilation1 = cv2.dilate(binary,kernel_1,iterations=1)
plt.subplot(121),plt.imshow(binary),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(dilation1),plt.title('Dilated1')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第2张图片

  • 开运算
    先进性腐蚀再进行膨胀就叫做开运算。腐蚀在去掉白噪声的同时,也会使前景对象变小。所以我们再对他进行膨胀。这时噪声已经被去除了,不会再回来了,但是前景还在并会增加。
## 开运算(先腐蚀,后膨胀)
opening = cv2.morphologyEx(binary2,cv2.MORPH_OPEN,kernel_1)
plt.subplot(121),plt.imshow(binary2),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(opening),plt.title('Open')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第3张图片

  • 闭运算
    先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。
## 闭运算(先膨胀后腐蚀)
closing = cv2.morphologyEx(binary3,cv2.MORPH_CLOSE,kernel_1)
plt.subplot(121),plt.imshow(binary3),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(closing),plt.title('Close')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第4张图片

  • 形态学梯度
    一幅图像膨胀与腐蚀的差,结果看上去就像前景物体的轮廓。
## 形态学梯度
gradient = cv2.morphologyEx(binary,cv2.MORPH_GRADIENT,kernel_1)
plt.subplot(121),plt.imshow(binary),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(gradient),plt.title('Gradient')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第5张图片

  • 礼帽
    礼帽 = 原图像-开运算图像,得到的是噪声图像。
## 礼帽
kernel_2 = np.ones((9,9),dtype=np.uint8)
tophat = cv2.morphologyEx(binary2,cv2.MORPH_TOPHAT,kernel_2)
plt.subplot(121),plt.imshow(binary2),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(tophat),plt.title('Tophat')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第6张图片

  • 黑帽
    黑帽 = 闭运算图片 - 原始图片,得到图像内部的小孔,或者背景色中的小黑点。
## 黑帽
kernel_2 = np.ones((9,9),dtype=np.uint8)
blackhat = cv2.morphologyEx(binary3,cv2.MORPH_BLACKHAT,kernel_2)
plt.subplot(121),plt.imshow(binary3),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blackhat),plt.title('Blachat')
plt.xticks([]), plt.yticks([])
plt.show()

OpenCV-Python官方教程-09-形态学转换(腐蚀,膨胀,开闭运算,礼帽,黑帽,形态学梯度运算)_第7张图片

  • 结构化元素
    在前面的例子中我们使用 Numpy 构建了结构化元素,它是正方形的。但 有时我们需要构建一个椭圆形/圆形的核。为了实现这种要求,需要函数cv2.getStructuringElement()。你只需要告诉他你需要的核的形状和大小。
## 结构化元素
# Rectangular Kernel
cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]], dtype=uint8)

# Elliptical Kernel
cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))

array([[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0]], dtype=uint8)

# Cross-shaped Kernel
cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))

array([[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0],
[1, 1, 1, 1, 1],
[0, 0, 1, 0, 0],
[0, 0, 1, 0, 0]], dtype=uint8)


形态学算法原理:https://blog.csdn.net/Galen_xia/article/details/103461651
图像添加椒盐噪声:https://blog.csdn.net/Galen_xia/article/details/108511120

你可能感兴趣的:(经典图像处理,Opencv,图像形态学操作,结构化元素)