this 용지에 이어 최소 제곱 원 피팅을 구현하려고합니다 (게시 할 수 없습니다). 논문은 특정 점 (Xi)과 원상의 대응 점 (Xi ') 사이의 유클리드 거리 (Xi ")로서 기하학적 오차를 계산함으로써 원을 적합시킬 수 있다고 기술하고있다. Xc (원의 중심 인 좌표의 벡터)와 R (반경)의 세 가지 매개 변수가 있습니다. 그러나MATLAB Optimization Toolbox를 사용하여 최소 제곱 원 피팅
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 코드 (이 이미지에 표시된대로 내가 원,하지 구에 맞게 노력하고 있습니다)를 내놓았다 너무 좋지 않습니다. 좋은 매개 변수 벡터로 시작하면 알고리즘은 첫 번째 단계에서 끝나기 때문에 (지역 최소값이 있어야합니다), 시작 지점을 잡음이있는 원으로 교란하면 피팅이 멈 춥니 다. 매우 큰 오류. 나는 내 구현에서 뭔가를 간과했는지 확신한다.