gpt4 book ai didi

algorithm - 基于聚类均值对 kmeans 中分割图像的标签进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:58:47 27 4
gpt4 key购买 nike

我有一个简单但非常有趣的问题。如您所知,由于随机初始聚类中心,Kmeans 在每次运行后可能会给出不同的结果。但是,假设我知道簇 1 的平均值小于簇 2,簇 2 的平均值小于簇 3,依此类推。我想做一个算法来实现聚类具有较小的平均值,然后将其分配给较小的聚类索引。

这是我的 Matlab 代码。如果您有更多分类或更清晰的方法。请给我建议

 %% K-mean
num_cluster=2;
nrows = size(Img_original,1);
ncols = size(Img_original,2);
I_1D = reshape(Img_original,nrows*ncols,1);
[cluster_idx mu]=kmeans(double(I_1D),num_cluster,'distance','sqEuclidean','Replicates',3);
cluster_label = reshape(cluster_idx,nrows,ncols);
%% Sort based on mu
[mu_sort id_sort]=sort(mu);
idx=cell(1,num_cluster)
%% Save index of order if mu
for i=1:num_cluster
idx{i}=find(cluster_label==id_sort(i));
end
%% Sort cluster label based on mu
for i=1:num_cluster
cluster_label(idx{i})=i;
end

最佳答案

我不清楚您为什么要根据每个质心的顺序重新标记集群。您可以简单地使用 k-means 输出的标记向量来引用每个点属于哪个簇/质心。

尽管如此,您必须对质心进行排序的最初想法是一个很好的想法。代码的最后一部分似乎效率很低,因为您要遍历每个标签并进行重新分配。我可能建议的一件事是有一个查找表,其中输入是原始标签,输出是基于排序质心的重新排序的标签。

如果您想走这条路线,可以使用 containers.Map其中键是根据 sort 输出的排序顺序给出的标签,值是重新排序的标签……即从 1 到您拥有的类数的向量。您需要这样做,因为 sort 的第二个输出告诉您原始数组中的每个值将出现在排序结果中的什么位置,因此您必须使用此排序来正确执行重新标记。此外,我会使用 sortrows MATLAB 中的函数,而不是原始的 sort。通过您的操作方式,您正在独立地对每个列/变量 进行排序,这将给出错误的质心。这将适用于你只需要考虑一个特征的灰度图像,即灰度,但如果你超越灰度并且可能进入 RGB 或任何你想要的颜色空间,使用原始 sort 会给你不正确的结果。您需要将每一行视为一个点,然后对这些行进行联合排序。

给定你的代码,你会做这样的事情:

%% K-mean
num_cluster=2;
nrows = size(Img_original,1);
ncols = size(Img_original,2);
I_1D = reshape(Img_original,nrows*ncols,1);
[cluster_idx mu]=kmeans(double(I_1D),num_cluster,'distance','sqEuclidean','Replicates',3);

%% Sort based on mu
[mu_sort id_sort]=sortrows(mu);

%// New - Create lookup
lookup = containers.Map(id_sort, 1:size(mu_sort,1));

%// Relabel the vector
cluster_idx_sort = lookup.values(num2cell(cluster_idx));
cluster_idx_sort = [cluster_idx_sort{:}];

%// Reshape back to original image dimensions
cluster_label = reshape(cluster_idx_sort,nrows,ncols);

这应该会给您的代码带来一些加速。


为了仔细检查,我在 cameraman.tif 图像上尝试了这个,它是图像处理工具箱的一部分。运行代码给我这些聚类中心:

>> mu

mu =

153.3484
23.7291

一旦我按升序对簇进行排序,这就是我得到的排序和质心:

>> mu_sort

mu_sort =

23.7291
153.3484

>> id_sort

id_sort =

2
1

所以这按我们预期的那样工作......现在如果我们在对质心进行排序之前显示原始集群标签图:

cluster_label = reshape(cluster_idx, nrows, ncols);
imshow(cluster_label,[]);

...我们得到这张图片:

enter image description here

现在,如果我们运行排序逻辑并显示质心:

imshow(cluster_label, []);

...我们得到这张图片:

enter image description here

这如我所料。因为质心翻转了,所以着色也应该翻转。

关于algorithm - 基于聚类均值对 kmeans 中分割图像的标签进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32097758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com