python - OpenCV canny 边缘检测在理想正方形上无法正常工作

标签 python opencv edge-detection canny-operator

我正在使用这个 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

但是两个边缘(上边缘和左边缘)总是移动一个像素。
精明边缘检测的输出是,
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

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

最佳答案

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

挖后到the documentation我遇到了许多在幕后发生的操作。

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

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

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

关于python - OpenCV canny 边缘检测在理想正方形上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43000305/

相关文章:

c# - Python 的 'in' 运算符相当于 C#

c++ - OpenCV 中的范数函数

image-processing - 检测照片中纸张角的算法

python - 如何刷新tkinter条目值?我遇到一键延迟

python - 在pandas中填写时间数据

python - 使用 Python 中的 Security.framework 类型

opencv - 如何使用 HoughLinesP 检测 OpenCV 中的水平线?

OpenCV VideoCapture 读取问题

image-processing - 非常简单的边缘检测

c++ - 霍夫线变换 - 45 度角的伪影