Pregunta

Mi pregunta principal se le da un centro de gravedad función, ¿cómo puedo dibujarlo en MATLAB?

En más detalle, tengo una imagen NxNx3 (una imagen RGB) de los cuales tomo bloques 4x4 y calcular un vector de características 6-dimensional para cada bloque. Almaceno estos vectores de características en una matriz Mx6 en el que corro función kmeans y obtener los centroides en una matriz kx6, donde k es el número de agrupaciones y 6 es el número de características para cada bloque.

¿Cómo puedo dibujar estos grupos centrales de mi imagen con el fin de visualizar si el algoritmo está realizando el camino me gustaría que para llevar a cabo? O si alguien tiene alguna otra forma y / o sugerencias sobre cómo puedo visualizar los centroides en mi imagen, me agradecería mucho.

¿Fue útil?

Solución

Aquí hay una manera que pueda visualizar los grupos:

Como se describió, primero puedo extraer los bloques, calcular el vector de características para cada uno, y agrupar esta cuenta matriz.

A continuación se puede visualizar los grupos asignados a cada bloque. Tenga en cuenta que estoy asumiendo que los bloques de 4x4 son distintos, esto es tan importante que podemos asignar los bloques para su posterior ubicación en la imagen original.

Por último, con el fin de mostrar los centroides de grupo sobre la imagen, simplemente encontrar el bloque más cercano a cada grupo y mostrarlo como un representante de ese grupo.

Aquí está un ejemplo completo para mostrar la idea anterior (en su caso, que se quiere sustituir la función que calcula las características de cada bloque por su propia implementación; simplemente estoy tomando el mínimo / máximo / media / mediana / Q1 / Q3 como mi vector de características para cada bloque 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 imagen

Otros consejos

Los centroides no corresponden a las coordenadas en la imagen, pero a coordenadas en el espacio de características. Hay dos maneras que usted puede probar qué tan bien KMeans a cabo. Para ambos sentidos, que desea asociar el puño los puntos con su grupo más cercano. Se obtiene esta información de la primera salida del kmeans.

(1) se puede visualizar el resultado de agrupación mediante la reducción del espacio de 6 dimensiones para espacio de 2 o 3-dimensional y luego trazando las coordenadas diferente clasificadas en diferentes colores.

Si se asume que los vectores de características se recogen en una matriz llamada featureArray, y que pedirá a las agrupaciones nClusters, que haría la trama como sigue usando mdscale para transformar los datos a, por ejemplo, el espacio 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) Se puede, alternativamente, crear una imagen de color pseudo-que le muestra qué parte de la imagen pertenece a la cual se agrupan

Si se asume que usted tiene nRows por bloques nCols, se escribe

%# 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top