【问题标题】:fitting two ellipses to outline of a body将两个椭圆拟合到身体的轮廓
【发布时间】:2013-06-28 14:32:53
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 你有办法找到“脖子”的坐标吗?
  • @Zim-ZamO'Pootertoot 不,我只有完整的大纲。
  • 轮廓是否像示例中那样由两种不同的颜色组成?
  • @natan 不,轮廓由一种颜色组成。我只是在这里使用了两种颜色来更好地形象化我的意思。

标签: java python algorithm matlab curve-fitting


【解决方案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)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以尝试使用Hough transform 隔离省略号。有一些 FEX 工具值得尝试,例如 Ellipse Detection Using 1D Hough Transform

      【讨论】:

        【解决方案4】:
        1. 找到彼此最远的两个点。一个属于 Ellipse1,另一个属于 Ellipse2。
        2. 检查这些点的最近邻,得到 5 个点属于 Ellipse1,5 个点属于 Ellipse2。
        3. 查看Wikipedia,然后选择您最喜欢的椭圆方程。
        4. 使用初中代数,对于每个椭圆,插入点以获得 5 个联立方程,然后求解这些方程以获得定义椭圆的 5 个参数。

        编辑

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

        【讨论】:

        • 这种方法不可靠,因为它假设完美的椭圆没有噪音,否则人们会想使用尽可能多的点来计算椭圆。
        • @natan - 是的,如果无法解决精确方程,请改用best-fit algorithm
        • @mbeckish 所以我只需要在极值点附近 2x 5 个点吗?也使用这两个椭圆彼此位于某个位置的约束不是有意义吗?
        • @memyself - 检查一下,看看您是否可以可靠地识别属于任一椭圆的点。如果您能够将点精确地拟合到椭圆方程,那么每个椭圆 5 个点就足够了。如果不是,并且您需要执行“最佳拟合”算法,那么您使用的点越多,椭圆越接近与所有点相交。
        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 2021-01-08
        相关资源
        最近更新 更多