我在一個二進制圖像中有多個植物。假設每片葉子大致爲橢圓形,我將如何識別圖像中的每片葉子? 示例輸入:http://i.imgur.com/BwhLVmd.png檢測圖像中的重疊橢圓區域(MATLAB)
我在想一個好的地方就是找到每片葉子的尖端,然後得到每個植物的中心。然後,我可以適應從尖端開始,然後到中心的曲線。我一直在網上查看,看到一些涉及分水嶺方法的東西,但我不知道該從哪裏開始。
我在一個二進制圖像中有多個植物。假設每片葉子大致爲橢圓形,我將如何識別圖像中的每片葉子? 示例輸入:http://i.imgur.com/BwhLVmd.png檢測圖像中的重疊橢圓區域(MATLAB)
我在想一個好的地方就是找到每片葉子的尖端,然後得到每個植物的中心。然後,我可以適應從尖端開始,然後到中心的曲線。我一直在網上查看,看到一些涉及分水嶺方法的東西,但我不知道該從哪裏開始。
你應該知道,這些事情是棘手的,以確保工作穩健 - 總會有一個失敗的情況。
這就是說,我認爲你的想法不錯。
你可以開始如下:
確定每個工廠的邊界曲線(即像素,前景和背景都在他們的鄰居)。
計算每個植物的質心。
將每個工廠邊界轉換爲以質心爲原點的polar coordinate system。這相當於設置一個座標系統,其中每個邊界曲線點在Y軸上的距離和X軸上的角度。
在邊界曲線的這種表示中,嘗試識別最大值;這些是葉子的提示。你可能需要做一些平滑處理。使用最大值之前和之後的曲線部分開始擬合橢圓或其他形狀。
一般來說,極座標系對於分析粗略循環的東西來說總是有用的。
爲了適合你的省略號,一旦你有一個粗略的初始位置,我可能會嘗試一個EM-style方法。
我會做這樣的事情(I
是你的二進制圖像)
I=bwmorph(bwmorph(I, 'bridge'), 'clean');
SK=bwmorph(I, 'skel', Inf);
endpts = bwmorph(SK,'endpoints');
props=regionprops(I, 'All');
然後連接從props.centroid
列出的endpts
應該給你你的葉子元素的重心每段(花瓣?) 。
有點過濾可能是必要的,bwmorph
是你的朋友。玩的開心!
我將如何去觀察這些結果? – Sam
@Sam你可以用'find(endpts)'顯示圖像並保持它('hold on'),然後循環一個'line([] [])'命令來收集endpts的非零元素的索引, numel(道具)'。 –
正如我們在去年的討論後,我將只提取葉子在一個工廠:
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)
請問您提供的圖像有14個「葉片」或比更多? – Floris
對不起。該圖像是14個植物。每株植物有多片葉子。 – Sam