2

我正在尝试将两个椭圆拟合到恰好是身体的顶视图/轮廓。为简单起见,让我们使用以下示例:

在此处输入图像描述

如您所见,这个简单的身体由一个长核心(蓝色)和一个头部(红色)组成。实际上,这个轮廓是一种颜色,我在这里只是使用两种颜色进行可视化。

我知道如何将单个椭圆拟合到该轮廓的任一部分,但我不知道如何拟合两个椭圆,因为这两个椭圆实际上是连接的。在这种特殊情况下,约束是两个椭圆永远不会分开,并且椭圆 1 和椭圆 2 之间只能有一定的角度。

我很感激任何告诉我如何编写函数的指针,以便在调用magic_fitting_function(body_outline)程序后返回给我两个底层椭圆的坐标:

在此处输入图像描述

EDIT1: 可以使解决这个问题更容易的最低要求是什么?例如,如果给我一分、两分等,那将如何简化问题?

EDIT2: 我正在寻找一种独立于编程语言的解决方案。

EDIT3: 有关如何以编程方式制定这两个椭圆的约束的任何提示?例如:我知道小椭圆总是位于大椭圆长轴的一端。加上小椭圆只能相对于大椭圆旋转 +- 90 度。

4

4 回答 4

1

我从来没有解决过这个问题,所以我只是抛出一个建议。

首先,为整个图形生成一个边界椭圆,以确定最高点和最低点是什么。(如果您有更好的方法找到这些点,则可能不需要此步骤。)

接下来,使用修改后的二分搜索检测“颈部”的位置。(在这里,我假设您的边界椭圆具有垂直方向,就好像人物站立或站立在头上一样。)生成两组边界椭圆:一组椭圆从图形顶部到 1/图的 4 点(意思是如果你画一条穿过边界椭圆的线,那么 1/4 点在左上角和中间之间),从 1/4 点到图底部有一个椭圆,一个从图的顶部到 3/4 点有一个椭圆,从 3/4 点到图的底部有一个椭圆;总面积较小的一组椭圆是更好地封装头部的椭圆。继续搜索(例如 接下来测试从顶部到 1/8 点 / 7/8 点和/或从顶部到 3/8 点 / 5/8 点的椭圆),直到你最小化了集合的总边界区域椭圆; 椭圆相交的点是颈部。(没必要精确了,如果将琴颈放在 34/256 点或 35/256 点,可能没有太大区别。)

要检测颈部,您可能需要使用边界框而不是边界椭圆。

最后,调整两个边界椭圆以满足它们的角度约束,例如以 5% 的增量移动它们的极值点(因此假设头部椭圆的极值点在 y 坐标 0 和 50 上,而体椭圆的极值点在在 y 坐标 50 和 200 上,调整它们,使它们的极端 y 坐标在 0 和 60 以及 40 和 200 上)。

于 2013-06-28T15:05:42.920 回答
1

您可以尝试使用Hough 变换隔离椭圆。有一些 FEX 工具值得尝试,例如这个Ellipse Detection Using 1D Hough Transform

于 2013-06-28T17:23:15.953 回答
1

如果您有完整的轮廓,您可以找到两个椭圆相交的位置 - 只需寻找轮廓的一阶导数变得不连续的两个尖角。然后,在这些角之间画一条直线。

直线一侧的所有内容都在椭圆 A 中,另一侧的所有内容都在椭圆 B 中。尖角在两个椭圆中。现在,只需将一个椭圆拟合到您找到的两个椭圆中的每一个,然后重新计算拟合椭圆相交的点。

于 2013-06-28T15:17:31.767 回答
1
  1. 找到彼此最远的两个点。一个属于 Ellipse1,另一个属于 Ellipse2。
  2. 检查这些点的最近邻,得到 5 个属于 Ellipse1 的点,5 个属于 Ellipse2。
  3. 查看Wikipedia并选择您最喜欢的椭圆方程。
  4. 使用初中代数,对于每个椭圆,插入点以获得 5 个联立方程,并求解这些方程以获得定义椭圆的 5 个参数。

编辑

我没有意识到这被标记为“matlab”。在这种情况下,一旦您确定了每个椭圆的一些点,就会有matlab 函数用于将这些点拟合到椭圆。

于 2013-06-28T17:02:23.303 回答