2

Ma question principale est un centroïde, comment puis-je dessiner dans MATLAB?MATLAB: dessiner des centroïdes

De manière plus détaillée, j'ai une image NxNx3 (une image RGB) dont je prends 4x4 blocs et calculer un vecteur de caractéristique 6 de dimension pour chaque bloc. Je stocke ces vecteurs de caractéristiques dans une matrice Mx6 sur laquelle j'exécute la fonction kmeans et obtiens les centroïdes dans une matrice kx6, où k est le nombre de clusters et 6 est le nombre d'entités pour chaque bloc.

Comment puis-je dessiner ces grappes centrales dans mon image afin de visualiser si l'algorithme fonctionne comme je le souhaite? Ou si quelqu'un a d'autres moyens/suggestions sur la façon dont je peux visualiser les centroïdes sur mon image, je l'apprécierais grandement.

Répondre

3

Voici une façon que vous pouvez visualiser les grappes:

Comme vous l'avez décrit, d'abord j'extraire les blocs, calculer le vecteur de caractéristiques pour chacun, et multipays cette fonctionnalité matrice.

Ensuite, nous pouvons visualiser les groupes assignés à chaque bloc. Notez que je suppose que les blocs 4x4 sont distincts, ceci est important pour que nous puissions faire correspondre les blocs à leur emplacement dans l'image originale.

Enfin, pour afficher les centroïdes de cluster sur l'image, je trouve simplement le bloc le plus proche de chaque cluster et l'affiche en tant que représentant de ce cluster.

Voici un exemple complet pour montrer l'idée ci-dessus (dans votre cas, vous voudriez remplacer la fonction qui calcule les caractéristiques de chaque bloc par votre propre implémentation: je prends simplement le min/max/mean/median/Q1/Q3 comme mon vecteur caractéristique pour chaque bloc de 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') 

clusters image

0

Les centroïdes ne correspondent pas aux coordonnées de l'image, mais aux coordonnées dans l'espace caractéristique. Il y a deux façons de tester la performance des kméens. Dans les deux cas, vous voulez associer les points avec leur cluster le plus proche. Vous obtenez cette information de la première sortie de kmeans.

(1) Vous pouvez visualiser le résultat du regroupement en réduisant l'espace à 6 dimensions en espace à 2 ou 3 dimensions, puis en traçant les coordonnées classées différemment dans différentes couleurs.

En supposant que les vecteurs de caractéristiques sont rassemblées dans un tableau appelé featureArray, et que vous avez demandé nClusters clusters, vous feriez l'intrigue comme suit en utilisant mdscale pour transformer les données à, par exemple, l'espace 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) vous pouvez, alternativement, créer une image pseudo-couleur qui vous montre quelle partie de l'image à laquelle appartient groupe

en supposant que vous avez nRows par nCols blocs, vous écrivez

%# 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) 
Questions connexes