【问题标题】:OpenCV canny edge detection is not working properly on ideal squareOpenCV精明边缘检测在理想正方形上无法正常工作
【发布时间】:2017-08-17 10:32:43
【问题描述】:

我正在使用这个 15*15 像素的二进制方形图像。

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

我正在应用 openCV(2.7 版)提供的 canny 边缘检测 用于物体尺寸测量。我的预期输出应该是这样的,

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

但是两条边(上边和左边)总是移动一个像素。 canny边缘检测的输出是,
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1 1 1 1 1 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

为什么会发生这种像素偏移?
有什么办法可以避免这种情况。 (我无法在输出后手动调整像素偏移,因为我必须对不规则形状使用边缘检测)无论奇数/偶数像素如何,都会发生相同的偏移。

【问题讨论】:

  • 如果你用的是Python,可以试试skimage.feature.canny做对比吗?
  • 改用 findContours 函数
  • 真的很有帮助的问题
  • @Catree 我试过 skimage 精明。对于给定的理想平面,它运行良好并且边缘没有移动。所以我会尝试其他形状。谢谢你的建议。
  • @AdityaKanade 从skimage 文档中,您可以访问相应的source code(此处为master 分支)。如果 OpenCV Canny() 的结果不是像素完美的,我不会感到惊讶,因为这个库的目的也是为了获得良好的性能(findContours() 应该返回更准确的结果)。如果您真的想发现差异,我建议您在两个版本的源代码中打印每个中间结果并进行比较。

标签: python opencv edge-detection canny-operator


【解决方案1】:

乍一看,当我遇到这个问题时,我感到很惊讶。此外,我不相信 Canny 边缘检测会如此具有欺骗性。所以我拍了一张类似的图片,并在上面应用了 Canny 边缘。令我惊讶的是,我遇到了您面临的同样问题。为什么会这样?

在深入了解the documentation 之后,我发现了许多幕后操作。

文档声称 高斯滤波 是为了减少噪音。嗯,这是真的。但这也会模糊图像中存在的现有边缘。所以当你模糊一个完美的正方形/矩形时,它往往有弯曲的角落。

高斯滤波之后,下一步是寻找边缘梯度。如前所述,由于模糊(高斯滤波),方形/矩形的完美边缘已经消失。剩下的是圆形/弯曲的边缘。寻找圆形/弯曲边缘上的渐变强度永远不会产生完美的方形/矩形边缘。我可能错了,但我想这是我们在执行 Canny 边缘检测时没有得到完美边缘的主要原因。

如果你想要一个完美的边缘,我的建议是尝试寻找轮廓(如 Micka 所建议的那样)并绘制一个边界矩形。

【讨论】:

  • 谢谢你的回答,我想问的另一件事是为什么左上角与其他三个角不同。
  • 这仍然让我感到困惑:D
猜你喜欢
  • 2017-06-13
  • 2019-01-22
  • 2012-10-11
  • 1970-01-01
  • 2016-01-25
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多