我的主要问题是给出了一个特征质心,如何在MATLAB中绘制它?
更详细地说,我有一个NxNx3
图像(RGB图像),我采用4x4
块并为每个块计算6
维特征向量。我将这些要素向量存储在我运行Mx6
函数的kmeans
矩阵中,并在kx6
矩阵中获取质心,其中k
是群集的数量,{6
1}}是每个块的要素数。
如何在我的图像中绘制这些中心星团,以便可视化算法是否按照我希望的方式执行?或者,如果有任何其他方式/建议我如何可视化我的图像上的质心,我将非常感激。
答案 0 :(得分:3)
以下是一种可视化群集的方法:
如您所述,首先我提取块,计算每个块的特征向量,然后对此特征矩阵进行聚类。
接下来,我们可以看到分配给每个块的集群。请注意,我假设4x4块是不同的,这很重要,这样我们就可以将块映射到原始图像中的位置。
最后,为了在图像上显示聚类质心,我只需找到每个聚类最近的块,并将其显示为该聚类的代表。
这是一个显示上述想法的完整示例(在您的情况下,您可能希望用您自己的实现替换计算每个块的功能的函数;我只是采用min / max / mean / median / Q1 / Q3作为每个4x4块的特征向量):
%# params
NUM_CLUSTERS = 3;
BLOCK_SIZE = 4;
featureFunc = @(X) [min(X); max(X); mean(X); prctile(X, [25 50 75])];
%# read image
I = imread('peppers.png');
I = double( rgb2gray(I) );
%# extract blocks as column
J = im2col(I, [BLOCK_SIZE BLOCK_SIZE], 'distinct'); %# 16-by-NumBlocks
%# compute features for each block
JJ = featureFunc(J)'; %'# NumBlocks-by-6
%# cluster blocks according to the features extracted
[clustIDX, ~, ~, Dist] = kmeans(JJ, NUM_CLUSTERS);
%# display the cluster index assigned for each block as an image
cc = reshape(clustIDX, ceil(size(I)/BLOCK_SIZE));
RGB = label2rgb(cc);
imshow(RGB), hold on
%# find and display the closest block to each cluster
[~,idx] = min(Dist);
[r c] = ind2sub(ceil(size(I)/BLOCK_SIZE), idx);
for i=1:NUM_CLUSTERS
text(c(i)+2, r(i), num2str(i), 'fontsize',20)
end
plot(c, r, 'k.', 'markersize',30)
legend('Centroids')
答案 1 :(得分:0)
质心不对应于图像中的坐标,而是对应于要素空间中的坐标。有两种方法可以测试kmeans的表现。对于这两种方式,您希望将点与其最近的簇相关联。您可以从kmeans的第一个输出中获得此信息。
(1)您可以通过将6维空间缩小到2维或3维空间,然后以不同颜色绘制不同分类的坐标来可视化聚类结果。
假设特征向量是在名为featureArray
的数组中收集的,并且您要求nClusters
个群集,您可以使用mdscale按如下方式绘制图表来转换数据比方说,3D空间:
%# kmeans clustering
[idx,centroids6D] = kmeans(featureArray,nClusters);
%# find the dissimilarity between features in the array for mdscale.
%# Add the cluster centroids to the points, so that they get transformed by mdscale as well.
%# I assume that you use Euclidean distance.
dissimilarities = pdist([featureArray;centroids6D]);
%# transform onto 3D space
transformedCoords = mdscale(dissimilarities,3);
%# create colormap with nClusters colors
cmap = hsv(nClusters);
%# loop to plot
figure
hold on,
for c = 1:nClusters
%# plot the coordinates
currentIdx = find(idx==c);
plot3(transformedCoords(currentIdx,1),transformedCoords(currentIdx,2),...
transformedCoords(currentIdx,3),'.','Color',cmap(c,:));
%# plot the cluster centroid with a black-edged square
plot3(transformedCoords(1:end-nClusters+c,1),transformedCoords(1:end-nClusters+c,2),...
transformedCoords(1:end-nClusters+c,3),'s','MarkerFaceColor',cmap(c,:),...
MarkerEdgeColor','k');
end
(2)您也可以创建一个伪彩色图像,显示图像的哪个部分属于哪个群集
假设你有nRows
个nCols
块,你可以写
%# kmeans clustering
[idx,centroids6D] = kmeans(featureArray,nClusters);
%# create image
img = reshape(idx,nRows,nCols);
%# create colormap
cmap = hsv(nClusters);
%# show the image and color according to clusters
figure
imshow(img,[])
colormap(cmap)