我有一个逻辑矩阵:
0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0
0,0,0,1,1,1,1,1,0,0,0
0,0,0,1,1,1,1,1,1,0,0
0,0,1,1,1,1,1,1,1,0,0
0,0,1,1,1,1,1,1,1,0,0
0,0,1,1,1,1,1,1,1,0,0
0,0,0,1,1,1,1,1,1,0,0
0,0,0,0,1,1,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0
我想尽可能地拟合椭圆并计算误差。误差可能是原始数据和找到的最佳椭圆之间的元素差异。
我见过以下方法:MATLAB曲线拟合(类椭圆)
但我不确定这是最短的方法。
您建议如何找到最接近的椭圆逻辑矩阵?
求椭圆6自由度参数:
%get edge locations
md = m-imerode(m,ones(3));
md = padarray(md,10);axis equal
%find edges x,y
[y,x] = find(md);
%fit to Q = a*x^2 + b*y^2 + 2*c*x*y + 2*d*x + 2*e*y + f
H=[x.*x y.*y 2*x.*y x y x*0+1];
[v,g]=eig(H'*H);
a = v(1,1);
b = v(2,1);
c = v(3,1);
d = v(4,1);
e = v(5,1);
f = v(6,1);
[xg, yg] = meshgrid(1:size(md,2),1:size(md,1));
ev = a*xg.^2+b*yg.^2+2*c*xg.*yg+d*xg+e*yg+f;
imagesc(ev);axis equal
我首先会提取你的逻辑椭圆的边界。对于
[n,m]=size(M)
,迭代以下函数,从 i=2 到 n-1,j=2 到 m-1。它会给你“边界矩阵”,其中边界用 1 表示,其他用 0 表示。然后使用MATLAB Curve Fitting (Ellipse like)中描述的方法得到椭圆方程的系数。请注意,矩阵索引从左上角开始。因此,您可能需要根据您想要的原点所在位置修改索引顺序。
function [ bd ] = logical_neighbor( loM, i, j )
bd=0;
if loM(i,j) == 0
return;
else
for ni=1:3
for nj=1:3
if loM(i-2+ni,j-2+nj) == 0
bd= 1;
return;
end
end
end
end
end