zoukankan      html  css  js  c++  java
  • 形态学转换

    形态学操作其实就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖",看下图就明白了:

    形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素。腐蚀和膨胀是针对图片中的白色部分!
    二值化图:图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。

    腐蚀

    腐蚀的基本思想:侵蚀前景物体的边界(总是试图保持前景为白色);内核在图像中滑动(如在2D卷积中).只有当内核下的所有像素都是1时,原始图像中的像素(1或0)才会被认为是1,否则它会被侵蚀(变为零).

    边界附近的所有像素都将被丢弃,具体取决于内核的大小.因此,前景对象的厚度或大小减小,或者图像中的白色区域减小.
    有助于消除小的白噪声,分离两个连接的对象。

    腐蚀的效果是把图片"变瘦",其原理是在原图的小区域内取局部最小值。因为是二值化图,只有0和255,所以小区域内有一个是0该像素点就为0:

     腐蚀使用的函数:cv2.ercode()

    代码:

    import cv2
    import numpy as np
    
    img = cv2.imread('test.png', 0)
    kernel = np.ones((5,5), np.uint8)
    erosion = cv2.erode(img, kernel, iterations=1)
    
    cv2.imshow('src',img)
    cv2.imshow('image', erosion)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    结果:

    膨胀

    它恰好与侵蚀相反。 这里,如果内核下的至少一个像素为“1”,则像素元素为“1”. 因此它增加了图像中的白色区域或前景对象的大小增加.
    通常,在去除噪音的情况下,腐蚀之后是膨胀.因为,侵蚀会消除白噪声,但它也会缩小我们的物体,所以我们膨胀它,由于噪音消失了,它们不会再回来,则我们的物体区域会增加。 它也可用于连接对象的破碎部分.

    代码:

    import cv2
    import numpy as np
    
    img = cv2.imread('test.png', 0)
    kernel = np.ones((5,5), np.uint8)
    dilation = cv2.dilate(img, kernel, iterations=1)
    
    cv2.imshow('src', img)
    cv2.imshow('image', dilation)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果:

    开运算

    先进性腐蚀再进行膨胀就叫做开运算。就像我们上面介绍的那样,它被用来去除噪声。这里我们用到的函数是cv2.morphologyEx()。
    代码:

    import cv2
    import numpy as np
    """先进行腐蚀在进行膨胀,使用的函数:cv2.morphologyEx(),有助于消除噪音"""
    img = cv2.imread('test.png', 0)
    kernel = np.ones((5,5), np.uint8)
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    
    cv2.imshow('src',img)
    cv2.imshow('image', opening)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果:

    原图:

    闭运算

    先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。
    代码:

    #先膨胀后腐蚀,用于消除前景对象内的小孔或对象上的小黑点
    import cv2
    import numpy as np
    
    img = cv2.imread('test3.png', 0)
    kernel = np.ones((5,5), np.uint8)
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    
    cv2.imshow('src', img)
    cv2.imshow('show', closing)
    cv2.waitKey(0)

    结果:

    原图:

    形态学梯图

    其实就是一幅图像膨胀与腐蚀的差别。结果看上去就像前景物体的轮廓。

    代码:

    #图像的膨胀和腐蚀之间的差异,结果看起来像目标的轮廓
    import cv2
    import numpy as np
    
    img = cv2.imread('test.png', 0)
    
    kernel = np.ones((5,5), np.uint8)
    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    
    cv2.imshow('src', img)
    cv2.imshow('show', gradient)
    cv2.waitKey(0)

    效果:

    TOP-Hat

    原图像与开运算图的区别,突出原图像中比周围亮的区域

    代码:

    #原图像与开运算图像的区别,突出原图像中比周围亮的区域
    import cv2
    import numpy as np
    
    img = cv2.imread('test.png',0)
    
    kernel = np.ones((5,5), np.uint8)
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    
    cv2.imshow('src', img)
    cv2.imshow('show', tophat)
    cv2.waitKey(0)

    结果:

    Black Hat

    进行闭运算之后得到的图像与原始图像的差。闭运算图 - 原图像,突出原图像中比周围暗的区域

     代码:

    #闭运算图 - 原图像,突出原图像中比周围暗的区域
    import cv2
    import numpy as np
    
    img = cv2.imread('test.png', 0)
    
    kernel = np.ones((5,5), np.uint8)
    balckhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    
    cv2.imshow('src', img)
    cv2.imshow('show', balckhat)
    cv2.waitKey(0)

    效果:

  • 相关阅读:
    Solution -「ARC 101D」「AT4353」Robots and Exits
    Solution -「多校联训」轮回
    Solution -「多校联训」种蘑菇
    Solution -「多校联训」染色
    luoguP4389 完全背包计数
    Js 之notification浏览器桌面通知
    Linux 之shell脚本调用另一个shell脚本
    Linux 之开机自启动脚本
    Js 之简单ajax封装
    PHP 之phpsocket.io客户端主动推送给服务器
  • 原文地址:https://www.cnblogs.com/leoych/p/12120232.html
Copyright © 2011-2022 走看看