Opencv第三课---边缘检测

作者: 计算机视觉__掉队选手 | 来源:发表于2019-01-18 23:13 被阅读28次

    边缘检测

    边缘检测是图像领域非常重要的一种处理手段,要理解边缘检测,首先要理解什么是边缘。边缘是图像局部强度具有非常强烈变化的区域。
    边缘检测算子可以分为一阶边缘检测算子、二阶边缘检测算子和其他检测算子。比较常用的有三种,sobel、canny、laplacian

    一阶边缘检测算子

    边缘的像素强度会发生剧烈的变化,这种变化可以由梯度的变化形象地看到。


    image.png

    可以从上图看到,通过一阶求导得到梯度曲线图后,发现在梯度最大值处会发生一次边缘“跳跃”,这就是我们要找到的边缘位置。

    sobel

    sobel的处理过程:
    1.图像和模板进行卷积操作,得到边缘检测图像
    2.假设图像为I,分别从水平和垂直方向对图像I进行卷积操作,水平模板设为Gx,垂直模板设为Gy,则:


    image.png
    image.png

    3.最终的梯度值为:


    image.png
    举个例子:
    import cv2
    
    img = cv2.imread("edge.jpg", 0)
    cv2.namedWindow("src img")
    cv2.namedWindow("Result")
    x = cv2.Sobel(img,cv2.CV_16S,1,0)
    y = cv2.Sobel(img,cv2.CV_16S,0,1)
    
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    
    dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
    cv2.imshow("src img",img)
    cv2.imshow("Result", dst)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    Canny

    Canny边缘检测算法的整体流程:
    1)使用高斯滤波器,平滑图像,滤除噪声;
    2)计算图像中每个像素位置的梯度和方向;
    3)应用非极大值抑制,消除边缘检测带来的杂散响应;
    4)应用双阈值检测来确定真实的和潜在的边缘;
    5)通过抑制孤立的弱边缘来完成最后的边缘检测。

    import cv2
    img = cv2.imread("edge.jpg",0)
    gauss_img = cv2.GaussianBlur(img,(3,3),0)
    dst = cv2.Canny(gauss_img,50,150)
    cv2.namedWindow("src img")
    cv2.namedWindow("edge img")
    cv2.imshow("src img",img)
    cv2.imshow("edge img",dst)
    cv2.waitKey(0)
    
    image.png

    二阶边缘检测算子

    Laplacian

    在一阶边缘检测介绍时,我们用图像形象地表示了求导后的函数曲线,如果继续对梯度函数再次求导,就可以得到二阶函数曲线:


    image.png

    由此,可以看到二阶函数的边缘处值为0,这是一个非常好区别边缘的特点。拉普拉斯表达式如下:


    img = cv2.imread("edge.jpg",0)
    dst_img = cv2.Laplacian(img,cv2.CV_16S,3)
    dst_img = cv2.convertScaleAbs(dst_img)
    cv2.namedWindow("src img")
    cv2.namedWindow("laplacian img")
    cv2.imshow("src img",img)
    cv2.imshow("laplacian img",dst_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    image.png

    相关文章

      网友评论

        本文标题:Opencv第三课---边缘检测

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