• python-opencv 之开运算、闭运算、形态学梯度、“礼帽”和“黑帽”


    函数原型

    运行形态学操作的核心函数是morphologyEx。在本例中,我们使用了4个参数(其余使用默认值):

    1. src : 原 (输入) 图像
    2. dst: 输出图像
    3. operation: 需要运行的形态学操作。 我们有5个选项:
      • Opening: MORPH_OPEN : 2
      • Closing: MORPH_CLOSE: 3
      • Gradient: MORPH_GRADIENT: 4
      • Top Hat: MORPH_TOPHAT: 5
      • Black Hat: MORPH_BLACKHAT: 6
    4. kernel: 形态学运算的内核。

    前一节我们讨论了两种最基本的形态学操作:

    • 腐蚀 (Erosion)
    • 膨胀 (Dilation)

    运用这两个基本操作,我们可以实现更高级的形态学变换。

    开运算 (Opening)

    开运算是通过先对图像腐蚀再膨胀实现的。
    在这里插入图片描述
    能够排除小团块物体。

    代码
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
    cv2.imshow("cycle",img)
    
    kernel  = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#开运算: 先腐蚀后膨胀
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭运算:先膨胀后腐蚀
    
    cv2.imshow("opening",opening)
    cv2.imshow("closing",closing)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    原图
    在这里插入图片描述
    开运算
    在这里插入图片描述

    闭运算(Closing)

    闭运算是通过先对图像膨胀再腐蚀实现的。
    在这里插入图片描述
    能够排除小型黑洞(黑色区域)。

    代码

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
    cv2.imshow("cycle",img)
    
    kernel  = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#开运算: 先腐蚀后膨胀
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#闭运算:先膨胀后腐蚀
    
    cv2.imshow("opening",opening)
    cv2.imshow("closing",closing)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    闭运算
    在这里插入图片描述

    形态梯度(Morphological Gradient)

    膨胀图与腐蚀图之差
    在这里插入图片描述
    能够保留物体的边缘轮廓。

    代码
    #梯度运算  = 膨胀 - 腐蚀
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
    kernel  = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
    cv2.imshow("cycle",opening)
    
    kernel = np.ones((5,5),np.uint8)
    gradient = cv2.morphologyEx(opening,cv2.MORPH_GRADIENT,kernel)
    cv2.imshow("gradient",gradient)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    顶帽(Top Hat)

    原图像与开运算结果图之差

    在这里插入图片描述

    代码
    #礼帽 = 原始如输入 - 开运算
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
    cv2.imshow("cycle",img)
    kernel = np.ones((5,5),np.uint8)
    
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
    cv2.imshow("opening",opening)
    
    tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
    cv2.imshow("tophat",tophat)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    黑帽(Black Hat)

    闭运算结果图与原图像之差
    在这里插入图片描述

    代码
    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    
    img =cv2.imread("./cycle.png",cv2.IMREAD_COLOR)
    cv2.imshow("cycle",img)
    #kernel = np.ones((5,5),np.uint8)
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
    cv2.imshow("closing",closing)
    
    blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
    cv2.imshow("blackhat",blackhat)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

  • 相关阅读:
    降温了好冷,总结下11月
    【前端面试必知】对vue中mixin的理解
    ORB-SLAM2 ---- ORBextractor::operator()仿函数
    python接口自动化测试
    C/C++语言100题练习计划 98——最长最短单词
    YOLOv8 C2f模块融合shuffleAttention注意力机制
    【MySQL篇】第一篇——数据库基础
    Nomad 系列-快速上手
    【Filament】立方体贴图(6张图)
    Ssm老年人社区服务平台的设计与实现毕业设计-附源码211711
  • 原文地址:https://blog.csdn.net/qq_38505858/article/details/126832149