我的主要问题是给定一个特征质心,如何在 MATLAB 中绘制它?

更详细地说,我有一个 NxNx3 我拍摄的图像(RGB 图像) 4x4 块并计算 6每个块的维特征向量。我将这些特征向量存储在 Mx6 我运行的矩阵 kmeans 函数并获取 a 中的质心 kx6 矩阵,其中 k 是簇的数量, 6 是每个块的特征数量。

如何在图像中绘制这些中心簇,以便可视化算法是否按照我希望的方式执行?或者,如果有人对我如何可视化图像上的质心有任何其他方式/建议,我将不胜感激。

有帮助吗?

解决方案

下面是你可以可视化集群的一种方式:

如你所描述的,第一I提取的块,计算每个特征向量和群集这个功能矩阵。

接下来,我们可以可视化分配给每个块的簇。请注意,我假设的4×4块是不同的,这很重要,这样我们就可以在块映射到原始图像中的位置了。

最后,为了显示的图像上的聚类中心,我简单找到最接近块到每个群集并显示它作为集群的代表。

下面是一个完整的例子来说明上述想法(在你的情况,你会想取代你自己的实现计算每个块的功能作用;我只是服用最小/最大/平均值/中间/ Q1 / Q3为每个4×4块我的特征向量):

%# 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')

“集群” “图像”

其他提示

质心并不对应于图像中的坐标,而是对应于特征空间中的坐标。有两种方法可以测试 kmeans 的性能。对于这两种方式,您都希望首先将点与其最近的簇关联起来。您可以从 kmeans 的第一个输出中获取此信息。

(1) 通过将 6 维空间缩减为 2 或 3 维空间,然后用不同颜色绘制不同分类的坐标,可以可视化聚类结果。

假设特征向量收集在一个名为 featureArray, ,以及你要求的 nClusters 簇,您可以使用如下方式绘制图形 中度尺度 将数据转换为 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top