我想了解由Fitzgibbon,Pilu和Fisher(由Halir和Flusser改進)開發的直接最小二乘橢圓擬合算法中的歸一化和「非歸一化」步驟。直接橢圓擬合後橢圓係數的非歸一化
編輯:添加了更多關於理論的細節。混淆源於哪些特徵值問題?
短理論:
橢圓是由隱式二階多項式(一般圓錐方程)所表示:
其中:
要限制本一般圓錐爲橢圓,係數必須滿足二次約束:
這相當於:
其中C是零矩陣以外:
設計矩陣d是由所有數據點X子的i。
的距離的圓錐和數據點可以由廣義特徵值問題(一些理論已被省略)來表達之間的最小化:
表示:
現在,我們有系統:
如果我們解決了這個系統,對應於一個正特徵值特徵向量是正確答案。
的代碼:
代碼在這裏片段是直接從由作者提供的MATLAB代碼: http://research.microsoft.com/en-us/um/people/awf/ellipse/fitellipse.html
的數據輸入是一系列(X,Y)點。這些點通過減去平均值和除以標準偏差(在這種情況下,計算爲範圍的一半)來標準化。我假設這種規範化可以更好地擬合數據。
% normalize data
% X and Y are the vectors of data points, not normalized
mx = mean(X);
my = mean(Y);
sx = (max(X)-min(X))/2;
sy = (max(Y)-min(Y))/2;
x = (X-mx)/sx;
y = (Y-my)/sy;
% Build design matrix
D = [ x.*x x.*y y.*y x y ones(size(x)) ];
% Build scatter matrix
S = D'*D; %'
% Build 6x6 constraint matrix
C(6,6) = 0; C(1,3) = -2; C(2,2) = 1; C(3,1) = -2;
[gevec, geval] = eig(S,C);
% Find the negative eigenvalue
I = find(real(diag(geval)) < 1e-8 & ~isinf(diag(geval)));
% Extract eigenvector corresponding to negative eigenvalue
A = real(gevec(:,I));
在此之後,歸一化反轉的係數:
par = [
A(1)*sy*sy, ...
A(2)*sx*sy, ...
A(3)*sx*sx, ...
-2*A(1)*sy*sy*mx - A(2)*sx*sy*my + A(4)*sx*sy*sy, ...
-A(2)*sx*sy*mx - 2*A(3)*sx*sx*my + A(5)*sx*sx*sy, ...
A(1)*sy*sy*mx*mx + A(2)*sx*sy*mx*my + A(3)*sx*sx*my*my ...
- A(4)*sx*sy*sy*mx - A(5)*sx*sx*sy*my ...
+ A(6)*sx*sx*sy*sy ...
]';
在這一點上,我不知道發生了什麼。爲什麼A(d,e,f)的最後三個係數的非標準化取決於前三個係數?你如何在數學上顯示這些非標準化方程式來自哪裏?
非歸一化中的2和1係數使我相信約束矩陣必須以某種方式參與。
請讓我知道,如果需要更多的細節方法......它似乎我失蹤瞭如何規範化傳播通過矩陣和特徵值問題。
任何幫助表示讚賞。謝謝!
看起來很不錯的解釋 – Leo
@Leo謝謝你! –