2014-02-24 97 views
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,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

我認爲[這個文件交換提交(http://www.mathworks.com/matlabcentral/fileexchange/34767-a-suite-of最小邊界對象)對於這項任務來說非常有效。 – chappjc

回答

0

我會先抽出你的邏輯橢圓的邊界。迭代以下函數從i = 2到n-1,j = 2到m-1,對於[n,m]=size(M)。它會給你「邊界矩陣」,其中邊界由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 
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