用于图像聚类的修正k均值算法

时间:2014-07-21 02:17:03

标签: matlab k-means

我尝试为图像聚类实现修改的k_mean算法,即非常类似于k均值。区别仅在于新的中心计算。

实际上我已经初始化了聚类中心,计算了像素和中心之间的距离,现在基于我必须将像素分配给聚类的最小距离,但这里的问题是如何将像素分配和存储到聚类,我将如何知道哪个像素属于哪个群集用于新的中心计算?

1 个答案:

答案 0 :(得分:1)

重申你已经说过的内容,你想要运行k-means,你的训练样例是像素,每个像素都有3个特征(红色绿色)。我会顺便提一下,虽然它看起来你已经决定了什么,但是通过首先将RGB数据从0到1.0归一化而不是说0到16或0到255来定义距离范数,这样你就可以比较结果不论颜色深浅。

你应该订购像素1..m,并将它们存储在 m x 3 矩阵 X (见下文)m = 宽度 x 高度。如果由你决定如何将每个像素分配给 X 行,那么将图像位置(x,y)的像素任意设置为行y * width + x。 / p>

现在您只需要使用额外的 m x 1 索引向量 idx 来跟踪哪个像素属于哪个质心。

idx = zeros(size(X,1), 1);

for i = 1:size(X,1)
   minNormSq = 0;
   for j = 1:K
      normSq = sum((X(i,:) .- centroids(j,:)).^2);
      if j == 1 || normSq < minNormSq
         minNormSq = normSq;
         idx(i) = j;
      end
   end
end

稍后您可以在计算新的质心值时assign a array to a boolean condition

for j = 1:K
   inclusion = (idx == j);
   centroids(j,:) = inclusion'*X;
   centroids(j,:) = centroids(j,:)/sum(inclusion);
end