美文网首页
OpenCV+Python形态学

OpenCV+Python形态学

作者: 音符纸飞机 | 来源:发表于2018-07-12 18:35 被阅读201次

图像的形态学处理主要用于二值图像,白色部分是主体。

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()
效果图

相关文章

网友评论

      本文标题:OpenCV+Python形态学

      本文链接:https://www.haomeiwen.com/subject/bayrpftx.html