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