• 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

    在这里插入图片描述

  • 相关阅读:
    mmdetection训练得到的权重/checkpoints文件分析
    使用Harbor作为docker镜像仓库之安装运行Harbor
    VAD监测(一)
    Nwafu-OJ-1512 Problem 二分法解方程
    cesium判断一个点是否在一个范围内
    11. 关于linux下的挂载
    电商后台项目 + 源码
    文心一言 VS 讯飞星火 VS chatgpt (84)-- 算法导论8.2 1题
    Ubuntu的Python从2.x升级到3.x
    玩玩“小藤”开发者套件 Atlas 200I DK A2 之环境准备
  • 原文地址:https://blog.csdn.net/weixin_44634704/article/details/126470610