2016-05-02 1 views
0

私は植物病気の検出に関するプロジェクトを行っています。私は葉の画像から病気の部分を抽出する必要がありますが、k-meansを使って病気の部位を正確に分けることはできません。具体的には、葉の残りの部分は、病変部分がセグメント化された状態で画像上に見える。ここでoriginal imageimage after separating diseased partsmatlabでk-meansクラスタリングを使って正確なクラスターを得るには

私はKクラスタリングを意味使用のみ病変領域を抽出する

b=imread('12.jpeg'); 
G=fspecial('gaussian',[200 250],1); 
Ig=imfilter(b,G,'same'); 
figure,imshow(Ig); 
conversionform = makecform('srgb2lab'); 
lab_img = applycform(Ig,conversionform); 
figure,imshow(lab_img); 
ab = double(lab_img(:,:,2:3)); 
nrows = size(ab,1); 
ncols = size(ab,2); 
ab = reshape(ab,nrows*ncols,2); 
nColors = 2; 
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean', ..., 
            'Replicates',3); 
pixel_labels = reshape(cluster_idx,nrows,ncols); 
figure, imshow(pixel_labels,[]), title('image labeled by cluster index'); 
segmented_images = cell(1,3); 
rgb_label = repmat(pixel_labels,[1 1 3]); 
for k = 1:nColors 
    color = lab_img; 
    color(rgb_label ~= k) = 0; 
    segmented_images{k} = color; 
end 
figure, imshow(segmented_images{1}), title('objects in cluster 1'); 
figure, imshow(segmented_images{2}), title('objects in cluster 2'); 
e=segmented_images{1}; 
figure,imshow(e); 
conversionform = makecform('lab2srgb'); 
new_image=applycform(e,conversionform); 
figure,imshow(new_image); 

を書かれているコードである:ここで病変部を抽出した後、元の画像との画像です。誰かが私にこれを手伝ってもらえれば幸いです。私はmatlab 2009aを使用しています。ここで

+0

ユニットシグマで初期フィルタのサイズを[200 250]にするのはなぜですか?あなたは 'imgaussfilt'について知っていますか?なぜ2つの色でセグメント化するのですか?コードに1つのコメントが含まれていないことをご存知ですか?結果を再現できるように元画像のみを投稿してください。 – Sheljohn

+1

@ Sh3ljohn私は元の画像だけを掲載しました。 – Kashish

+0

あなたの質問に答えた場合は、下のポストに答えを記入してください。 – Sheljohn

答えて

0

は、あなたが期待するものでしょう修正されたコードです:

function segmented_img = leaf_segmentation(original_img, nclusters) 

    original_img = im2double(original_img); 
    smoothed_img = imgaussfilt(original_img,1); 

    conversionform = makecform('srgb2lab'); 
    lab_img = applycform(smoothed_img,conversionform); 

    ab_img = lab_img(:,:,2:3); 
    [nrows,ncols,~] = size(ab_img); 
    ab_img = reshape(ab_img,nrows*ncols,2); 

    cluster_idx = kmeans(ab_img,nclusters,'distance','sqEuclidean','Replicates',3); 
    cluster_img = reshape(cluster_idx,nrows,ncols); 

    %figure, imagesc(cluster_img), title('Clustering results'); 

    segmented_img = cell(1,nclusters); 
    for k = 1:nclusters 
     segmented_img{k} = bsxfun(@times, original_img, cluster_img == k); 
    end 

end 

は、あなたはそれを呼び出すと、そのような結果可視化することができます:順序という

segmented = leaf_segmentation(original, 3); 

figure; 
subplot(1,3,1), imshow(segmented{1}), title('Cluster 1'); 
subplot(1,3,2), imshow(segmented{2}), title('Cluster 2'); 
subplot(1,3,3), imshow(segmented{3}), title('Cluster 3'); 

Segmented leaf

注意をクラスターの数は変化し得る。葉が大部分が緑色/黄色でなければならず、背景はほとんど黒色でなければならないという事実を知って、事後的に注文することができます。

+0

また、葉が主に緑色/黄色でなければならず、背景が主に黒くなるはずであるという事実を知っている事実をクラスターに命令するコードを私にも渡すことができますか?私は試しましたができませんでした。助けてもらえますか? @ Sh3ljohn – Kashish

+0

@Kashish葉は、緑色のチャンネルを最大にする画像になります(したがって、 'argmax(cellfun(@(img)sum(sum(img(:、:、2)))、') ')、背景すべてのチャネルを最小化するものになります( 'argmin(cellfun(@(img)sum(img(:))、segmented))')。 – Sheljohn

+0

ご協力いただきありがとうございます。それは働いている。 – Kashish

関連する問題