• opencv-python-学习笔记十四(Canny边缘检测)


    原理

    Canny边缘检测是一种常用的边缘检测算法。由 John F. Canny提出

    这是一个多阶段的算法,我们将经历每个阶段。

    1.降低噪音

    由于边缘检测容易受到图像中噪声的影响,第一步是用5x5高斯滤波器去除图像中的噪声。我们在前几章已经见过了。

    2.寻找图像的强度梯度

    然后对平滑后的图像进行水平方向和垂直方向的Sobel核滤波,得到水平方向(Gx)和垂直方向(Gy)的一阶导数。这两幅图像中,我们可以发现每个像素的边缘梯度和方向如下:

    梯度方向总是垂直于边缘,它是四角之一,代表垂直、水平和两个对角线方向。

    3.非极大值抑制

    得到梯度大小和方向后,对图像进行全面扫描,去除非边界点。在每个像素处,看这个点的梯度是不是周围具有相同梯 度方向的点中最大的,查看下图:

    点A在边缘上(垂直方向)。梯度方向垂直于边缘。点B和点C在梯度方向上,因此,点A与点B和点C进行检查,看它是否形成局部最大值,如果是,则将其考虑到下一阶段,否则将抑制它(使其为零)。

    简而言之,您得到的结果是一个具有“细边”的二进制图像。

    4.滞后阈值

    现在要确定那些边界才是真正的边界,为此,我们需要两个阈值,minVal和maxVal。任何强度梯度大于maxVal的边都肯定是边,小于minVal的边肯定是非边,所以丢弃。位于这两个阈值之间的根据它们的连接性对边缘或非边缘进行分类(如果介于两者之间的话,就要看这个点是 否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是 就抛弃。如下图:

    A 高于阈值 maxVal 所以是真正的边界点。C 虽然低于 maxVal 但高于minVal 并且与 A 相连,所以也被认为是真正的边界点。而 B 就会被抛弃,因 为他不仅低于 maxVal 而且不与真正的边界点相连。所以选择合适的 maxVal 和 minVal 对于能否得到好的结果非常重要。 在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些长的线段。

    OpenCV中的Canny边缘检测

    OpenCV将所有这些都放在一个函数cv.Canny中。第一个参数是输入图像。第二个和第三个参数分别是minVal和maxVal。第三个参数是aperture_size,它是用来寻找图像梯度的Sobel内核的大小,默认值是3。最后一个参数是L2gradient,它指定了求梯度大小的方程。

    函数:

    edges=cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

    edges=cv.Canny(dx, dy, threshold1, threshold2[, edges[, L2gradient]])

    参数:

    dx 16-bit 输入图像的x导数 (CV_16SC1 or CV_16SC3).
    dy 16-bit 输入图像的y导数 (和dx有相同类型).
    edges 输出的边缘地图; 单通道8-bit 图像, 与输入图像有相同大小。
    threshold1 第一个阈值,低阈值                                                                      
    threshold2 第二个阈值,高阈值
    L2gradient 如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开方),否则使用L1范数(直接将两个方向导数的绝对值相加)。

    举例:

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    
    img = cv.imread('4.jpg', 0)
    edges = cv.Canny(img, 100, 200)
    plt.subplot(121), plt.imshow(img, cmap='gray')
    plt.title('Original Image'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.imshow(edges, cmap='gray')
    plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
    plt.show()

  • 相关阅读:
    BZOJ1717: [Usaco2006 Dec]Milk Patterns 产奶的模式
    BZOJ1031: [JSOI2007]字符加密Cipher
    关于后缀数组的实现
    BZOJ1692: [Usaco2007 Dec]队列变换
    BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排
    POJ 2386 Lake Counting(搜索联通块)
    POJ 2386 Lake Counting(搜索联通块)
    Java演示设计模式中的写代码的代码
    Java演示设计模式中的写代码的代码
    源码映射
  • 原文地址:https://www.cnblogs.com/blog-xyy/p/11265702.html
Copyright © 2020-2023  润新知