• OpenCV机器视觉-形态学变换


    形态学变换


    膨胀与腐蚀


    形态学变化是基于图像形状的一些简单操作。操作对象一般是二值图像,需要两个输入,一个是我们的原图,另一个是3x3的结构元素(内核),决定了膨胀操作的本质。常见的操作是图像的膨胀和腐蚀。以及他们的进阶操作注入Opening、Closing、Gradient等等。

    结构元素的形状

    MORPH_RECT矩形
    MORPH_ELLIPSE椭圆形
    MORPH_CROSS十字型

    膨胀Dilation


    跟卷积操作非常类似.有图像A和3x3的结构元素,结构元素在A上进行滑动.计算结构元素在A上覆盖的最大像素值来替换当前结构元素对应的正中间的元素

    膨胀的作用:

    1. 对象边缘增加一个像素
    2. 使对象边缘平滑
    3. 减少了对象与对象之间的距离

    示例代码

    import cv2 as cv
    
    src = cv.imread("./img/morph-closing.jpg", cv.IMREAD_GRAYSCALE)
    cv.imshow("src", src)
    
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
    
    dst = cv.dilate(src, kernel)
    cv.imshow("dst", dst)
    cv.waitKey()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    腐蚀Erosion


    腐蚀和膨胀过程类似,唯一不同的是以覆盖的最小值替换当前的像素值

    侵蚀的作用:

    1. 对象边缘减少一个像素
    2. 对象边缘平滑
    3. 弱化了对象与对象之间连接

    示例代码

    import cv2 as cv
    
    src = cv.imread("../img/morph-j.jpg",cv.IMREAD_GRAYSCALE)
    cv.imshow("src",src)
    
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    
    dst = cv.erode(src,kernel)
    cv.imshow("dst",dst)
    cv.waitKey()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    开操作Opening


    先腐蚀,后膨胀,主要应用在二值图像或灰度图像

    先腐蚀: 让当前窗口中最小的颜色值替换当前颜色值

    后膨胀: 让当前窗口中最大的颜色值替换当前颜色值

    作用:

    1. 一般用于消除小的干扰或噪点(验证码图的干扰线)
    2. 可以通过此操作配合结构元素,提取图像的横线和竖线

    示例代码

    import cv2 as cv
    
    src = cv.imread("../img/morph-opening.jpg",cv.IMREAD_GRAYSCALE)
    cv.imshow("src",src)
    
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    
    dst = cv.morphologyEx(src,cv.MORPH_OPEN,kernel)
    cv.imshow("dst",dst)
    cv.waitKey()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    闭操作


    先膨胀,后侵蚀

    一般用于填充内部缝隙

    示例代码

    import cv2 as cv
    
    src = cv.imread("../img/morph-closing.jpg",cv.IMREAD_GRAYSCALE)
    cv.imshow("src",src)
    
    kernel = cv.getStructuringElement(cv.MORPH_RECT,(5,5))
    
    dst = cv.morphologyEx(src,cv.MORPH_CLOSE,kernel)
    cv.imshow("dst",dst)
    cv.waitKey()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    总结


    形态学变换中还有一些其它的变换,大家可以自行尝试查看执行效果

    开运算
        先对图像腐蚀,再膨胀
        dst=open(src,element)=dilate(erode(src,element))
    
    闭运算
        先膨胀再腐蚀
        dst=close(src,element)=erode(dilate(src,element))
    
    形态梯度
        膨胀图和腐蚀图之差
        dst=morph_grad(src,element)=dilate(src,element)−erode(src,element)
    
    顶冒
    	原图和开运算图之差
    	dst=tophat(src,element)=src−open(src,element)
        
    黑冒
    	闭运算结果和原图之差
    	dst=blackhat(src,element)=close(src,element)−src
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    微信小程序写一个将图片对象转成base64字符串的函数
    Debian 11启用大页
    845. 数组中的最长山脉
    C#Linq中的GroupBy
    MyBioSource 水痘-带状疱疹病毒 (VZV-gE) 抗体化学性质
    ospf多区域原理和配置
    【GNN基础学习】图模块基本定义 || 图的邻接矩阵 || GNN中常见任务有哪些? || GNN消息传递方法 || 多层GCN有什么作用?
    算法通关村第九关-青铜挑战二分查找算法
    HTML中script 标签中的那些属性
    【owt-server】内部传输机制3 :基础:TransportSession、TransportMessage和 TransportData
  • 原文地址:https://blog.csdn.net/weixin_45946270/article/details/124838774