• 【642】Python 实现膨胀、腐蚀、提取边线


    [1] python实现膨胀与腐蚀

    [2] 图像腐蚀与图像膨胀(Python篇)

    [3] OpenCV 图像处理之膨胀与腐蚀【推荐】

    • 膨胀

      cv2.dilate(img, kernel, 1)
    • 腐蚀

      cv2.erode(img, kernel, iterations=1)
    • 开运算

      开运算:先腐蚀,再膨胀
      cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
    • 闭运算

      闭运算:先膨胀,再腐蚀
      cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    • 梯度计算:

      膨胀的图像 - 腐蚀的图像
      用大一圈的图像减去小一圈的图像正好就是边缘的信息。
      cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

    1. 基本概念

      图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域。其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大;腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

    1.1 膨胀(或)

      通过卷积运算,对于膨胀而言,结果是 0 的还是 0,结果大于 0 的就赋值为 1(针对二值图)

      相当于 或 操作,只有 0 才为 0,其他都为 1(针对二值图)

      更通俗的说法:这里我们指定范围为3*3的矩阵,kernel(卷积核核)指定为全为1的3*3矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。如果是二值图像,只要包含周围白的部分,就变为白的。

    1.2 腐蚀(与)

      通过卷积运算,对于腐蚀而言,结果是 最大值 的才是 1,其他就赋值为 0(针对二值图)

      相当于 与 操作,只有 最大值 才为 1,其他均赋值为 0(针对二值图)

      举例:如果是 十字形,则需要卷积值为 5 才会赋值为 1,其他均赋值为 0(针对二值图)

      更通俗的说法:腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。如果是二值图像,就是取0(黑色)。 总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。

    2. 实现过程

    2.1 膨胀实现

    img = cv2.imread('Pic/corrode.png')
    def cv_show(img):
        cv2.imshow('', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    cv_show(img)
    
    kernel = np.ones((3, 3), dtype=np.uint8)
    dilate = cv2.dilate(img, kernel, 1) # 1:迭代次数,也就是执行几次膨胀操作
    cv_show(dilate)
    
    # 更改卷积核大小
    kernel_2 = np.ones((4, 4), dtype=np.uint8) # 卷积核变为4*4
    dilate = cv2.dilate(img, kernel_2, 1)
    cv_show(dilate)
    
    # 更改迭代次数
    kernel = np.ones((3, 3), dtype=np.uint8)
    dilate = cv2.dilate(img, kernel, 2) # 更改迭代次数为2
    ss = np.hstack((img, dilate))
    cv_show(ss)
    

    2.2 腐蚀实现

    kernel = np.ones((3, 3), dtype=np.uint8)
    erosion = cv2.erode(img, kernel, iterations=1)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    
    # 更改卷积核大小
    
    kernel_2 = np.ones((4, 4), dtype=np.uint8)
    erosion = cv2.erode(img, kernel_2, iterations=1)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    
    # 更改迭代次数
    
    kernel = np.ones((3, 3), dtype=np.uint8)
    erosion = cv2.erode(img, kernel, iterations=2)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    

    2.3 开运算与闭运算 

    # 开运算
    
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
    ss = np.hstack((img, opening))
    cv_show(ss)
    
    # 闭运算
    
    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  ## 有缺陷,填补缺陷
    ss = np.hstack((img, closing))
    cv_show(ss)
    

      开运算可以用来去噪声

    img = cv2.imread('seg.png')
    
    kernel = np.ones((5, 5), dtype=np.uint8)
    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
    ss = np.hstack((img, opening))
    show(ss)
    
    cv2.imwrite('seg_smooth.png', opening)
    

    2.4 梯度运算 

    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    cv_show(gradient)
    

      具体实现

    img = cv2.imread('seg.png')
    kernel = np.ones((3, 3), dtype=np.uint8)
    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    ss = np.hstack((img, gradient))
    show(ss)
    

  • 相关阅读:
    CentOS 7 设置iptables防火墙开放proftpd端口
    Android手机修改Hosts的方法
    Wireshark提示没有一个可以抓包的接口
    while read line无法循环read文件
    Nagios新添加的hosts和services有时显示,有时不显示问题解决
    Nginx配置http强制跳转到https
    xargs rm -rf 与 -exec rm
    解决vim不能使用方向键和退格键问题
    NRPE: Unable to read output 问题处理总结
    MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/15131938.html
Copyright © 2020-2023  润新知