2013-06-28 41 views
2

我试图将两个椭圆拟合到恰好是身体的顶部视图/轮廓。为简单起见,让我们用下面的例子:将两个椭圆拟合成一个身体的轮廓

enter image description here

正如你所看到的,这个简单的身体是由长核(蓝色)和头部(红色)。实际上,这个轮廓将是一种颜色,我在这里只是使用两种颜色来进行可视化。

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

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

enter image description here

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

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

EDIT3: 如何制定这两个椭圆的约束任何暗示位于在彼此编程有一定的关系?例如:我知道小椭圆将总是位于大椭圆长轴的一端。此外,小椭圆只能相对于大椭圆旋转+ - 90度。

+0

你有办法找到“脖子”的坐标吗? –

+0

@ Zim-ZamO'Pootertoot不,我拥有的是完整的大纲。 – memyself

+0

轮廓由两个不同的颜色组成,如示例中所示? – bla

回答

1

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

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

接下来,使用修改的二进制搜索检测“颈部”的位置。 (在这里我假定你的边界椭圆有一个垂直方向,就好像这个图形站立或站立在它的头上)。生成两组边界椭圆:一个椭圆从图的顶部到1 /该图的4点(意思是如果通过边界椭圆绘制直线,则1/4点位于左上角点和中间点之间),并且具有从图的1/4点到底部的椭圆,和一个从图的顶部到3/4点的椭圆以及从图的3/4点到底部的椭圆;总面积较小的一组椭圆是更好地封装头部的一组椭圆。继续搜索(例如,下一个测试从顶部到1/8点/ 7/8点,和/或从顶部到3/8点/ 5/8点的椭圆),直到最小化总边界该组椭圆的面积;椭圆相遇的点是颈部。 (不需要也是对此很精确,如果你把脖子放在34/256th点或者35/256th点,可能没有多大区别。)

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

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

1

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

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

1
  1. 找出距离最远的两点。一个属于Ellipse1,另一个属于Ellipse2。
  2. 检查这些点的最近邻居,以获得属于Ellipse1的5个点和5到Ellipse2。
  3. 检出Wikipedia,并选择您最喜欢的椭圆公式。
  4. 使用初等代数,对于每个椭圆,插入点以获得5个联立方程,并解决这些问题以获得定义椭圆的5个参数。

编辑

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

+0

这种方法不稳健,因为它假定没有噪音的完美椭圆,否则人们会想尽可能多地使用点来计算椭圆。 – bla

+0

@natan - 是的,如果精确方程求解不能解决问题,则使用[最佳拟合算法](http://skotagiri.wordpress.com/2010/06/19/c- implementation-for-fit-取而代之的是一个椭圆组)。 – mbeckish

+0

@mbeckish所以我需要在极端点附近2x5点?使用这两个椭圆位于彼此的某个位置的约束是否有意义? – memyself