美文网首页OpenCV
OpenCV--图像的形态学处理

OpenCV--图像的形态学处理

作者: Dayon | 来源:发表于2020-11-20 09:31 被阅读0次

    腐蚀与膨胀属于形态学操作,所谓的形态学,就是改变物体的形状,形象理解一些:
    腐蚀=变瘦
    膨胀=变胖

    主要是采用 cv2.erode() 和 cv2.dilate()
    主要针对二值化图像的白色部分

    • 腐蚀 (erosion /ɪˈroʊʒən/ 🔉):是一种消除边界点,使边界向内部收缩的过程

      • 通俗讲法:在原图的每一个小区域里取最小值,由于是二值化图像,只要有一个点为0,则都为0,来达到瘦身的目的
        算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为1,则图像的该像素为1;否则为0. 最终结果:使二值图像减小一圈.
    • 膨胀 (dilate /ˈdaɪˌleɪt/ 🔉 ):是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,可以用来填补物体中的空洞.

      • 算法:用 3x3 的 kernel,扫描图像的每一个像素;用 kernel 与其覆盖的二值图像做 “与” 操作;若都为0,则图像的该像素为0;否则为1. 最终结果:使二值图像扩大一圈
    • 开运算:先腐蚀后膨胀的过程 。
      用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积.【cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)】

    • 闭运算:先膨胀后腐蚀的过程 。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积.【cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)】

    • 梯度运算:膨胀 -> 腐蚀的过程 。用来计算轮廓【cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)】

    • 顶帽:原始输入 - 开运算结果 【cv2.morphologyEx(img,cv.MORPH_TOPHAT,kernel)】

    • 黑帽:闭运算 - 原始输入 【cv2.morphologyEx(img,cv.MORPH_BLACKHAT,kernel)】

    iteration /ˌɪt̬.əˈreɪ.ʃən/ : 迭代

    腐蚀/膨胀操作

    import cv2
    import numpy as np
    img = cv2.imread('dige.png')
    kernel = np.ones((3,3),np.uint8) 
    erosion = cv2.erode(img,kernel,iterations = 1)  # 迭代次数越多 和 kernel越大 效果越明显
    dilate = cv2.dilate(img,kernel,iterations = 1)
    
    res = np.hstack((img,erosion,dilate))
    cv_show('dige and erode and dilate',res)
    
    image.png
    pie = cv2.imread('pie.png')
    kernel = np.ones((30,30),np.uint8) 
    erosion_1 = cv2.erode(pie,kernel,iterations = 1)
    erosion_2 = cv2.erode(pie,kernel,iterations = 2)
    erosion_3 = cv2.erode(pie,kernel,iterations = 3)
    
    dilate_1 = cv2.dilate(pie,kernel,iterations = 1)
    dilate_2 = cv2.dilate(pie,kernel,iterations = 2)
    dilate_3 = cv2.dilate(pie,kernel,iterations = 3)
    
    res_e = np.hstack((pie,erosion_1,erosion_2,erosion_3))
    res_d = np.hstack((pie,dilate_1,dilate_2,dilate_3))
    # cv2.imshow('res', res_e)
    cv2.imwrite('pie_erode_res.jpg',res_e)
    cv2.imwrite('pie_dilate_res.jpg',res_d)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    开运算&闭运算

    • 开:先腐蚀,再膨胀
    • 闭:先膨胀,再腐蚀
    import cv2
    import numpy as np
    img = cv2.imread('dige.png')
    kernel = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)   # 开:把刺去掉了
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)  # 闭:字和刺都胖了
    
    result = np.hstack((img,opening,closing))
    cv2.imshow('open and close',result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    morphology /moɚˈfɑːləʤi/ 🔉:形态学

    import cv2
    import numpy as np
    img = cv2.imread('dige.png')
    kernel = np.ones((5,5),np.uint8)
    opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)   # 开:把刺去掉了
    closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)  # 闭:字和刺都胖了
    
    result = np.hstack((img,opening,closing))
    cv2.imshow('open and close',result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    梯度运算

    • 梯度 = 膨胀-腐蚀
      多出来的白边 减去 减少的白边,即计算一个轮廓出来

    gradient /ˈgreɪdijənt/ 🔉 :梯度

    # 梯度= 膨胀-腐蚀
    pie = cv2.imread('pie.png')
    kernel = np.ones((7,7),np.uint8) 
    dilate = cv2.dilate(pie,kernel,iterations = 5)
    erosion = cv2.erode(pie,kernel,iterations = 5)
    gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
    
    res = np.hstack((dilate,erosion,gradient))
    
    cv2.imshow('res', res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    礼帽&黑帽

    • 礼帽 = 原始输入 - 开运算结果 (原图 - 没刺的 = 剩下刺)
    • 黑帽 = 闭运算 - 原始输入 (字和刺胖了的 - 原图 = 胖的边缘部分)
    img = cv2.imread('dige.png')
    kernel = np.ones((7,7),np.uint8) 
    tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)    # 只剩刺了
    blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)  # 只剩白边的轮廓
    res = np.hstack((img,tophat,blackhat))
    cv2.imshow('res', res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    相关文章

      网友评论

        本文标题:OpenCV--图像的形态学处理

        本文链接:https://www.haomeiwen.com/subject/qsyliktx.html