将椭圆拟合到逻辑矩阵

问题描述 投票:0回答:2

我有一个逻辑矩阵:

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曲线拟合(类椭圆)

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

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

matlab
2个回答
1
投票

求椭圆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

0
投票

我首先会提取你的逻辑椭圆的边界。对于

[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
© www.soinside.com 2019 - 2024. All rights reserved.