• python --opencv图像处理(图像腐蚀与图像膨胀)


    理论

    图像的腐蚀( Erosion )和膨胀( Dilation )是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。

    又出来新名词了:形态学

    图像处理中指的形态学,往往表示的是数学形态学。数学形态学( Mathematical morphology )
    是一门建立在格论和拓扑学基础之上的图像分析学科,是数学形态学图像处理的基本理论。

    图像形态学一些基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀、灰值开闭运算、灰值形态学梯度等等。

    在这里插入图片描述
    其中图像的膨胀和腐蚀是最基础的图像形态学操作,他们主要的功能如下:

    • 消除噪声
    • 分割( isolate )出独立的图像元素,在图像中连接( join )相邻的元素。
    • 寻找图像中的明显的极大值区域或极小值区域
    • 求出图像的梯度

    在接着往下看之前,有一点需要注意的是,图像的腐蚀与膨胀,主要针对的是二值图像(黑白图)的,其中进行变化的部分是图像的白色部分(高亮)部分,不是黑色部分。

    图像膨胀就是图像中的高亮部分进行膨胀,「领域扩张」,效果图拥有比原图更大的高亮区域。

    图像腐蚀就是原图中的高亮部分被腐蚀,「领域被蚕食」,效果图拥有比原图更小的高亮区域。

    图像腐蚀

    图像腐蚀其中有两个比较关键的输入对象,一个是二值图像,另一个是卷积核。

    卷积核是腐蚀中的关键,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为 1 时,其值才为 1 ,否则其值修改为 0 。

    下面是一个 5 * 5 的卷积核卷积的过程:

    在这里插入图片描述
    OpenCV 为图像腐蚀提供的函数是 erode(),它的原函数如下:

    def erode(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
    
    • 1
    • src:原图像。
    • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
    • iterations:迭代次数,默认是迭代一次,表示进行一次腐蚀,如有需要,可进行多次迭代腐蚀。

    示例代码如下

    import cv2 as cv
    import numpy as np
    
    # 图像读取
    source = cv.imread("demo.png")
    
    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)
    
    # 进行图像腐蚀,默认迭代 1 次
    dst = cv.erode(source, kernel)
    
    # 图像显示
    cv.imshow("source", source)
    cv.imshow("dst", dst)
    
    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    我换一张图片迭代 5 次各位看下腐蚀的效果:

    dst = cv.erode(source, kernel, iterations=5)
    
    • 1

    在这里插入图片描述

    图像膨胀

    图像膨胀正好和图像腐蚀相反,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只要有一个值为 1 时则为 1 ,否则为 0 。

    图像膨胀卷积核的卷积过程如下:
    在这里插入图片描述
    OpenCV 为图像腐蚀提供的函数是:dilate() ,它的原函数如下:

    def dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
    
    • 1
    • src:原图像。
    • kernel:卷积核,可以采用函数 np.ones((5,5), np.uint8) 构建。
    • iterations:迭代次数,默认是迭代一次,表示进行一次膨胀,如有需要,可进行多次迭代腐蚀。

    示例代码如下:

    import cv2 as cv
    import numpy as np
    
    # 图像读取
    source = cv.imread("demo.png", cv.IMREAD_GRAYSCALE)
    
    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)
    
    # 进行图像膨胀,默认迭代 1 次
    dst = cv.dilate(source, kernel)
    
    # 图像显示
    cv.imshow("source", source)
    cv.imshow("dst", dst)
    
    # 等待操作
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    可以看到,膨胀后的图像比膨胀前的图像整整胖了一圈。

    案例

    import cv2 as cv
    import matplotlib.pyplot as plt
    import numpy as np
    
    # 读取图像
    source = cv.imread('demo.png', cv.IMREAD_GRAYSCALE)
    
    # 设置卷积核
    kernel = np.ones((5, 5),np.uint8)
    
    # 图像腐蚀
    erode_img = cv.erode(source, kernel)
    
    # 图像膨胀
    dilate_result = cv.dilate(source, kernel)
    
    # 显示结果
    titles = ['Source Img','Erode Img','Dilate Img']
    images = [source, erode_img, dilate_result]
    
    # matplotlib 绘图
    for i in range(3):
       plt.subplot(1, 3, i+1), plt.imshow(images[i],'gray')
       plt.title(titles[i])
       plt.xticks([]),plt.yticks([])
    
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

  • 相关阅读:
    van-button根据参数改变字体颜色,实现高度自定义
    MySQL 8.0.34安装教程
    Shopee印尼站停止销售跨境商品:电商新规是否将改变印尼电商格局?
    区块链论文速读A会-OSDI 2023 一种区块链的高效认证存储
    端到端智能音箱
    窗口闪烁&QWidget多窗口鼠标透传&QWidget底色设置
    给Windows文件夹添加备注信息
    如何开手续费低靠谱正规的期货账户呢?
    输入神经网络的数据类型要求,神经网络数据格式
    @Autowired注解和@Resource注解的区别
  • 原文地址:https://blog.csdn.net/weixin_44634704/article/details/126470610