我的问题类似于this一个问题,除了推荐的可视化细分方法对我不起作用。
我想要做的是使用MATLAB的k-means代码来分割jpeg图像,然后可视化结果。 在MATLAB help上可以获得用于生成每个像素的聚类均值和聚类索引的代码,但是不包括用于可视化分段的代码(或者至少不是以我想要的方式 - 我想要视图单个分区图像,即由派生均值表示的所有聚类,在同一图像中表示,而不是使用“均值”生成掩码,如示例中所示。)
如上所述,somebody发布了以下内容作为可视化结果的方法,但它对我不起作用:
imseg = zeros(size(im,1),size(im,2));
for i=1:max(idx)
imseg(idx==i)=i;
end
imagesc(imseg)
答案 0 :(得分:1)
之前的帖子正在做的是它将群集ID 可视化为输出图像。您可能希望群集本身的均值(因此 k -means)。从上一篇文章中可以很容易地做到并进行修改。我还假设您的图像是uint8
类型,其中每个灰度/颜色通道都来自[0,255]
。假设idx
包含每个像素的成员资格,centroids
包含群集本身的实际颜色/灰度值,您只需要这样做:
imseg = uint8(zeros(size(im,1),size(im,2))); %// Cast to uint8 as image is of this type
centroids = uint8(centroids); %// Just in case, to ensure compatible data types
for i=1:max(idx)
imseg(idx==i) = centroids(i); %// Set location to the centroid value, not ID
end
imagesc(imseg);
现在,如果你想要彩色图像,你只需要将2D矩阵叠加在一起。这可以通过以下方式完成:
%// Initialize red, green and blue planes
imRed = uint8(zeros(size(im,1), size(im,2))); %// Cast to uint8 as image is of this type
imGreen = imRed;
imBlue = imRed;
centroids = uint8(centroids); %// Just in case, to ensure compatible data types
for i=1:max(idx)
imRed(idx==i) = centroids(idx,1); %// Find centroid value for RGB for each cluster
imGreen(idx==i) = centroids(idx,2); %// and set accordingly
imBlue(idx==i) = centroids(idx,3);
end
imseg = cat(3,imRed, imGreen, imBlue);
imagesc(imseg);
对于灰度情况,您可以完全按照以下方式执行此操作:
imseg = centroids(idx);
imagesc(imseg);
我坚持使用for
循环方法,因为这似乎是您最熟悉的方法,但您可以将idx
用作索引数组到{{1输出本质上是一个映射,其中每个成员资格ID都具有与该集群关联的灰度值。