边缘检测是非常常见和广泛使用的图像处理,对于许多不同的计算机视觉应用非常必要,如数据提取,图像分割,在更细粒度的特征提取和模式识别中。它降低了图像中的噪声和细节数量,但保留了图像的结构。
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的样子:
正如你所看到的,边缘在这里很清晰地出现了,而不需要尝试太多的阈值。
结论
在我看来,自动边缘检测函数为我们提供了最好的结果。
☆ END ☆
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。
↓扫描二维码添加小编↓