2016-05-02 5 views
0

Ich mache ein Projekt zur Erkennung von Pflanzenkrankheiten. Ich muss erkrankte Teile aus Bildern von Blättern extrahieren, aber ich bin nicht in der Lage, kranke Regionen mit k-Mitteln genau zu trennen. Insbesondere ist der Rest des Blattes auf dem Bild sichtbar, wobei die erkrankten Teile segmentiert sind. Hier ist das Original-Bild und Bild nach der erkrankten Teile zu extrahieren: original imageimage after separating diseased partsSo erhalten Sie genaue Cluster mit k-Means-Clustering in Matlab

Hier ist der Code, den ich geschrieben habe

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); 

Ich möchte nur die erkrankten Regionen extrahieren unter Verwendung von K bedeutet Clustering. Ich wäre dankbar, wenn mir jemand dabei helfen könnte. Ich benutze Matlab 2009a. Hier

+0

Warum wählen Sie eine Größe '[200 250]' für den Anfangsfilter mit der Einheit Sigma? Kennen Sie "imgaussfilt"? Warum segmentieren Sie mit nur zwei Farben? Weißt du, dass dein Code keinen einzigen Kommentar enthält? Könnten Sie bitte das Originalbild alleine posten, damit wir Ihre Ergebnisse reproduzieren können? – Sheljohn

+1

@ Sh3ljohn Ich habe das Originalbild alleine gepostet. – Kashish

+0

Markieren Sie den Post unten als die Antwort, wenn das Ihre Frage beantwortet. – Sheljohn

Antwort

0

ist ein korrigierter Code, der das tut, was Sie erwarten:

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 

Sie können es nennen und die Ergebnisse visualisieren, wie so:

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

Beachten Sie, dass die Reihenfolge der Cluster können variieren. Sie können sie a posteriori bestellen, wenn Sie wissen, dass das Blatt hauptsächlich grün/gelb sein sollte und dass der Hintergrund meistens schwarz sein sollte.

+0

Könntest du mir auch den Code geben, um die Cluster a posteriori zu bestellen, wissend, dass das Blatt hauptsächlich grün/gelb sein sollte, und dass der Hintergrund meistens schwarz sein sollte? Ich habe es versucht, konnte es aber nicht. Kannst du bitte helfen? @ Sh3ljohn – Kashish

+0

@Kashish Das Blatt wird das Bild sein, das den grünen Kanal maximiert (so 'argmax (cellfun (@ (img) Summe (Summe (img (:,:, 2))), segmentiert)), der Hintergrund wird derjenige sein, der alle Kanäle minimiert (also 'argmin (cellfun (@ (img) sum (img (:)), segmentiert) '). – Sheljohn

+0

vielen Dank für die Hilfe. Es funktioniert. – Kashish

Verwandte Themen