最小二乘法拟合圆弧

步骤:(1)分离出目标(如下二值图像中的白色区域);
(2)提取目标边缘坐标;
(3)查找所要拟合的边缘坐标;
(4)最小二乘法拟合圆弧。
本文要拟合的边缘如实验图中绿色区域,根据检测出的坐标特点提取出所要拟合的边缘坐标。
实验图和结果图如下所示:
在这里插入图片描述
MATLAB实现:

clear; close all; clc;
Origin=im2gray(imread('circle.png'));
BW=edge(Origin,'canny');
[y,x] = find(BW>0);
Coordinate=[x y];
j=0;
delta=100;  %控制坐标范围
%提取所要拟合的边缘坐标
for i=Coordinate(1,1)+delta:Coordinate(end,1)-delta
    index=find(Coordinate(:,1)==i, 1, 'last' );
    j=j+1;
    X(j)=Coordinate(index,1);
    Y(j)=Coordinate(index,2);
end
 
X = X';	%所有边缘点的X坐标
Y = Y';	%所有边缘点的Y坐标

%最小二乘法圆拟合
N = size(X,1);    
C = (N*sum(X.^2)-sum(X).^2);
D = (N*sum(X.*Y)-sum(X)*sum(Y));
E = N*sum(X.^3)+N*sum(X.*Y.^2)-sum(X.^2+Y.^2)*sum(X);
G = (N*sum(Y.^2)-sum(Y)*sum(Y));
H = N*sum(X.^2.*Y)+N*sum(Y.^3)-sum(X.^2+Y.^2)*sum(Y);

a = (H*D-E*G)/(C*G-D.^2);
b = (H*C-E*D)/(D.^2-G*C);
c = -(sum(X.^2+Y.^2)+a*sum(X)+b*sum(Y))/N;

x0 = -a/2;	%圆心X坐标
y0 = -b/2;	%圆心Y坐标
R = sqrt(a.^2+b.^2-4*c)/2;	%半径

figure;imshow(Origin);
alpha=0:pi/50:2*pi; %角度[0,2*pi]
hold on;
x=x0+R*cos(alpha);
y=y0+R*sin(alpha);
plot(x,y,'-r','LineWidth',2);

版权声明:本文为weixin_39539602原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。