का उपयोग कर कम वर्ग सर्कल फिटिंग मैं this पेपर के बाद कम से कम वर्ग सर्कल फिटिंग को लागू करने की कोशिश कर रहा हूं (क्षमा करें मैं इसे प्रकाशित नहीं कर सकता)। पेपर कहता है, कि हम एक विशिष्ट बिंदु (Xi) और सर्कल (Xi ') के इसी बिंदु के बीच euclidean दूरी (Xi') के रूप में ज्यामितीय त्रुटि की गणना करके, एक सर्कल फिट कर सकते हैं। हमारे पास तीन पैरामीटर हैं: एक्ससी (सर्कल के केंद्र का समन्वय करने वाला एक वेक्टर), और आर (त्रिज्या)। तथापिMATLAB अनुकूलन टूलबॉक्स
function [ circle ] = fit_circle(X)
% Kör paraméterstruktúra inicializálása
% R - kör sugara
% Xc - kör középpontja
circle.R = NaN;
circle.Xc = [ NaN; NaN ];
% Kezdeti illesztés
% A köz középpontja legyen a súlypont
% A sugara legyen az átlagos négyzetes távolság a középponttól
circle.Xc = mean(X);
d = bsxfun(@minus, X, circle.Xc);
circle.R = mean(bsxfun(@hypot, d(:,1), d(:,2)));
circle.Xc = circle.Xc(1:2)+random('norm', 0, 1, size(circle.Xc));
% Optimalizáció
options = optimset('Jacobian', 'on');
out = lsqnonlin(@ort_error, [circle.Xc(1), circle.Xc(2), circle.R], [], [], options, X);
end
%% Cost function
function [ error, J ] = ort_error(P, X)
%% Calculate error
R = P(3);
a = P(1);
b = P(2);
d = bsxfun(@minus, X, P(1:2)); % X - Xc
n = bsxfun(@hypot, d(:,1), d(:,2)); % || X - Xc ||
res = d - R * bsxfun(@times,d,1./n);
error = zeros(2*size(X,1), 1);
error(1:2:2*size(X,1)) = res(:,1);
error(2:2:2*size(X,1)) = res(:,2);
%% Jacobian
xdR = d(:,1)./n;
ydR = d(:,2)./n;
xdx = bsxfun(@plus,-R./n+(d(:,1).^2*R)./n.^3,1);
ydy = bsxfun(@plus,-R./n+(d(:,2).^2*R)./n.^3,1);
xdy = (d(:,1).*d(:,2)*R)./n.^3;
ydx = xdy;
J = zeros(2*size(X,1), 3);
J(1:2:2*size(X,1),:) = [ xdR, xdx, xdy ];
J(2:2:2*size(X,1),:) = [ ydR, ydx, ydy ];
end
फिटिंग
:
मैं निम्नलिखित MATLAB कोड (ध्यान दें कि मैं हलकों, क्षेत्रों नहीं फिट करने के लिए के रूप में यह छवियों से दिखाया जाता है कोशिश कर रहा हूँ) के साथ आया था बहुत अच्छा नहीं है: अगर मैं अच्छे पैरामीटर वेक्टर से शुरू करता हूं तो एल्गोरिदम पहले चरण में समाप्त हो जाता है (इसलिए एक स्थानीय मिनीमा जहां यह होना चाहिए), लेकिन अगर मैं शुरुआती बिंदु (एक निर्बाध सर्कल के साथ) को परेशान करता हूं तो फिटिंग बंद हो जाती है बहुत बड़ी त्रुटियां मुझे यकीन है कि मैंने अपने कार्यान्वयन में कुछ अनदेखा कर दिया है।