我有一个逻辑矩阵:
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 Curve Fitting (Ellipse-like)
但我不确定这是最简短的方法。
您如何建议找到最接近的椭圆逻辑矩阵?
答案 0 :(得分:1)
找到椭圆6 DOF参数:
%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
答案 1 :(得分:0)
我会先提取逻辑椭圆的边界。对于[n,m]=size(M)
,从i = 2到n-1,j = 2到m-1迭代以下函数。它将为您提供“边界矩阵”,其中边界由1表示,0表示其他边界矩阵。然后使用here中描述的方法得到椭圆方程的系数。请注意,矩阵索引从左上角开始。因此,您可能需要根据您希望原点的位置修改索引顺序。
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