• Python机器视觉--OpenCV进阶(核心)--图像的开,闭运算,形态学梯度,顶帽,黑帽运算


    1.图像的开运算与闭运算

    开运算和闭运算都是腐蚀和膨胀的基本应用. 若不了解何为腐蚀膨胀操作的话 请移步:

    形态学概述与图像的腐蚀,膨胀操作与自动获取形态学卷积核(点击即可访问了解)

    1.1 图像的开运算

    在使用腐蚀操作时,在把图像噪点去除的同时,会对图像有缩边的影响,为了防止缩边影响原图像,可以使用开运算操作,既可以去除图像本身的噪点,也可以保留大部分图像的原始状态

    • 开运算 = 腐蚀 + 膨胀 ,即为对图像先进行腐蚀操作,在进行膨胀操作
    • morphologyEx(img, MORPH_OPEN, kernel)
      • MORPH_OPEN 表示形态学的开运算
      • kernel 如果噪点比较多, 会选择大一点的kernel, 如果噪点比较小, 可以选择小点的kernel
    代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./dotj.png')
    
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    
    # 腐蚀
    # dst = cv2.erode(img, kernel, iterations=2)
    
    # # 膨胀
    # dst = cv2.dilate(dst, kernel, iterations=2)
    
    # 直接调用opencv提供的开运算api
    dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, iterations=2)
    
    cv2.imshow('img', np.hstack((img, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    效果如图

    在这里插入图片描述

    1.2 闭运算

    闭运算与开运算类似,闭运算的操作流程为 先对图像进行膨胀操作,在进行腐蚀操作

    • 闭运算 = 膨胀 + 腐蚀
    闭运算代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./dotinj.png')
    
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    
    dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2)
    
    cv2.imshow('img', np.hstack((img, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    效果如图

    在这里插入图片描述

    2.形态学梯度,顶帽,黑帽运算

    形态学梯度,顶帽,黑帽运算都是开运算,闭运算与原图的运算操作.

    2.1形态学梯度

    • 梯度 = 原图 - 腐蚀

    • 腐蚀之后原图边缘变小了, 原图 - 腐蚀 就可以得到腐蚀掉的部分, 即边缘.

    • morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

    • morphologyEx函数的参数只比腐蚀erode函数和膨胀dilate函数多了一个参数op,其他参数名及含义完全一样,在此不重复介绍。

    • op:为形态变换的类型,包括如下取值类型:

      • MORPH_ERODE:腐蚀,当调用morphologyEx使用MORPH_ERODE类型时,与调用腐蚀函数erode效果相同
      • MORPH_DILATE:膨胀,当调用morphologyEx使用MORPH_DILATE类型时,与调用膨胀函数dilate效果相同
      • MORPH_OPEN:开运算,对图像先进行腐蚀再膨胀,等同于dilate(erode(src,kernal)),开运算对图像的边界进行平滑、去掉凸起等
      • MORPH_CLOSE:闭运算,对图像先进行膨胀在腐蚀,等同于erode(dilate(src,kernal)),闭运算用于填充图像内部的小空洞、填充图像的凹陷等
      • MORPH_GRADIENT:梯度图,用膨胀图减腐蚀图,等同于dilate(src,kernal)−erode(src,kernal),可以用于获得图像中物体的轮廓
      • MORPH_TOPHAT:顶帽,又称礼帽,用原图像减去开运算后的图像,等同于src−open(src,kernal),可以用于获得原图像中比周围亮的区域
      • MORPH_BLACKHAT:黑帽,闭运算图像减去原图像,等同于close(src,kernal)−src,可以用于获取原图像中比周围暗的区域
      • MORPH_HITMISS:击中击不中变换,用于匹配处理图像中是否存在核对应的图像,匹配时,需要确保核矩阵非0部分和为0部分都能匹配,注意该变换只能处理灰度图像。
    代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./j.png')
    
    # 注意调节kernel大小以获得更清晰的边缘
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    
    dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel, iterations=1)
    
    cv2.imshow('img', np.hstack((img, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    效果如图

    在这里插入图片描述

    2.2 顶帽运算

    • 顶帽 = 原图 - 开运算
    • 开运算的效果是去除图像外的噪点, 原图 - 开运算就得到了去掉的噪点.
    代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./tophat.png')
    
    # 注意调整kernel以保留小图形
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))
    
    dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)
    
    cv2.imshow('img', np.hstack((img, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.3 黑帽操作

    • 黑帽 = 原图 - 闭运算
    • 闭运算可以将图形内部的噪点去掉, 那么原图 - 闭运算的结果就是图形内部的噪点.
    代码实现
    import cv2
    import numpy as np
    
    img = cv2.imread('./dotinj.png')
    
    # 注意调节kernel大小以获得更清晰的边缘
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
    
    dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)
    
    cv2.imshow('img', np.hstack((img, dst)))
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    效果如图

    在这里插入图片描述

  • 相关阅读:
    Vue-2.3v-model原理
    java计算机毕业设计web家庭财务管理系统MyBatis+系统+LW文档+源码+调试部署
    numpy教程:The NumPy ndarray
    Pytorch实战[使用VGG16实现图片分类]
    PAT 2024年春季(乙级)
    C++学习——构造函数、析构函数
    [C语言 数据结构] 栈
    Addressing Function Approximation Error in Actor-Critic Methods
    Java8实战[1-4]章要义笔记
    asp.net酒店餐饮管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 原文地址:https://blog.csdn.net/qq_43944517/article/details/126812718