canny检测出的多个边缘合成一个_OpenCV实战系列Canny边缘检测
发布日期:2021-06-24 15:52:28 浏览次数:2 分类:技术文章

本文共 1463 字,大约阅读时间需要 4 分钟。

092da24f9a08464662135edb17c4c581.png

分享人工智能技术干货,专注深度学习与计算机视觉领域!

OpenCV为我们提供了一个非常方便的边缘检测接口Canny函数,该函数的命名是以其发明者Jhon F.Canny命名的,自1986年被发明后该算法就一直很受欢迎,其不容易受噪声的干扰,它的双阈值法可以分别检测到强边缘和弱边缘,并且仅当弱边缘与强边缘相连时,才将弱边缘包含在输出结果中,这就保障了检测到真正的弱边缘。Canny算法不仅效果好,其使用也非常简便,仅需一行代码即可实现边缘检测,一般其工作原理如下:

1)使用高斯滤波器对图像进行平滑去噪;

2)计算输入图像梯度;

3)在边缘上使用非极大值抑制(NMS)进行过滤;

4)在检测到的边缘上使用双阈值法去除假阳性;

5)分析所有的边缘及其之间的连接,以保留真正的边缘并消除不明显的边缘;

该接口的定义及其形参说明如下:

Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)

image:输入的8bit图像

threshold1:阈值1

threshold2:阈值2

edges:输出的边缘图像,8bit单通道,宽高与输入图像一致

apertureSize:Sober算子核大小

L2gradient:是否使用更精确的方式计算梯度,True使用,否则不用

Canny函数还有另外一种接口定义,其说明如下:

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

dx:输入图像在x方向的导数:16-bit(CV_16SC1或CV_16SC3)

dy:输入图像在y方向的导数:16-bit(CV_16SC1或CV_16SC3)

threshold1:同上

threshold2:同上

edges:同上

L2gradient:同上

一般来说,梯度小于阈值1则认为不是边缘,梯度大于阈值2则认为是强边缘,而介于阈值1和阈值2之间的则认为是弱边缘,只有弱边缘与强边缘相连,算法才会视该像素点为边缘进行保留,否则就不是从而抛弃掉。

而对于L2gradient参数,其将计算图像梯度方式导向不同的公式,一般会存在如下两种情况:

True:

51d26abc0ee0296ac949bb657433fa2b.png

False:

e18d62c81f8bcfa48b54c8d03c98341a.png

我们以如下摩天轮来举例说明Canny边缘检测算法的一般使用示例:

3a899c5cae017b1f4385144d85c0afce.png

示例代码如下:

# -*- coding:utf-8 -*-#!/usr/bin/env pythonimport cv2def detect_edges(img_path):    img_gray = cv2.imread(img_path, cv2.CV_LOAD_IMAGE_GRAYSCALE)    img_edges = cv2.Canny(img_gray, 150, 250)    cv2.imwrite("canny_edge_img.jpg", img_edges)    if __name__ == '__main__':    img_path = 'original.jpg'    detect_edges(img_path)

运行该示例代码后的输出结果如下:

37443f3cc2a9638b8621c1fbd3b8de87.png

实际上,两个阈值需要依据具体情况进行调试设定,否则会得到不一样的效果!

关于Canny边缘检测算法的更多详情,还可以访问如下链接获得:

http://en.wikipedia.org/wiki/Canny_edge_detector

转载地址:https://blog.csdn.net/weixin_33673142/article/details/112349276 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:测试用例优先级划分_新手该如何设计测试用例?
下一篇:李宏毅svm_李宏毅-深度学习

发表评论

最新留言

很好
[***.229.124.182]2024年04月17日 17时53分45秒