这是交易。我有多个点(X,Y)形成“椭圆形”形状。
我想评估/拟合可能的“最佳”椭圆并获得它的属性(a、b、F1、F2),或者只是椭圆的中心。
任何想法/线索将不胜感激。
吉拉德。
这是交易。我有多个点(X,Y)形成“椭圆形”形状。
我想评估/拟合可能的“最佳”椭圆并获得它的属性(a、b、F1、F2),或者只是椭圆的中心。
任何想法/线索将不胜感激。
吉拉德。
有一个 Matlab 函数fit_ellipse可以完成这项工作。还有这篇关于椭圆正交距离拟合方法的论文。对正交椭圆拟合的网络搜索也可能会出现许多其他资源。
椭圆拟合方法由:
ZL Szpak、W. Chojnacki 和 A. van den Hengel。 保证椭圆拟合,具有置信区域和中心、轴和方向的不确定性度量。 J.数学。影像视觉,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-测量中心轴和方向
我将解释我将如何解决这个问题。我建议采用爬山的方法。首先计算点的重心作为起点,并以某种方式为 a 和 b 选择两个值(可能是任意正值)。您需要有一个 fit 函数,我建议它返回位于给定椭圆上的点数(足够接近):
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
. 我会选择一个足够大的值,以确保椭圆的最佳中心永远不会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)。我已经用伪代码编写了所有内容,因为我不确定您要使用哪种语言。
不能保证以这种方式找到的答案是最佳的,但我很确定这将是足够好的近似值。
这是一篇关于爬山的文章。
我认为Wild Magic库包含一个椭圆拟合的功能。有文章有方法说明
问题是定义“最佳”。在你的情况下什么是最好的?包含 n% 点的面积最小的椭圆?
如果您根据概率定义“最佳”,则可以简单地使用点的协方差矩阵,并计算误差椭圆。
这种“多元高斯分布”的误差椭圆将包含与您决定的任何置信区间相对应的点。
许多计算包可以计算协方差及其对应的特征值和特征向量。椭圆的夹角是x轴与最大特征值对应的特征向量的夹角。半轴是特征值的倒数。
如果您的例程返回所有归一化的内容(它应该返回),那么您可以决定通过什么因素将所有内容相乘以获得 alpha 置信区间。