首页 > 编程知识 正文

边缘检测canny算子,边缘检测canny算法

时间:2023-05-06 13:15:05 阅读:223112 作者:137

Canny发现,在不同视觉系统上对边缘检测的要求较为类似,因此,可以实现一种具有广泛应用意义的边缘检测技术。

 

边缘检测的一般标准:

1)        低错误率:尽可能准确的捕获图像中尽可能多的边缘。

2)        高定位性:检测到的边缘应精确定位在真实边缘的中心。

3)        最小相应:图像中边缘只被标记一次,并且在可能的情况下,图像的噪声不应产生假的边缘。(canny最明显的特点 检测出来的边缘不会很粗)

 

Canny边缘检测算法步骤:

1)        图像降噪:使用高斯滤波器,以平滑图像,滤除噪声。

2)        计算每个像素点的梯度强度和方向。

3)        非极大值抑制:实现最小相应的手段

4)        双阈值筛选:应用双阈值检测来确定真实的和潜在的边缘。https://www.bilibili.com/video/BV13i4y187Ay?from=search&seid=16765896431854409294 34min处

5)        抑制孤立的弱边缘。

 

步骤缘由:

首先,图像降噪。梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么我们就要先去除噪声,因为噪声就是灰度变化很大的地方,容易被识别为伪边缘。

第二步,计算图像梯度,得到可能边缘。计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。

第三步,非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。

第四步,双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值,高阈值。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。

这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足low和high之间的点进行补充,使得边缘尽可能的闭合。

 

参考博文:https://blog.csdn.net/saltriver/article/details/80545571

每个步骤具体见博文:https://www.cnblogs.com/techyan1990/p/7291771.html

步骤讲解的视频资料:https://www.bilibili.com/video/BV1U4411277i

 

code import cv2lenna = cv2.imread(r"C:UsersAdministratorDesktoppicture2.png", 0)lenna = cv2.GaussianBlur(lenna, (5, 5), 0) # 图像降噪canny = cv2.Canny(lenna, 50, 150) # 设置阈值cv2.imshow("canny", canny)cv2.waitKey()  

canny = cv2.Canny(lenna, 50, 150)
# Canny边缘检测,50为低阈值low,150为高阈值high
# 小于前面这个数值的 大于后面数值的 都不要
# 前面一个数字越小 线条越多
# 后面一个数字越小 线条越多

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。