达内学网站开发培训课程,html5响应式公司网站模版,织梦网站推广插件,网站建设审核需要多长时间文章目录 Canny 边缘检测目标理论OpenCV 中的 Canny 边缘检测其他资源 Canny 边缘检测
目标
在本章中#xff0c;我们将学习
Canny 边缘检测的概念用于该目的的 OpenCV 函数#xff1a;cv.Canny()
理论
Canny 边缘检测是一种流行的边缘检测算法。它由 John F. Canny 于1… 文章目录 Canny 边缘检测目标理论OpenCV 中的 Canny 边缘检测其他资源 Canny 边缘检测
目标
在本章中我们将学习
Canny 边缘检测的概念用于该目的的 OpenCV 函数cv.Canny()
理论
Canny 边缘检测是一种流行的边缘检测算法。它由 John F. Canny 于1986 年开发。它是一种多阶段算法我们将介绍每个阶段。
降噪
由于边缘检测容易受到图像中噪声的影响因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们已经在前面的章节中看到过这一点。
查找图像的强度梯度
然后用 Sobel 核在水平和垂直方向上对平滑的图像进行过滤以获得水平方向 ( G x G_x Gx) 和垂直方向 ( G y G_y Gy) 的一阶导数。从这两个图像中我们可以找到每个像素的边缘梯度和方向如下所示 [ E d g e _ G r a d i e n t ( G ) G x 2 G y 2 A n g l e ( θ ) tan − 1 ( G y G x ) ] [ Edge\_Gradient \; (G) \sqrt{G_x^2 G_y^2} \\ Angle \; (\theta) \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg) ] [Edge_Gradient(G)Gx2Gy2 Angle(θ)tan−1(GxGy)]
梯度方向始终垂直于边缘。它被四舍五入为四个角度之一代表垂直、水平和两个对角线方向。
非最大值抑制
在获得梯度幅度和方向后对图像进行全面扫描以移除可能不构成边缘的任何不需要的 像素。为此在每个像素处检查像素是否是梯度方向上其邻域中的局部最大值。检查下面的图片 点 A 在边缘上垂直方向。梯度方向垂直于边缘。点 B和 C 在梯度方向上。因此检查点 A 与点 B 和 C 是否形成局部最大值。如果是则将其考虑用于下一阶段否则将其抑制置为零。
简而言之您得到的结果是具有“薄边缘”的二值图像。
滞后阈值
此阶段决定哪些边缘是真正的边缘哪些不是。为此我们需要两个阈值minVal 和 maxVal。强度梯度大于 maxVal 的任何边都必定是边低于 minVal 的边必定是非边因此被丢弃。介于这两个阈值之间的边根据其连通性被分类为边或非边。如果它们连接到“确定边”像素则它们被视为边的一部分。否则它们也会被丢弃。 见下图 边 A 高于 maxVal因此被视为“确定边”。虽然边 C 低于 maxVal但它连接到边 A因此也被视为有效边我们得到了完整的曲线。但是边 B虽然它高于 minVal 并且与边 C 位于同一区域但它没有连接到任何“确定边”因此被丢弃。因此我们必须相应地选择 minVal 和 maxVal以获得正确的结果这一点非常重要。
此阶段还会在假设边缘为长线的情况下消除小像素噪声。
因此我们最终得到的是图像中的强边缘。
OpenCV 中的 Canny 边缘检测
OpenCV 将上述所有内容放在一个函数 cv.Canny() 中。我们将了解如何使用它。 第一个参数是我们的输入图像。 第二个和第三个参数分别是我们的 minVal 和 maxVal。 第四个参数是aperture_size。它是用于查找图像梯度的 Sobel 核的大小。默认情况下为 3。 最后一个参数是 L2gradient它指定用于查找梯度幅度的方程。如果它为 True则使用上面提到的更准确的方程否则它使用此函数 E d g e _ G r a d i e n t ( G ) ∣ G x ∣ ∣ G y ∣ Edge\_Gradient \; (G) |G_x| |G_y| Edge_Gradient(G)∣Gx∣∣Gy∣。默认情况下它是False。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as pltimg cv.imread(messi5.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()请参阅以下结果 其他资源
维基百科 上的 Canny 边缘检测器Canny 边缘检测教程作者Bill Green2002 年。