2012-04-23 10 views
5

主なタスクは、葉の複雑な背景を除去し、MATLABの遮蔽された葉の画像から標的葉を抽出することです。 背景を取り除くために、私はK-meansクラスタリングアルゴリズムを適用しました。今の主なタスクは、流域分割アルゴリズムを使用して閉塞した葉から葉を分けることです。 私はすべての単一の葉のための完璧なセグメントを見つけることができません。私を助けてください。サンプル画像と流域セグメンテーションコードをアップロードしました。matlabで遮蔽された葉をセグメント化するためのWatershedセグメンテーションアルゴリズム

ORIGINAL IMAGE enter image description here

イメージ enter image description here

私はメイン中央リーフは単一のセグメントにしたい原画像に重畳K平均クラスタリングアルゴリズム及び分水界セグメンテーションを使用してバックグラウンドを除去した後私はそれを抽出することができます。

私は私はあなたがフォアグラウンド抽出アルゴリズムではなく、一般的なセグメンテーションを試みるべきだと思い

function wateralgo(img) 

F=imread(img); 

F=im2double(F); 

%Converting RGB image to Intensity Image 
r=F(:,:,1); 
g=F(:,:,2); 
b=F(:,:,3); 
I=(r+g+b)/3; 
imshow(I); 

%Applying Gradient 
hy = fspecial('sobel'); 
hx = hy'; 
Iy = imfilter(double(I), hy, 'replicate'); 
Ix = imfilter(double(I), hx, 'replicate'); 
gradmag = sqrt(Ix.^2 + Iy.^2); 
figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)'); 

L = watershed(gradmag); 
Lrgb = label2rgb(L); 
figure, imshow(Lrgb), title('Watershed transform of gradient magnitude (Lrgb)'); 

se = strel('disk',20); 
Io = imopen(I, se); 
figure, imshow(Io), title('Opening (Io)'); 
Ie = imerode(I, se); 
Iobr = imreconstruct(Ie, I); 
figure, imshow(Iobr), title('Opening-by-reconstruction (Iobr)'); 

Ioc = imclose(Io, se); 
figure, imshow(Ioc), title('Opening-closing (Ioc)'); 

Iobrd = imdilate(Iobr, se); 
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr)); 
Iobrcbr = imcomplement(Iobrcbr); 
figure, imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)'); 

fgm = imregionalmin(Iobrcbr); 
figure, imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)'); 

I2 = I; 
I2(fgm) = 255; 
figure, imshow(I2), title('Regional maxima superimposed on original image (I2)'); 

se2 = strel(ones(7,7)); 
fgm2 = imclose(fgm, se2); 
fgm3 = imerode(fgm2, se2); 
fgm4 = bwareaopen(fgm3, 20); 
I3 = I; 
I3(fgm4) = 255; 
figure, imshow(I3), title('Modified regional maxima superimposed on original image (fgm4)'); 

bw = im2bw(Iobrcbr, graythresh(Iobrcbr)); 
figure, imshow(bw), title('Thresholded opening-closing by reconstruction (bw)'); 

D = bwdist(bw); 
DL = watershed(D); 
bgm = DL == 0; 
figure, imshow(bgm), title('Watershed ridge lines (bgm)'); 

gradmag2 = imimposemin(gradmag, bgm | fgm4); 
L = watershed(gradmag2); 
I4 = I; 
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255; 
figure, imshow(I4), title('Markers and object boundaries superimposed on original image (I4)'); 

Lrgb = label2rgb(L, 'jet', 'w', 'shuffle'); 
figure, imshow(Lrgb), title('Colored watershed label matrix (Lrgb)'); 

figure, imshow(I), hold on 
himage = imshow(Lrgb); 
set(himage, 'AlphaData', 0.3); 
title('Lrgb superimposed transparently on original image'); 
end 
+0

@Phonon申し訳ありませんが、コードのインデントが悪いですが、解決策を助けてください。 –

+0

どの葉を抽出しようとしていますか? – vini

+0

リーフセグメンテーションアルゴリズムは、どの範囲の環境条件で実行する必要がありますか?あなたはその場面を支配していますか?それは絶対に流域アルゴリズムを使用する必要がありますか?私は勾配情報があなたに堅牢なソリューションを提供するのに十分なほど強いとは確信していません。より強力なプリオリを配備できるアルゴリズムまたはモデルが必要な場合があります。葉の形はかなりステレオタイプであるため、おそらく変形可能なモデルを見ることは適切かもしれません。時間が足りない場合は、おそらく地域成長に基づくヒューリスティックなアプローチがあなたにすばやい結果をもたらすでしょうか? –

答えて

2

以下流域セグメンテーションコードを与えています。そのようなアルゴリズムの1つはGrabCutです。また、前景オブジェクトを抽出しようとする前に、イメージ表現である程度の照度変動を達成することも役立ちます。これを行う1つの方法は、Chong color spaceで作業することです。

0

ユーザーからの操作が可能な場合は、GrabCut(@ Victor Mayのように)またはより基本的なinteractive graph cutのいずれかでセグメンテーションがさらに改善されます。

それ以外の場合、自動セグメンテーションは、さまざまな画像に完璧にすることは非常に困難です。おそらく、類似のメトリックに基づいて(または2つのセグメント間の勾配の強さに基づいて)隣接する領域を比較してマージするいくつかの後処理を試すことができます。

関連する問題