图像的形态学处理主要用于二值图像,白色部分是主体。
Erosion 腐蚀
算法:
一个固定大小的kernel,在一个二值图上逐点移动并进行比较kernel中的所有黑色点与它对应的图像素点完全相同,该点为黑色,否则为白色。
实际效果:用一个固定大小的橡皮擦,沿着图像所有边缘擦一圈(白色区域缩小)
erosion = cv2.erode(img, kernel, iterations=None)
# iterations 橡皮擦拭次数
Dilation 膨胀
如果kernel中只要有一个及以上黑色点与它对应的图像素点相同,该点为黑色,否则为白色。
实际效果:白色区域扩张变大
dilation = cv2.dilate(img, kernel, iterations=None)
Opening
先膨胀后腐蚀,效果是消除噪声,去白。
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
Closing
先腐蚀后膨胀,效果是消除物体中的小黑点,去黑。
closing = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
形态学梯度
膨胀-腐蚀
顶帽算法
原图像-Opening
顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的时候,可以用顶帽运算进行背景提取。
黑帽算法
Closing-原图像
黑帽运算用来分离比邻近点暗一些的斑块。
实例
kernel = np.ones((3, 3), np.uint8)
img = cv2.imread('laugh.jpg', cv2.IMREAD_GRAYSCALE)
img = cv2.bilateralFilter(img, 21, 75, 75)
img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 91, 0)
erosion = cv2.erode(img, kernel)
dilation = cv2.dilate(img, kernel)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
morph_gradient = dilation - erosion
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
titles = ["Binary", "erosion", "dilation", "opening", "closing", "tophat", "blackhat", "gradient"]
imgs = [img, erosion, dilation, opening, closing, tophat, blackhat, morph_gradient]
for i in range(8):
plt.subplot(3, 3, i + 1), plt.imshow(imgs[i], cmap='gray'), plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
![](https://img.haomeiwen.com/i11864412/ce46734cf1da2389.png)
网友评论