如何在matlab中使用k均值聚类获得准确的聚类
How to get accurate clusters using k-means clustering in matlab
我正在做一个关于植物病害检测的项目。我需要从叶子图像中提取患病部分,但我无法使用 k-means 准确分离出患病区域。具体来说,叶子的其余部分在图像上可见,患病部分已被分割。这是原始图像和提取病变部分后的图像:original image image after separating diseased parts
这是我写的代码
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);
我想使用 K 均值聚类仅提取病变区域。如果有人可以帮助我,我将不胜感激。我正在使用 matlab 2009a.
这是一个更正后的代码,可以满足您的期望:
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');
请注意,集群的顺序可能会有所不同。您可以先验地订购它们,知道叶子应该大部分是 green/yellow,并且背景应该大部分是黑色。
我正在做一个关于植物病害检测的项目。我需要从叶子图像中提取患病部分,但我无法使用 k-means 准确分离出患病区域。具体来说,叶子的其余部分在图像上可见,患病部分已被分割。这是原始图像和提取病变部分后的图像:original image image after separating diseased parts
这是我写的代码
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);
我想使用 K 均值聚类仅提取病变区域。如果有人可以帮助我,我将不胜感激。我正在使用 matlab 2009a.
这是一个更正后的代码,可以满足您的期望:
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');
请注意,集群的顺序可能会有所不同。您可以先验地订购它们,知道叶子应该大部分是 green/yellow,并且背景应该大部分是黑色。