从散乱点评估/拟合椭圆

时间:2012-02-12 08:49:04

标签: algorithm math image-processing ellipse

这是合约。我有多个点(X,Y)形成一个'椭圆状'形状。

我想评估/拟合“最佳”椭圆并得到它的属性(a,b,F1,F2),或者只是椭圆的中心。

任何想法/线索都将不胜感激。

吉拉德。

5 个答案:

答案 0 :(得分:3)

有一个Matlab函数fit_ellipse可以完成这项工作。关于椭圆的正交距离拟合的方法也有this paper正交椭圆拟合的网络搜索也可能会出现很多其他资源。

答案 1 :(得分:2)

椭圆拟合方法提出:

ž。 L. Szpak,W。Chojnacki和A. van den Hengel。 保证椭圆拟合,具有置信区域和中心,轴和方向的不确定性度量。 J. Math。成像视觉,2015年。

您可能会感兴趣。它们提供了代数和几何椭圆的估计 参数,以及表示参数估计的不确定性的协方差矩阵。 它们还提供了计算与估计相关的平面95%置信区域的方法 这允许人们可视化椭圆拟合中的不确定性。

该论文的预印版本可在作者网站上找到(http://cs.adelaide.edu.au/~wojtek/publicationsWC.html)。 该方法的MATLAB实现也可供下载: https://sites.google.com/site/szpakz/source-code/guaranteed-ellipse-fitting-with-a-confidence-region-and-an-uncertainty-measure-for-centre-axes-and-orientation

答案 2 :(得分:0)

我将解释如何处理这个问题。我建议采用爬山的方法。首先计算点的重心作为起点,并以某种方式为a和b选择两个值(可能是任意正值)。你需要有一个拟合函数,我建议它返回给定椭圆上的点数(足够接近):

int fit(x, y, a, b)
  int res := 0
  for point in points
    if point_almost_on_ellipse(x, y, a, b, point)
      res = res + 1
    end_if
  end_for
  return res

现在从一些step开始。我会选择一个足够大的值来确保elipse的最佳中心永远不会超过第一点step。选择如此大的值是没有必要的,但算法中最慢的部分是接近最佳中心所需的时间,因此我认为更大的值更好。

所以现在我们有一些初始点( x y ), a b 和一个初始步骤。如果存在比其更好的邻居,则算法迭代地选择当前点的最佳邻居,否则减少步骤两次。这里的'最佳'是指使用fit函数。并且位置由四个值(x,y,a,b)定义,并且它的邻居是8:(x + -step,y,a,b),(x,y + -step,a,b),(x ,y,a + -step,b),(x,y,a,b + -step)(如果结果不够好,你可以通过对角线添加更多邻居 - 例如(x + -step,y + -step, a,b)等等)。这是你如何做到的

neighbours = [[-1, 0, 0, 0], [1, 0, 0, 0], [0, -1, 0, 0], [0, 1, 0, 0],
              [0, 0, -1, 0], [0, 0, 1, 0], [0, 0, 0, -1], [0, 0, 0, 1]]
iterate (cx, cy, ca, cb, step) 
  current_fit = fit(cx, cy, ca, cb)
  best_neighbour = []
  best_fit = current_fit
  for neighbour in neighbours
    tx = cx + neighbour[0]*step
    ty = cx + neighbour[1]*step
    ta = ca + neighbour[2]*step
    tb = cb + neighbour[3]*step
    tfit = fit(tx, ty, ta, tb)
    if (tfit > best_fit) 
      best_fit = tfit
      best_neighbour = [tx,ty,ta,tb]
    endif
  end_for
  if best_neighbour.size == 4
    cx := best_neighbour[0]
    cy := best_neighbour[1]
    ca := best_neighbour[2]
    cb := best_neighbour[3]
  else 
    step = step * 0.5
  end_if

然后继续迭代,直到step的值小于给定的阈值(例如1e-6)。我已经用伪代码编写了所有内容,因为我不确定您要使用哪种语言。

无法保证以这种方式找到的答案将是最佳的,但我相信它将足够好近似。

以下是关于hill climbing的文章。

答案 3 :(得分:0)

我认为Wild Magic库包含一个椭圆拟合函数。 article有方法描述

答案 4 :(得分:0)

问题在于定义“最佳”。什么是最好的情况?面积最小的椭圆,包含n%的pointS?

如果根据概率定义“最佳”,则可以简单地使用点的协方差矩阵,并计算误差椭圆。

此“多元高斯分布”的误差椭圆将包含与您决定的任何置信区间相对应的点。

许多计算软件包可以计算协方差,以及相应的特征值和特征向量。椭圆的角度是x轴和对应于最大特征值的特征向量之间的角度。半轴是特征值的倒数。

如果你的例程返回归一化的所有东西(它应该),那么你可以决定用什么因子来乘以所有东西来获得alpha置信区间。