zoukankan      html  css  js  c++  java
  • OpenCV4【12】边缘检测

    Canny 边缘检测

    Canny 边缘检测是一种被广泛应用的算法,效果较好

    原理

    详见 参考资料1

    没搞懂,先记下来,空了研究吧

    该方法使用了比高斯差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化。
    
    Canny边缘检测器算法基本步骤:
    
    平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声。
    计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直、水平和斜对角。这一步的输出用于在下一步中计算真正的边缘。
    非最大值抑制:利用上一步计算出来的梯度方向,检测某一像素在梯度的正方向和负方向上是否是局部最大值,如果是,则抑制该像素(像素不属于边缘)。这是一种边缘细化技术,用最急剧的变换选出边缘点。
    用滞后阈值化选择边缘:最后一步,检查某一条边缘是否明显到足以作为最终输出,最后去除所有不明显的边缘。

     

    opencv 用法

    def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
    • image 必须是单通道
    • 其中较大的阈值threshold2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的阈值threshold1将这些间断的边缘连接起来
    • 可选参数中apertureSize就是Sobel算子的大小。
    • L2gradient参数是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加)

    返回一张二值图

    示例

    import cv2
    import numpy as np
    
    
    img = cv2.imread('imgs/2.png', 0)   # 转化为灰度图
    blur = cv2.GaussianBlur(img, (3, 3), 0)  # 用高斯滤波处理原图像降噪
    canny = cv2.Canny(blur, 50, 150)         # 50是最小阈值,150是最大阈值
    # plot
    img_canny = np.hstack([img, canny])
    cv2.namedWindow("canny", 0)               # 可调大小
    cv2.imshow('canny', img_canny)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    效果图

    soble 边缘检测

    简单记下

    opencv 用法 

    x = cv2.Sobel(img, cv2.CV_16S, 1, 0)
    y = cv2.Sobel(img, cv2.CV_16S, 0, 1)
    # cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
    # 可选参数alpha是伸缩系数,beta是加到结果上的一个值,结果返回uint类型的图像
    Scale_absX = cv2.convertScaleAbs(x)  # convert 转换  scale 缩放
    Scale_absY = cv2.convertScaleAbs(y)
    result = cv2.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
    # plot
    img_res = np.hstack([img, result])
    cv2.namedWindow("result", 0)     # 可调大小
    cv2.imshow('result', img_res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    详见 《图像梯度》 章节

    参考资料:

    https://segmentfault.com/a/1190000015651403  opencv python Canny边缘检测

    https://www.cnblogs.com/gezhuangzhuang/p/10711201.html  基本同上篇

    https://www.jb51.net/article/203283.htm  Python使用Opencv实现边缘检测以及轮廓检测的实现

    https://zhuanlan.zhihu.com/p/38739563  边缘检测,框出物体的轮廓(使用opencv-python)

    https://blog.csdn.net/qq_42333641/article/details/90201179  canny 和  soble边缘检测

    https://www.cnblogs.com/silence-cho/p/13621975.html#top  更多边缘检测算法

  • 相关阅读:
    setTimeout的时间设为0的问题
    nodejs的简单服务器程序
    使用Promise规定来处理ajax请求的结果
    使用myfocus制作焦点图
    给Array添加删除重复元素函数
    css派生选择器
    Javascript 参数传递
    Node.js 搞Javascript开发的无论如何要尝试一下
    CSS九宫格带边框的多种实现
    80%人会答错的JS基础面试题
  • 原文地址:https://www.cnblogs.com/yanshw/p/15493544.html
Copyright © 2011-2022 走看看