Domanda

La mia domanda principale è data una funzione di baricentro, come posso disegnarlo in MATLAB?

In maggior dettaglio, Ho un'immagine NxNx3 (un'immagine RGB) di cui prendo blocchi 4x4 e calcolare un vettore di caratteristiche 6-dimensionale per ogni blocco. I memorizzare questi vettori di caratteristiche in una matrice Mx6 su cui corro funzione kmeans ed ottenere i centroidi in una matrice kx6, dove k è il numero di cluster e 6 è il numero di caratteristiche per ciascun blocco.

Come posso disegnare questi cluster centro a mia immagine per visualizzare se l'algoritmo sta eseguendo il modo in cui vorrei che per eseguire? Oppure, se qualcuno ha un altro modo / suggerimenti su come posso visualizzare i baricentri sulla mia immagine, mi piacerebbe molto grato.

È stato utile?

Soluzione

Ecco un modo è possibile visualizzare i cluster:

Come hai descritto, per prima cosa estrarre i blocchi, calcolare il vettore funzione per ciascuno, e CLUSTER questa funzionalità matrice.

Poi si può visualizzare i grappoli assegnati a ciascun blocco. Si noti che io parto dal presupposto che i blocchi 4x4 sono distinte, questo è così importante che siamo in grado di mappare i blocchi alla loro posizione indietro nell'immagine originale.

Infine, al fine di visualizzare i centroidi dei cluster sull'immagine, ho semplicemente trovare il blocco più vicino a ciascun cluster e visualizzarli come rappresentante di tale cluster.

Ecco un esempio completo di mostrare l'idea di cui sopra (nel tuo caso, si vorrebbe sostituire la funzione che calcola le caratteristiche di ogni blocco da soli la propria attuazione; Sto semplicemente prendendo il min / max / media / mediana / Q1 / Q3 come la mia funzione di vettore per ogni blocco 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')

cluster image

Altri suggerimenti

I centroidi non corrispondono alle coordinate nell'immagine, ma per le coordinate nello spazio delle caratteristiche. Ci sono due modi in cui è possibile testare quanto bene Kmeans eseguita. Per entrambi i modi, si desidera associare pugno i punti con il loro gruppo più vicino. È possibile ottenere queste informazioni dalla prima uscita di Kmeans.

(1) è possibile visualizzare il risultato di clustering riducendo lo spazio 6-dimensionale spazio 2 o 3-dimensionale e quindi riportando le coordinate diversamente classificati in diversi colori.

Supponendo che i vettori di caratteristiche sono raccolti in un featureArray array chiamato, e che lei ha chiesto per i cluster nClusters, devi fare la trama come segue utilizzando mdscale per trasformare i dati, per esempio, spazio 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) È possibile, in alternativa, creare un'immagine pseudo-colorata che mostra quale parte dell'immagine appartiene a quale gruppo

Supponendo di avere nRows da blocchi nCols, si scrive

%# 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top