把两个椭圆拟合成一个物体的轮廓

2024-04-27 22:59:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在一个物体的顶视图/轮廓上加上两个椭圆。为了简单起见,我们使用以下示例:

enter image description here

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

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

我非常感谢任何能告诉我如何编写函数的指针,这样在调用magic_fitting_function(body_outline)之后,程序会返回两个底层椭圆的坐标:

enter image description here

编辑1: 什么是使解决这个问题更容易的最低要求?E、 如果给我1分、2分等等,那怎么可能简化问题呢?在

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

编辑3: 有没有关于如何用编程的方式来表达这两个省略号的约束条件的提示?E、 g:我知道小椭圆总是位于大椭圆长轴的一端。另外,小椭圆相对于大椭圆只能旋转+-90度。在


Tags: 编辑示例核心颜色可视化情况物体轮廓
3条回答

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

首先,为整个图形生成一个边界椭圆,以确定最上面和最下面的点是什么。(如果有更好的方法找到这些点,则不必执行此步骤。)

接下来,使用改进的二进制搜索来检测“颈部”的位置。(这里我假设你的边界椭圆有一个垂直方向,生成两组边界椭圆:一组具有从图形顶部到图形的1/4点的椭圆(意思是如果您通过边界椭圆绘制一条直线,则1/4点位于左上点和中间点之间),以及从1/4点到图形的底部,从图形顶部到3/4点有一个椭圆,从3/4点到图形底部有一个椭圆;总面积较小的一组椭圆是更好地封装头部的一组椭圆。继续搜索(例如,下一步测试一个椭圆,从顶部到1/8点/7/8点,和/或从顶部到3/8点/5/8点),直到最小化椭圆集的总边界区域;椭圆相交的点是颈部。(不必太精确,如果你把脖子放在34/256ths点或35/256ths点可能没什么区别。)

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

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

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

如果你有完整的轮廓,你可以找到两个椭圆相交的地方——只要找出轮廓的一阶导数变得不连续的两个锐角。然后,在这些角之间画一条直线。在

直线一边的所有东西都是椭圆A,另一边的所有东西都是椭圆B。锐角在两个椭圆中。现在,只需在找到的两个椭圆中各拟合一个椭圆,然后重新计算拟合椭圆相交的点。在

相关问题 更多 >