在OpenCV中使用Canny边缘检测

边缘检测是非常常见和广泛使用的图像处理,对于许多不同的计算机视觉应用非常必要,如数据提取,图像分割,在更细粒度的特征提取和模式识别中。它降低了图像中的噪声和细节数量,但保留了图像的结构。

Python中的Canny边缘检测是计算机视觉中最流行的边缘检测方法之一。以下是Canny边缘检测的步骤:

1.使用高斯平滑来减少噪声

2.计算梯度

3.应用非极大值抑制以减少噪声

4.找到上下阈值

5.应用阈值。

幸运的是,OpenCV库有cv2.canny()函数,可为我们执行Canny边缘检测。

在本文中,我们将直接使用OpenCV执行边缘检测。

import cv2 
import matplotlib.pyplot as plt 

我们将使用以下图片进行今天的教程:

图片

Canny边缘检测的第一步是应用高斯模糊。在模糊之前,将图像转换为灰度也很重要:

image = cv2.imread("meter.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

现在,我们可以直接将cv2.Canny()方法应用于这个模糊的图像。

很简单。它需要三个参数:图像本身,较低的阈值和较高的阈值。选择这些阈值是棘手的。对于每个图像,这些阈值都将是不同的。

对于此图像,我们将尝试三个不同的范围并观察发生了什么:

wide = cv2.Canny(blurred, 50, 200)
mid = cv2.Canny(blurred, 30, 150)
tight = cv2.Canny(blurred, 210, 250)

在这里,我使用了三种不同类型的范围。在wide中,阈值的值具有宽范围。在mid中,阈值的值在中间范围内,在tight中,阈值的值具有紧密的范围,仅为210到250,非常接近。

为了检查图像,我只保存了这三个图像(wide,mid和tight)。

以下是wide的结果:

图片

这是mid范围的结果:

图片

tight的结果:

图片

如果我们注意这三张图片,我相信中等范围给出了更加坚实的边缘。

记住,你不能一概而论这些范围。对于不同的图像,可能需要使用不同的范围。这就是为什么这么棘手的原因。

好消息是,有一些可用的统计技巧可以用来找到下限和上限阈值,而不需要像我们之前看到的试错方法那样。

这是自动边缘检测的函数:

def auto_canny_edge_detection(image, sigma=0.33):
    md = np.median(image)
    lower_value = int(max(0, (1.0-sigma) * md))
    upper_value = int(min(255, (1.0+sigma) * md))
    return cv2.Canny(image, lower_value, upper_value)

在上面的函数中,首先找到图像数组中的中位像素值。然后使用这个中位数和一个常数sigma值,可以找到下限和上限阈值。

这里使用了一个sigma值为0.33。在大多数应用程序中,0.33作为sigma值是有效的。但在某些情况下,如果它不能给出好的结果,请尝试一些其他的sigma值。

这是我们之前创建的模糊图像上使用auto_canny_edge_detection方法的结果:

auto_edge = auto_canny_edge_detection(blurred)
cv2.imwrite("auto.jpg", auto_edge)

这就是auto.jpg的样子:

图片

正如你所看到的,边缘在这里很清晰地出现了,而不需要尝试太多的阈值。

结论

在我看来,自动边缘检测函数为我们提供了最好的结果。

作者:磐怼怼 | 来源:公众号——深度学习与计算机视觉

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论