2013-12-17 76 views
1

我在一個二進制圖像中有多個植物。假設每片葉子大致爲橢圓形,我將如何識別圖像中的每片葉子? 示例輸入:http://i.imgur.com/BwhLVmd.png檢測圖像中的重疊橢圓區域(MATLAB)

我在想一個好的地方就是找到每片葉子的尖端,然後得到每個植物的中心。然後,我可以適應從尖端開始,然後到中心的曲線。我一直在網上查看,看到一些涉及分水嶺方法的東西,但我不知道該從哪裏開始。

+0

請問您提供的圖像有14個「葉片」或比更多? – Floris

+0

對不起。該圖像是14個植物。每株植物有多片葉子。 – Sam

回答

3

你應該知道,這些事情是棘手的,以確保工作穩健 - 總會有一個失敗的情況。

這就是說,我認爲你的想法不錯。

你可以開始如下:

  1. 確定每個工廠的邊界曲線(即像素,前景和背景都在他們的鄰居)。

  2. 計算每個植物的質心。

  3. 將每個工廠邊界轉換爲以質心爲原點的polar coordinate system。這相當於設置一個座標系統,其中每個邊界曲線點在Y軸上的距離和X軸上的角度。

  4. 在邊界曲線的這種表示中,嘗試識別最大值;這些是葉子的提示。你可能需要做一些平滑處理。使用最大值之前和之後的曲線部分開始擬合橢圓或其他形狀。

一般來說,極座標系對於分析粗略循環的東西來說總是有用的。

爲了適合你的省略號,一旦你有一個粗略的初始位置,我可能會嘗試一個EM-style方法。

2

我會做這樣的事情(I是你的二進制圖像)

I=bwmorph(bwmorph(I, 'bridge'), 'clean'); 

SK=bwmorph(I, 'skel', Inf); 
endpts = bwmorph(SK,'endpoints'); 
props=regionprops(I, 'All'); 

然後連接從props.centroid列出的endpts應該給你你的葉子元素的重心每段(花瓣?) 。

有點過濾可能是必要的,bwmorph是你的朋友。玩的開心!

+0

我將如何去觀察這些結果? – Sam

+0

@Sam你可以用'find(endpts)'顯示圖像並保持它('hold on'),然後循環一個'line([] [])'命令來收集endpts的非零元素的索引, numel(道具)'。 –

0

正如我們在去年的討論後,我將只提取葉子在一個工廠:

ii=regionprops(I1,'all'); % I1 is the image with only one plant extracted 
center = ii.Centroid; 
pid=ii.PixelList; 
mm=sum(bsxfun(@minus,pid,center).^2,2); 
[a,b]=sort(mm); 
for n=1:1000 % the larger this number is, the more separated among the leafs, which is good for you to use bwlabel for further processing 
    I1(pid(b(n),2),pid(b(n),1))=0; 
end 
imshow(I1) 

enter image description here