美文网首页
OpenCV-Python系列五:图像分割(3)--Canny边

OpenCV-Python系列五:图像分割(3)--Canny边

作者: CodeFUN | 来源:发表于2020-06-19 23:44 被阅读0次

    Canny边缘检测是一种常用的边缘提取算法,由高斯滤波,梯度计算,非极大值抑制和双阈值一系列算法流程来实现,抗噪能力强。你可以根据实际的需要来调整各个部分,以满足应用需求。

    opencv Canny算子参数
    cv2.Canny(srcImg, threshold1, threshold2[, size, L2gradient])
    threshold1,threshold2:对应Canny算法中的双阈值,来确定真实和可能是边缘信息
    size:为上一期中Sobel算子的ksize信息
    L2gradient:bool类型,计算梯度的方法,按照官方文档中的解释为,采用不同的计算梯度值方式,默认为false(计算量小,够用)

    1. Canny边缘检测效果
    import cv2
    
    src_img = cv2.imread('building.jpg', -1)
    gray_img = cv2.cvtColor(src_img, cv2.COLOR_BGR2GRAY)
    # Canny算子检测边缘信息
    edges_img = cv2.Canny(gray_img, 100, 200, 5)
    
    cv2.imshow('gray_img', gray_img)
    cv2.imshow('canny_img', edges_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    Canny边缘检测 在Canny处理前,你可以添加滤波来消除图像中的噪点信号,比如高斯滤波。滤波会使得你的图像内容变得模糊,独立的噪点信号被平滑后对你提取边缘特征是非常有帮助的(比如在霍夫变换前) gaussian+canny效果 滤去建筑物内部的细节信息,在进入Canny处理前添加如下代码:
    gaussian_img = cv2.GaussianBlur(gray_img,(3, 3),0)
    

    参数(3, 3)为kernel size,必须都是奇数,0为标准差,这里表示会根据kernel size来计算,后面会介绍opencv中的滤波函数。

    2. 几种常用的边缘提取方法对比
    常用的边缘提取方法对比
    import cv2
    import numpy as np
    
    img = cv2.imread("building.jpg")
    
    gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    # 高斯平滑
    gaussian_img = cv2.GaussianBlur(gray_img,(3, 3),0)
    
    # Laplacian算子
    laplacian_edge_img = cv2.Laplacian(gaussian_img, -1, ksize =3, delta = 5)
    # Sobel提取边缘
    grad_x = cv2.Sobel(gaussian_img, cv2.CV_64F, 1, 0 )
    abs_grad_x = cv2.convertScaleAbs( grad_x )
    
    grad_y = cv2.Sobel( gaussian_img, cv2.CV_64F, 0, 1 )
    abs_grad_y = cv2.convertScaleAbs(grad_y)
    
    sobel_img = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)
    # ret,sobel_edge_img=cv2.threshold(sobel_img, 80, 255, cv2.THRESH_BINARY)
    
    # Canny算子
    canny_edges_img = cv2.Canny(gaussian_img, 100, 200, 5)
    
    cv2.imshow('laplacian_edge_img', laplacian_edge_img)
    cv2.imshow('sobel_edge_img', sobel_img)
    cv2.imshow('canny_edges_img', canny_edges_img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    其中Sobel实现的代码和上一期提到的方法稍有不同,对边缘的提取效果比上一期提及的直接使用1,1来对两个方向求梯度要好。这里注释的对Sobel结果做阈值处理目的主要是简化图像的信息,方便后续接其他处理。

    参考博客链接为:https://blog.51cto.com/weiyuqingcheng/2335243

    对于opencv-python的图像分割--Canny边缘检测部分有问题欢迎留言, Have Fun With OpenCV-Python, 下期见。

    相关文章

      网友评论

          本文标题:OpenCV-Python系列五:图像分割(3)--Canny边

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