zoukankan      html  css  js  c++  java
  • OpenCV-Python:形态学操作

    常用的形态学操作:腐蚀、膨胀、开运算和闭运算

    一、什么叫形态学操作

    形态学操作就是改变物体的形状,比如腐蚀就是"变瘦",膨胀就是"变胖"

    形态学操作一般作用于二值化图,来连接相邻的元素或分离成独立的元素。腐蚀和膨胀是针对图片中的白色部分!

    白色的像素为255,黑色的像素值为0

    二、腐蚀与膨胀

    1. 腐蚀

    腐蚀的效果是把图片"变瘦",其原理是在原图的小区域内取局部最小值。因为是二值化图,只有0和255,所以小区域内有一个0该像素点就为0:

    这样原图中边缘的地方就会变成0(黑色),达到了瘦身的效果。

    OpenCV中用 cv2.erode() 函数进行腐蚀,只需要指定核的大小就行:

    import cv2
    import numpy as np
    img = cv2.imread('j.bmp', 0)
    kernel = np.ones((5, 5), np.uint8)
    erosion = cv2.erode(img, kernel)  # 腐蚀

    这个核也叫结构元素,因为形态学操作其实也是应用卷积来实现的。结构元素可以是矩形、椭圆、十字形,可以用 cv2.getStructuringElement() 来生成不同形状的结构元素,比如:

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 矩形结构
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))  # 椭圆结构
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))  # 十字形结构

    博主替换过核,效果差距不大。

    2. 膨胀

    膨胀与腐蚀相反,取的是局部最大值,效果是把图片变胖:

    dilation = cv2.dilate(img, kernel)  # 膨胀
    img = cv2.imread('j.bmp')
    
    kernel = np.ones((5, 5), np.uint8)    # 矩形结构
    
    erosion = cv2.erode(img, kernel)   # 腐蚀
    dilation = cv2.dilate(img, kernel) # 膨胀
    
    titles = ['Original', 'erosion', 'dilation']
    images = [img, erosion, dilation]
    
    # 使用Matplotlib显示
    # 一行三列图
    for i in range(3):
        plt.subplot(1, 3, i + 1)
        plt.imshow(images[i])
        plt.title(titles[i], fontsize=8)
        plt.xticks([]), plt.yticks([])
    plt.show()

    三、开、闭运算

    先腐蚀后膨胀叫开运算(因为先腐蚀会分开物体),其作用是:分离物体,消除小区域。使用 cv.morphologyEx() 函数实现:

    # 开运算--先腐蚀后膨胀
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    
    img1 = cv2.imread('j_noise_out.bmp')
    opening = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel)

    闭运算则相反:先膨胀后腐蚀(先膨胀会使白色的部分扩张,以至于消除"闭合"物体里面的小黑洞,所以叫闭运算)

    # 闭运算--先膨胀后腐蚀
    img2 = cv2.imread('j_noise_in.bmp')
    closing = cv2.morphologyEx(img2, cv2.MORPH_CLOSE, kernel)

    开、闭运算确实很容易混淆。如果我们的目标物体外面有很多无关的小区域,就用开运算去除掉;如果物体内部有很多小黑洞,就用闭运算填充掉

    四、形态学梯度、顶帽、黑帽

    形态学梯度:膨胀图减去腐蚀图,dilation - erosion,这样会得到物体的轮廓:

    img = cv2.imread('school.bmp', 0)
    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

        

    顶帽:原图减去开运算后的图:src - opening

    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

    黑帽:闭运算后的图减去原图:closing - src

    五、小结

    1. 形态学就是改变物体的形状,腐蚀是物体"变瘦"、膨胀使物体"变胖"

    2. 先腐蚀后膨胀会分离物体,所以叫开运算,常用来去除小区域物体

    3. 先膨胀后腐蚀会消除物体内的小洞,所以叫闭运算。

    参考地址:http://ex2tron.wang/opencv-python-erode-and-dilate/

  • 相关阅读:
    iis7 下配置 ASP.NET MVC 项目遇到的问题 (WIN7 64位 旗舰版 第一次配置站点)
    C# .NET 使用 NPOI 读取 .xlsx 格式 Excel
    C# .NET 使用 NPOI 生成 .xlsx 格式 Excel
    SQL和T-SQL之间的区别
    .net core的服务器模式和工作站模式
    Windows Mysql8 设置大小写敏感
    每个国家对应的语言Locale和国家代码对照表(转)
    IL指令集
    使用 nvm 管理不同版本的 node 与 npm
    SSIS 包部署 Package Store 后,在 IS 中可以执行,AGENT 执行却报错
  • 原文地址:https://www.cnblogs.com/gezhuangzhuang/p/10701441.html
Copyright © 2011-2022 走看看