网站审核备案,怎么给网站做访问量,韩国化妆品网站金色flash片头,零基础网站建设入门到精通视频教什么是Canny边缘检测#xff1f; Canny边缘检测是一种经典的边缘检测算法#xff0c;由John F. Canny在1986年提出。它被广泛应用于计算机视觉和图像处理领域#xff0c;是一种多阶段的边缘检测算法#xff0c;能够有效地检测图像中的边缘并抑制噪声。 Canny边缘检测的主要…什么是Canny边缘检测 Canny边缘检测是一种经典的边缘检测算法由John F. Canny在1986年提出。它被广泛应用于计算机视觉和图像处理领域是一种多阶段的边缘检测算法能够有效地检测图像中的边缘并抑制噪声。 Canny边缘检测的主要步骤如下 噪声抑制首先通过使用高斯滤波器对图像进行平滑处理以去除图像中的噪声。高斯滤波器可以有效地平滑图像同时保持边缘的细节。 计算梯度幅值和方向使用Sobel算子计算图像中每个像素点的水平和垂直方向的梯度值。然后根据梯度值计算每个像素点的梯度幅值和方向。 非极大值抑制在计算得到的梯度幅值图像上进行非极大值抑制。这一步的目的是将边缘宽度变窄使得边缘更加细化和明确。 双阈值处理根据设定的高阈值和低阈值将梯度幅值图像中的像素点分为强边缘、弱边缘和非边缘三类。通常选择高阈值和低阈值使得强边缘像素点的梯度幅值大于高阈值非边缘像素点的梯度幅值小于低阈值而弱边缘像素点的梯度幅值处于高阈值和低阈值之间。 边缘连接最后通过连接强边缘像素点和与之相邻的弱边缘像素点得到完整的边缘图像。 Canny边缘检测算法通过多个阶段的处理能够得到清晰准确的边缘信息并且对噪声具有一定的鲁棒性。因此它在图像处理和计算机视觉中得到广泛应用特别是在要求高精度边缘检测的场景中。 Canny边缘检测应用场景
Canny边缘检测在图像处理和计算机视觉领域有许多应用场景下面列举了一些常见的应用场景 物体检测与目标定位Canny边缘检测能够帮助检测图像中物体的边缘从而实现目标检测和定位。在计算机视觉任务中这对于目标识别、物体追踪和目标定位等是至关重要的。 图像分割Canny边缘检测可以在图像中检测出物体和背景之间的边缘有助于将图像分割成不同的区域使得图像处理更加高效和准确。 视觉导航与SLAM在机器人视觉导航和同时定位与地图构建SLAM中Canny边缘检测有助于提取环境中的地标和边缘特征用于机器人的定位和导航。 图像增强Canny边缘检测可以突出图像中的边缘特征使得图像在可视化和分析上更加清晰明了从而用于图像增强和美化。 图像匹配与对准Canny边缘检测能够提取图像中的特征点用于图像匹配和图像对准常用于图像拼接、图像融合等应用。 视觉检测与安全Canny边缘检测在视觉检测和安全领域也有应用例如边缘检测在视频监控中用于检测异常行为或者在车辆驾驶辅助系统中用于车道检测和车辆识别。 医学影像处理Canny边缘检测在医学影像处理中广泛应用用于检测器官边缘、病变区域等辅助医生进行疾病诊断和治疗。 总的来说Canny边缘检测在图像处理和计算机视觉的许多领域都扮演着重要的角色它是一种经典且有效的边缘检测算法被广泛应用于实际场景中。 Canny 边缘检测实现步骤说明
1. 应用高斯滤波去除图像噪声
由于图像边缘非常容易受到噪声的干扰因此为了避免检测到错误的边缘信息通常需要对图像进行滤波以去除噪声。滤波的目的是平滑一些纹理较弱的非边缘区域以便得到更准确的边缘。在实际处理过程中通常采用高斯滤波去除图像中的噪声。
图 10-1 演示了使用高斯滤波器 T 对原始图像 O 中像素值为 226 的像素点进行滤波得到该点在滤波结果图像 D 内的值的过程。 在滤波过程中我们通过滤波器对像素点周围的像素计算加权平均值获取最终滤波结果。对于高斯滤波器 T越临近中心的点权值越大。在图 10-1 中对图像 O 中像素值为 226 的像素点使用滤波器 T 进行滤波的计算过程及结果为
结果 156×(197×125×1106×2156×1159×1149×140×3107×45×371×1163×2198×4226×8223×4156×2222×137×368×4193×3157×142×172×1250×241×175×1) 138当然高斯滤波器高斯核并不是固定的例如它还可以是 滤波器的大小也是可变的高斯核的大小对于边缘检测的效果具有很重要的作用。滤波器的核越大边缘信息对于噪声的敏感度就越低。不过核越大边缘检测的定位错误也会随之增加。通常来说一个 5×5 的核能够满足大多数的情况。
2. 计算梯度幅值和方向
前面一节讲了如何计算图像梯度的幅度。在这里我们关注梯度的方向梯度的方向与边缘的方向是垂直的。
边缘检测算子返回水平方向的Gx和垂直方向的Gy。梯度的幅度和方向用角度值表示为 式中atan2(•)表示具有两个参数的 arctan 函数。
梯度的方向总是与边缘垂直的通常就近取值为水平左、右、垂直上、下、对角线右上、左上、左下、右下等 8 个不同的方向。
因此在计算梯度时我们会得到梯度的幅度和角度代表梯度的方向两个值。
图 10-2 展示了梯度的表示法。其中每一个梯度包含幅度和角度两个不同的值。为了方便观察这里使用了可视化表示方法。例如左上角顶点的值“2↑”实际上表示的是一个二元数对“(2, 90)”表示梯度的幅度为 2角度为 90°。 3. 非极大值抑制
在获得了梯度的幅度和方向后遍历图像中的像素点去除所有非边缘的点。
在具体实现时逐一遍历像素点判断当前像素点是否是周围像素点中具有相同梯度方向的最大值并根据判断结果决定是否抑制该点。
通过以上描述可知该步骤是边缘细化的过程。针对每一个像素点
如果该点是正/负梯度方向上的局部最大值则保留该点。如果不是则抑制该点归零。
在图 10-3 中A、B、C 三点具有相同的方向梯度方向垂直于边缘。判断这三个点是否为各自的局部最大值如果是则保留该点否则抑制该点归零。 经过比较判断可知A 点具有最大的局部值所以保留 A 点称为边缘其余两点B和 C被抑制归零。
在图 10-4 中黑色背景的点都是向上方向梯度水平边缘的局部最大值。因此这些点会被保留其余点被抑制处理为 0。这意味着这些黑色背景的点最终会被处理为边缘点而其他点都被处理为非边缘点。 “正/负梯度方向上”是指相反方向的梯度方向。例如在图 10-5 中黑色背景的像素点都是垂直方向梯度向上、向下方向上即水平边缘的局部最大值。这些点最终会被处理为边缘点。 经过上述处理后对于同一个方向的若干个边缘点基本上仅保留了一个因此实现了边缘细化的目的。
4. 应用双阈值确定边缘
完成上述步骤后图像内的强边缘已经在当前获取的边缘图像内。但是一些虚边缘可能也在边缘图像内。这些虚边缘可能是真实图像产生的也可能是由于噪声所产生的。对于后者必须将其剔除。
设置两个阈值其中一个为高阈值 maxVal另一个为低阈值 minVal。根据当前边缘像素的梯度值指的是梯度幅度下同与这两个阈值之间的关系判断边缘的属性。具体步骤为
1如果当前边缘像素的梯度值大于或等于 maxVal则将当前边缘像素标记为强边缘。 2如果当前边缘像素的梯度值介于 maxVal 与 minVal 之间则将当前边缘像素标记为虚 边缘需要保留。 3如果当前边缘像素的梯度值小于或等于 minVal则抑制当前边缘像素。
在上述过程中我们得到了虚边缘需要对其做进一步处理。一般通过判断虚边缘与强边 缘是否连接来确定虚边缘到底属于哪种情况。通常情况下如果一个虚边缘
与强边缘连接则将该边缘处理为边缘。与强边缘无连接则该边缘为弱边缘将其抑制。
在图 10-6 中左图显示的是三个边缘信息右图是对边缘信息进行分类的示意图具体划分如下
A 点的梯度值值大于 maxVal因此 A 是强边缘。B 和 C 点的梯度值介于 maxVal 和 minVal 之间因此 B、C 是虚边缘。D 点的梯度值小于 minVal因此 D 被抑制抛弃。 图 10-7 显示了对图 10-6 中的虚边缘 B 和 C 的处理结果。其中
B 点的梯度值介于 maxVal 和 minVal 之间是虚边缘但该点与强边缘不相连故将其抛弃。C 点的梯度值介于 maxVal 和 minVal 之间是虚边缘但该点与强边缘 A 相连故将其保留。 注意高阈值 maxVal 和低阈值 minVal 不是固定的需要针对不同的图像进行定义。
10-8 给出了一个 Canny 边缘检测的效果图。 5.检测边缘连接 Canny边缘检测的边缘连接是指将非极大值抑制得到的边缘点连接成连续的边缘线。这个过程是Canny边缘检测算法中的最后一步它的目的是去除由于非极大值抑制产生的间断的边缘点从而得到更加准确和连续的边缘检测结果。 下面详细讲解Canny边缘检测的边缘连接过程 遍历梯度幅值图像首先遍历经过非极大值抑制后的梯度幅值图像即只有边缘上的像素点的梯度幅值被保留其他像素点的梯度幅值为零。 标记边缘点对于每个强边缘像素点梯度幅值大于高阈值将其标记为边缘点。强边缘像素点是图像中梯度值较大的像素点它们代表了图像中明显的边缘。 边缘连接对于每个边缘点的相邻像素点如果其梯度幅值大于低阈值并且没有被标记为边缘点则将其标记为弱边缘点并递归地进行边缘连接。这一步的目的是将与强边缘像素点相邻的弱边缘像素点连接到边缘线上。 递归连接在边缘连接过程中如果某个弱边缘像素点被标记为边缘点则会继续检查该像素点的相邻像素点以便将所有与强边缘像素点相邻的弱边缘像素点连接到边缘线上。 结束条件边缘连接的递归过程会一直进行直到所有与强边缘像素点相邻的弱边缘像素点都被标记为边缘点没有更多的像素点可以连接。 非边缘点处理经过边缘连接后所有未被标记为边缘点的像素点视为非边缘点并抑制其梯度幅值为零从而得到最终的边缘图像。
Canny 函数说明及示例
OpenCV 提供了函数 cv2.Canny()来实现 Canny 边缘检测其语法形式如下
edges cv.Canny( image, threshold1, threshold2[, apertureSize[, L2gradient]])式中
edges 为计算得到的边缘图像。image 为 8 位输入图像。threshold1 表示处理过程中的第一个阈值。threshold2 表示处理过程中的第二个阈值。apertureSize 表示 Sobel 算子的孔径大小。L2gradient 为计算图像梯度幅度gradient magnitude的标识。其默认值为 False。如果为 True则使用更精确的 L2 范数进行计算即两个方向的导数的平方和再开方否则使用 L1 范数直接将两个方向导数的绝对值相加。 代码示例使用函数 cv2.Canny()获取图像的边缘
原图
代码如下
import cv2
#读取图像灰度模式
ocv2.imread(feibu.png,cv2.IMREAD_GRAYSCALE)
#边缘检测canny算子阈值128-200低于128的像素点认为是边缘高于200的像素点认为是边缘中间值的像素点如果与边缘点相连则认为是边缘
r1cv2.Canny(o,128,200)cv2.imshow(original,o)
cv2.imshow(result1,r1)cv2.waitKey()
cv2.destroyAllWindows()
运行效果 针对不同的图片阈值的范围需要不断的调式有最佳的效果。