如何纠正检测到的椭圆形?

10

我正在尝试在图像中查找圆并将其扭曲回一个规范视图(即好像在看向中心一样)。然而,在透视变换下,一般的圆投影到椭圆上。因此,我首先检测椭圆,大致按照以下步骤进行(使用OpenCV):

1. Find contours in the image
2. Estimate area of contour
3. Fitting a bounded box to contour and estimating area by width/2 * height/2 * PI (area of ellipse)
4. checking if area of contour and estimated area of ellipse is < a threhsold

假设我用这种方法找到了一个椭圆,如何将其矫正回圆形,以使我“撤销”透视变换(虽然不是在平面旋转中进行,但我猜这是不可能的)。例如,如果它是一个矩形,我只需计算从正立矩形的4个角到检测到的投影矩形的单应性。对于椭圆,我不知道该怎么做,任何帮助都将不胜感激。谢谢!

你可以假设椭圆周围有一个边界矩形(宽度/高度通常是椭圆的参数),并将其投影到一个正方形中?!? - Micka
2
@Micka 你需要检测一个比矩形更复杂的边界四边形,因为在一般的透视变换下,正方形不会变形成矩形。 - BConic
2个回答

7
透视变换确实可以将圆形转变为椭圆,但它的轴不同于初始圆形的轴,如下图所示:
Ellipse vs Perspective circle
(来源: brian-curtis.com) 你可以参考此链接了解详细演示。因此,椭圆的边界矩形不是通过透视变换的初始正方形的图像得到的。 编辑: 这意味着你观察到的椭圆的中心和轴不是原始圆形的中心和轴通过透视映射得到的图像。我试图制作一个更清晰的插图:
enter image description here 在这张图片上,我用绿色表示原始圆形的轴和中心,在透视变换后,用红色表示椭圆的轴和中心。在这个特定的例子中,垂直轴没有被透视映射变形,但在一般情况下将会被变形。因此,通过透视变换使圆形变形为椭圆,但你看到的轴和中心并不是原始圆形的轴和中心。
因此,你不能仅仅使用椭圆上的上、下、左、右点(红色点,可以从椭圆上轻松检测出来)来映射这些点到圆形上的上、下、左、右点,因为它们在透视映射下不对应(绿色点对应,但无法从椭圆上轻松检测出来)。
最终,我不认为能够从单个检测到的椭圆估计透视映射。

我能否不仅仅在椭圆上找到顶部、底部、左侧和右侧点(由中心的宽度和高度给出),并将这些点映射到半径为r的圆的顶部、底部、左侧和右侧,从而找到单应性矩阵?当然,这种方法可能不正确地进行平面旋转,但是可以简单地在平面内将扭曲的椭圆旋转90度。 - Aly
@Aly,请查看我的回答编辑。更多关于您想要做什么的细节将有助于找到解决方法。也许您可以在圆内画一个十字,以便检测其真正的中心,从而更容易地进行检测? - BConic
@Aly 另外,根据您所需的精度,使用观察到的椭圆的轴和中心来近似真实圆的轴和中心可能已经足够了。 - BConic
不错的回答。如果您添加更多示例,就可以显示缩短的圆形图像是模棱两可的。我在想边界梯形是否总会有与扁平椭圆轴线平行的底线? - Micka

6

这似乎是一个不确定的问题。

矩形投影提供了8个未知数(单应性系数)的8个方程。

对于椭圆,您只能检索中心坐标(2 DOF),轴(2 DOF)和轴方向(1 DOF)。


2
超短的证明表明这是不可能的,真棒! - BConic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接