精密过滤器的边角不锋利

时间:2016-01-27 02:58:21

标签: opencv opencv3.0 contour shapes edge-detection

我正在尝试使用Canny过滤器检测图像中的边缘。我已经能够检测到图像,但角落不是很尖锐(以红色圆圈突出显示)。令人惊讶的是,与其他角落相比,第一个角落很锋利而且没有烧坏。为什么会发生这种情况以及如何避免?

请查看附件图片。enter image description here

我的代码:

  

edges = cv2.Canny(image,0,255)

我没有应用任何模糊,因为它使角落更糟。此外,Canny的最小值和最大值的变化也没有任何差别

2 个答案:

答案 0 :(得分:0)

Canny算法包括高斯平滑,这会略微影响角落的渐变。 https://en.wikipedia.org/wiki/Canny_edge_detector

如果您知道所有图像都是无噪声的图像,例如您提供的样本图像,则应考虑使用图像的拉普拉斯图像。

答案 1 :(得分:0)

除了像提到的那样应用模糊之外,Canny算法还被设计为使边缘变薄。从二进制映像开始,您就无法在Canny建立于此的假设下进行操作。

如果已知图像是二进制图像,则可以eroding找到要查找的边缘,然后从原始图像中减去。除了为您提供预期的结果外,它可能还会更快。

用于生成图像的C ++:

auto image = cv::imread("binary.png", -1);
cv::Mat eroded_image, edge_image;

cv::erode(image, eroded_image, cv::Mat());

edge_image = image - eroded_image;

或按照OpenCV's tutorial page中所述的python(已编辑内核大小):

kernel = numpy.ones((3,3), numpyp.uint8)
eroded_image = cv2.erode(image, kernel)

Original image enter image description here

您还可以使用同一教程中描述的形态梯度,该步骤基本上是相同的操作,只是从膨胀图像中减去原始图像而不是原始图像。这样可以提供较粗的边缘,但由于它以强度的增加为中心,因此可以认为是“更正确的”。