将椭圆拟合到逻辑矩阵

时间:2014-02-24 16:01:48

标签: matlab

我有一个逻辑矩阵:

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)

但我不确定这是最简短的方法。

您如何建议找到最接近的椭圆逻辑矩阵?

2 个答案:

答案 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