腐蚀可以将前景物体的边界腐蚀掉。 卷积核沿着图像滑动,如果与卷积核对应的原图像所有像素值都是1,那么中心元素保持原来的像素值,否则就变为0.
import cv2
import numpy as np
img = cv2.imread('./1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erode', np.hstack((img,erosion)))
cv2.imwrite('img.png',np.hstack((img,erosion)))
cv2.waitKey(0)
cv2.destroyAllWindows()
观察上图,腐蚀操作其实就是在卷积核内求最小值的操作。 所以这种操作会使白色区域减少,这对于去除白噪声很有用,也可以用来断开两个连在一块的物体。
与腐蚀相反,与卷积核相应的原图像中的像素值中只要有一个是1,中心元素就是1.所以这个操作会增加图像中的白色区域。
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
kernel = np.ones((3, 3), np.uint8)
dilation = cv2.dilate(img, kernel, iterations=1)
cv2.imshow('dilation', np.hstack((img,dilation)))
cv2.imwrite('image.png',np.hstack((img,dilation)))
cv2.waitKey(0)
cv2.destroyAllWindows()
在卷积核内取最大值。这里也可以认为是进行按位或运算
cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
先进行腐蚀在进行膨胀叫做开运算。
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# 开运算:先腐蚀再膨胀就叫做开运算。
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', np.hstack((img,opening)))
cv2.imwrite('image.png',np.hstack((img,opening)))
cv2.waitKey()
先膨胀后腐蚀叫做闭运算
cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# 先膨胀再腐蚀。它经常 用来填充前景物体中的小洞 或者前景物体上的小黑点。
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('opening', np.hstack((img,closing)))
cv2.imwrite('image.png',np.hstack((img,closing)))
cv2.waitKey()
其实就是一幅图像膨胀和腐蚀的差,结果看上去就像前景物体的轮廓
cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# 形态学梯度
# 其实就是一幅图像膨胀与腐蚀 的差。
# 结果看上去就像前景物体的轮廓。
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('opening', np.hstack((img,gradient)))
cv2.imwrite('image.png',np.hstack((img,gradient)))
cv2.waitKey()
原始图像与开运算的图像差
cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# 礼帽
# 原始图像与 开运算之后得到的图像的差。
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('opening', np.hstack((img,tophat)))
cv2.imwrite('image.png',np.hstack((img,tophat)))
cv2.waitKey()
闭运算后得到的图像和原始图像的差
cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
import cv2
import numpy as np
img = cv2.imread('1.png', 0)
#您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
kernel = np.ones((5, 5), np.uint8)
# 黑帽
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('opening', np.hstack((img,blackhat)))
cv2.imwrite('image.png',np.hstack((img,blackhat)))
cv2.waitKey()
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)