• opencv 形态学转换


    腐蚀

    腐蚀可以将前景物体的边界腐蚀掉。 卷积核沿着图像滑动,如果与卷积核对应的原图像所有像素值都是1,那么中心元素保持原来的像素值,否则就变为0.

    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('./1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. erosion = cv2.erode(img, kernel, iterations=1)
    7. cv2.imshow('erode', np.hstack((img,erosion)))
    8. cv2.imwrite('img.png',np.hstack((img,erosion)))
    9. cv2.waitKey(0)
    10. cv2.destroyAllWindows()

    观察上图,腐蚀操作其实就是在卷积核内求最小值的操作。 所以这种操作会使白色区域减少,这对于去除白噪声很有用,也可以用来断开两个连在一块的物体。

    膨胀

    与腐蚀相反,与卷积核相应的原图像中的像素值中只要有一个是1,中心元素就是1.所以这个操作会增加图像中的白色区域。

    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. kernel = np.ones((3, 3), np.uint8)
    5. dilation = cv2.dilate(img, kernel, iterations=1)
    6. cv2.imshow('dilation', np.hstack((img,dilation)))
    7. cv2.imwrite('image.png',np.hstack((img,dilation)))
    8. cv2.waitKey(0)
    9. cv2.destroyAllWindows()

    在卷积核内取最大值。这里也可以认为是进行按位或运算 

    开运算 

    cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

    先进行腐蚀在进行膨胀叫做开运算。

    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. # 开运算:先腐蚀再膨胀就叫做开运算。
    7. opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    8. cv2.imshow('opening', np.hstack((img,opening)))
    9. cv2.imwrite('image.png',np.hstack((img,opening)))
    10. cv2.waitKey()

    闭运算

    先膨胀后腐蚀叫做闭运算

     cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. # 先膨胀再腐蚀。它经常 用来填充前景物体中的小洞 或者前景物体上的小黑点。
    7. closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    8. cv2.imshow('opening', np.hstack((img,closing)))
    9. cv2.imwrite('image.png',np.hstack((img,closing)))
    10. cv2.waitKey()

     

    形态学梯度

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

    cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. # 形态学梯度
    7. # 其实就是一幅图像膨胀与腐蚀 的差。
    8. # 结果看上去就像前景物体的轮廓。
    9. gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    10. cv2.imshow('opening', np.hstack((img,gradient)))
    11. cv2.imwrite('image.png',np.hstack((img,gradient)))
    12. cv2.waitKey()

     

    礼帽

    原始图像与开运算的图像差

    cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. # 礼帽
    7. # 原始图像与 开运算之后得到的图像的差。
    8. tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    9. cv2.imshow('opening', np.hstack((img,tophat)))
    10. cv2.imwrite('image.png',np.hstack((img,tophat)))
    11. cv2.waitKey()

     

    黑帽

    闭运算后得到的图像和原始图像的差

    cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    1. import cv2
    2. import numpy as np
    3. img = cv2.imread('1.png', 0)
    4. #您可以将内核看作是一个小矩阵,我们在图像上滑动以进行(卷积)操作,例如模糊,锐化,边缘检测或其他图像处理操作。
    5. kernel = np.ones((5, 5), np.uint8)
    6. # 黑帽
    7. blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    8. cv2.imshow('opening', np.hstack((img,blackhat)))
    9. cv2.imwrite('image.png',np.hstack((img,blackhat)))
    10. 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)
    

  • 相关阅读:
    OPENCV+QT环境配置
    一起Talk Android吧(第三百七十六回:如何使用TabLayout)
    最高薪15k!“转行软件测试后,我想要的生活,就应该是这样!”
    基于Redis的分布式锁 以及 超详细的改进思路
    Spring_AOP的理解
    vue如何实现整体注册组件局部/局部注册组件
    全志V3S嵌入式驱动开发(开发环境再升级)
    PS插件一键轻松搞定电商产品摄影图!
    RestTemplate Message Convert 详解
    技术分享 | 无人驾驶汽车的眼睛
  • 原文地址:https://blog.csdn.net/qq_40107571/article/details/127990372