Canny边缘检测是一种非常受欢迎的边缘检测算法,由John Canny于1986年提出。 这是一种多阶段算法,由多个步骤组成。
3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /
我们就事后诸葛亮分析这一步的理由。
1.图像降噪,图像降噪。 已知梯度算子可用于增强图像,本质上通过增强边缘的轮廓来实现,即可以检测边缘。 但是,它们受到噪音的影响很大。 现在,让我们先考虑消除噪音。 因为噪声是灰度变化较大的地方,所以容易被识别为伪边缘。
2.计算图像梯度,计算图像梯度,得到可能的边缘。 正如上一篇关于《图像梯度》的文章所介绍的,计算图像的梯度可以获得图像的边缘。 因为梯度是灰度变化明显的地方,边缘也是灰度变化明显的地方。 当然,这一步只能得到可能的边缘。 因为灰度变化的地方可能是边缘,也可能不是边缘。 在这一步中,有可能是边缘的所有集合。
3.非极大值抑制,不是极大值抑制。 通常,灰度变化的地方很集中。 通过保留局部范围内的梯度方向中灰度变化最大的梯度方向,而不保留其他梯度方向,可以消除大部分问题。 将多个像素宽度的边缘设置为1像素宽度的边缘。 也就是说,“胖端”就是“瘦端”。
4.阈值筛选,双重阈值筛选。 在通过极大值以外的抑制后,还存在很多可能的边缘点,进而设定双重阈值,即低阈值、高阈值)。 当灰度变化大于high时,设定为强边缘像素,当小于low时,进行间隔剔除。 low和high之间的设置是弱边。 进而,如果在该区域内有强的边缘像素则判断为残留,如果没有则判断为去除。
它的目的是只保留强边的轮廓,有些边可能没有闭合。 必须从满足low和high之间的点进行补充,以便边尽可能闭合。
让我们来看看效果:
#导入图像lenna=cv2.im read (images (lenna.png ),0 )图像降噪Lenna=cv2.Gaussianblur(Lenna,(5,5 ),0 ) # cacaran 150 ) cv2.im show (canny )、canny (cv2.wait key ) )在OpenCV中,canny函数本身是图像,因此在实施canny边缘检测时,在canny函数之外进行图像降噪的过程
调整低和高双阈值可以获得不同的边缘效果。
canny=cv2.canny(Lenna,100,200 ) )。
看看有噪音的情况:
#图像lenna=cv2.im read (导入imageslenna _ gauss.png ',0 )图像降噪Lenna=cv2.Gaussianblur(Lenna,(5,)
效果很差呢。 调整高斯模糊核的大小后,效果很快就好了很多。
Lenna=cv2.Gaussianblur(Lenna,(9,9 ),0 ) ) ) ) ) )。
因此,Canny在有噪声的情况下能否正常工作取决于前面的降噪过程。 因此,OpenCV将图像降噪排除在Canny函数之外吧。 你需要自己慎重地调整那个。