【问题标题】:why does kmean color segmentation show different color every time?为什么kmean颜色分割每次都显示不同的颜色?
【发布时间】:2016-08-05 21:55:19
【问题描述】:

我正在学习如何使用 kmean 聚类来分割颜色,就像 matlab 2015a 中的示例一样。但是每次我运行代码时,我想要的颜色都在不同的集群中。例如,第一次运行时,它会显示黄色在集群 1 中,蓝色在集群 2 中。当我再次运行时,它们将切换到不同的集群。即使我一次又一次地运行它,如何使黄色和蓝色处于特定的集群中?请帮我。提前致谢

这是我使用的代码:

[FileName,PathName] = uigetfile('*.jpg','Select the MATLAB code file');

he1= imread(FileName);
cform = makecform('srgb2lab');
lab_he = applycform(he1,cform);
figure (2)
imshow (lab_he)


ab = double(lab_he(:,:,2:3));
nrows = size(ab,1);
ncols = size(ab,2);
ab = reshape(ab,nrows*ncols,2);

nColors = 3;
% repeat the clustering 3 times to avoid local minima
[cluster_idx, cluster_center] = kmeans(ab,nColors,'distance','sqEuclidean',           ...
                                  'Replicates',3);



pixel_labels = reshape(cluster_idx,nrows,ncols);
figure (3)
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 = he1;
    color(rgb_label ~= k) = 0;
    segmented_images{k} = color;
end
%%
figure (4)
imshow(segmented_images{1}), title('objects in cluster 1');

%% 
figure (5)
imshow(segmented_images{2}), title('objects in cluster 2');

%%
figure (6)
imshow(segmented_images{3}), title('objects in cluster 3');
%%
a = im2bw (segmented_images{2},0.05);
figure (7)
imshow (a);

b = im2bw (segmented_images{3},0.05);
figure (8)
imshow (b);

在我的情况下,黄色区域应该在集群 2 中,蓝色区域应该在集群 3 中。请告诉我如何做到这一点

【问题讨论】:

    标签: image matlab image-processing colors image-segmentation


    【解决方案1】:

    kmeans 的第一个输出位于集群的 index 中,而不是颜色。您所指的颜色是 MATLAB 在可视化时显示的颜色。

    使用 kmeans,初始聚类中心是从输入数据中随机选择的。因此,顺序是随机的。因此,每次调用算法时,分配给像素的集群索引都会有所不同,但集群中的像素应该放置在同一个集群中,并且具有相同的集群索引彼此连续调用。

    如果您想要每个集群对应的实际颜色,您将需要使用kmeanssecond output(集群质心)将集群索引映射到颜色。您可以使用ind2rgb 轻松完成此操作。

    pixel_labels = ind2rgb(cluster_idx, cluster_center);
    imshow(pixel_labels)
    

    如果您只是希望集群索引值在连续调用后保持不变,您可以使用cluster_center 来确保一致的索引分配

    [cluster_idx, cluster_center] = kmeans(ab, nColors);
    [~, ind] = sortrows(cluster_center);
    
    pixel_labels = reshape(cluster_idx, nrows, ncols);
    
    for k = 1:numel(ind)
        pixel_labels(cluster_idx == k) = ind(k);
    end
    

    如果您希望特定颜色位于特定集群中,则可以修改此项。

    %// Define yellow
    yellow = [1 1 0];
    
    %// Define blue
    blue = [0 0 1];
    
    %// Find the centroid closest to yellow
    [~, yellowind] = min(sum(bsxfun(@minus, cluster_center, yellow).^2, 2));
    
    %// Find the one closest to blue
    [~, blueind] = min(sum(bsxfun(@minus, cluster_center, blue).^2, 2));
    
    %// Now assign them to clusters with yellow as 2 and blue as 3
    segmented_images{1} = cluster_idx == setdiff(1:3, [yellowind, blueind]);
    segmented_images{2} = cluster_idx == yellowind;
    segmented_images{3} = cluster_idx == blueind;
    

    【讨论】:

    • 对不起,先生,您能向我解释一下这是如何工作的吗?
    • @badrulhisham 我已经更新了答案,希望能更清楚
    • 非常感谢您的帮助先生,我将尝试将这些实现到我的编码中
    • 很抱歉打扰您先生,但是这个错误是什么意思? b = 零(大小(a)); b(:) = cm(a,3);
    • @badrulhisham 看起来不像你在错误中发布了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多