2014-10-03 42 views
0

說我們有不規則的形狀。我們如何才能獲得最適合這種形狀的ellipseregionprops是否適用?如果是這樣,你能指導我嗎?獲取不規則形狀的最佳橢圓擬合

謝謝。

+0

請問您可以添加這些省略的例子。 – kkuilla 2014-10-03 13:30:08

+1

如果你想使用regionprops,那麼這些參數可能是要走的路:Centroid,MajorAxisLength,MinorAxisLength,定位 – 2014-10-03 13:47:12

回答

2

好的,這裏有一些代碼讓你開始。這絕不是完美的,但這很有趣,我希望它能幫助你。代碼中最重要的部分實際上是由@Amro在這個偉大的答案中編寫的:check me!。我加入了Amro的代碼來繪製橢圓(謝謝Amro!)。

正如我在我的評論中提到的,您可以使用帶有幾個參數的regionprops來估計符合某種形狀的橢圓。名稱不言自明,可用於描述橢圓。下面是我看起來像一個馬鈴薯虛擬形狀:

enter image description here

我們將在regionprops使用的參數是:

  • 'Centroid'
  • 'MajorAxisLength'
  • 'MinorAxisLength'
  • 'Orientation'
  • 'PixelList'

像素列表用於繪製圖像的原始形狀。快速和骯髒的方式來看看適合多好。

所以這裏是代碼:

1)閱讀的圖像,將其轉換爲黑色和白色(即二進制),並應用regionprops:

clear all 
clc 

A = im2bw(imread('DummyEllipse.jpg')); 

s = regionprops(A,'Centroid','MajorAxisLength','MinorAxisLength','Orientation','PixelList') 

2)從S結構恢復參數。請注意,我從結構進入第二個元素,因爲第一個1對應於繪圖區的邊緣(我不知道如何稱呼它不好意思):

PixList = s(2).PixelList; 

x = s(2).Centroid(1); 
y = s(2).Centroid(2); 
a = s(2).MajorAxisLength/2; 
b = s(2).MinorAxisLength/2; 
angle = s(2).Orientation; 
steps = 50; 

3)提供這些參數AMRO碼來計算橢圓:

%# @param x  X coordinate 
%# @param y  Y coordinate 
%# @param a  Semimajor axis 
%# @param b  Semiminor axis 
%# @param angle Angle of the ellipse (in degrees) 

beta = angle * (pi/180); 
sinbeta = sin(beta); 
cosbeta = cos(beta); 

alpha = linspace(0, 360, steps)' .* (pi/180); 
sinalpha = sin(alpha); 
cosalpha = cos(alpha); 

X = x + (a * cosalpha * cosbeta - b * sinalpha * sinbeta); 
Y = y + (a * cosalpha * sinbeta + b * sinalpha * cosbeta); 

4)畫出的結果:

figure 

plot(PixList(:,1),rot90(PixList(:,2),2),'-r') % flip the y coordinates because indexing in Matlab starts form the top of the image. 
hold on 
plot(X,Y,'k','LineWidth',2) 

hold off 

這使我:

enter image description here

所以它不是完美的,但希望它能幫助你開始。

+0

非常感謝您的詳細解答。我剛剛在這行中遇到了一個錯誤:'PixList = s(2).PixelList;',提及:'索引超出了矩陣的維度。這是爲什麼?謝謝 – productive 2014-10-03 16:22:20

+0

哦,在這種情況下,你想使用s(1)。像我上面寫的PixelList和s(1).Centroid(等)而不是s(2)。在我的情況下,regionprops輸出2個「區域」,包括位置1中數字的實際邊界,所以我用2作爲索引。如果你得到這個錯誤,圖形邊界可能不被考慮,並且這個結構的大小是1而不是2,就像我的情況一樣。我會檢查一下,看看它是如何發生的,但這應該可以解決你的問題。 – 2014-10-03 17:52:00

+0

所以@生產它可以幫助你嗎? – 2014-10-06 00:02:21