Pregunta

Tengo esta matriz, que representa a las similitudes de las intensidades de los píxeles de una imagen.Por ejemplo:Considere la posibilidad de un 10 x 10 imagen.La matriz a en este caso sería de dimensión 100 x 100, y el elemento(i,j) tendría un valor en el rango de 0 a 1, que representa la similitud de píxel de i a j en términos de intensidad.

Estoy usando OpenCV para el procesamiento de la imagen y el entorno de desarrollo de C en Linux.

El objetivo es calcular los vectores propios de la matriz a y la he utilizado el siguiente enfoque:

static CvMat mat, *eigenVec, *eigenVal;
static double A[100][100]={}, Ain1D[10000]={};
int cnt=0;

//Converting matrix A into a one dimensional array
//Reason: That is how cvMat requires it
for(i = 0;i < affnDim;i++){
  for(j = 0;j < affnDim;j++){
 Ain1D[cnt++] = A[i][j];
  }
}

mat = cvMat(100, 100, CV_32FC1, Ain1D); 

cvEigenVV(&mat, eigenVec, eigenVal, 1e-300);

for(i=0;i < 100;i++){
  val1 = cvmGet(eigenVal,i,0); //Fetching Eigen Value

  for(j=0;j < 100;j++){   
 matX[i][j] = cvmGet(eigenVec,i,j); //Fetching each component of Eigenvector i    
  }
}

Problema: Después de la ejecución puedo conseguir casi todos los componentes de todos los vectores propios a ser cero.He probado diferentes imágenes y también trató de llenar con valores aleatorios entre 0 y 1, pero el mismo resultado.

Algunos de los autovalores devuelve el siguiente aspecto:

9805401476911479666115491135488.000000  
-9805401476911479666115491135488.000000  
-89222871725331592641813413888.000000  
89222862280598626902522986496.000000  
5255391142666987110400.000000

Ahora estoy pensando en las líneas de usar cvSVD() que realiza la descomposición de valor singular de reales de punto flotante de la matriz y podría producir mí los vectores propios.Pero antes de eso pensé en preguntar aquí.Hay algo absurdo en mi enfoque actual?Estoy utilizando el derecho de la API es decir, cvEigenVV() para la entrada derecha de la matriz (a mi matriz es un punto flotante de la matriz)?

saludos

¿Fue útil?

Solución

Nota a los lectores:. Este puesto en un primer momento puede parecer sin relación con el tema, pero por favor refiérase a la discusión en los comentarios por encima de

La siguiente es mi intento de aplicación de la espectral Clustering algoritmo aplicado a píxeles de la imagen en MATLAB . He seguido exactamente el papel mencionado por @Andriyev:

  

Andrew Ng, Michael Jordan, y Yair Weiss (2002).   En agrupamiento espectral: análisis y un algoritmo.   En T. Dietterich, S. Becker, y Z. Ghahramani (Eds.),   Los avances en la información de los nervios 14. Sistemas de Procesamiento de MIT Press

El código:

%# parameters to tune
SIGMA = 2e-3;       %# controls Gaussian kernel width
NUM_CLUSTERS = 4;   %# specify number of clusters

%% Loading and preparing a sample image
%# read RGB image, and make it smaller for fast processing
I0 = im2double(imread('house.png'));
I0 = imresize(I0, 0.1);
[r,c,~] = size(I0);

%# reshape into one row per-pixel: r*c-by-3
%# (with pixels traversed in columwise-order)
I = reshape(I0, [r*c 3]);

%% 1) Compute affinity matrix
%# for each pair of pixels, apply a Gaussian kernel
%# to obtain a measure of similarity
A = exp(-SIGMA * squareform(pdist(I,'euclidean')).^2);

%# and we plot the matrix obtained
imagesc(A)
axis xy; colorbar; colormap(hot)

%% 2) Compute the Laplacian matrix L
D = diag( 1 ./ sqrt(sum(A,2)) );
L = D*A*D;

%% 3) perform an eigen decomposition of the laplacian marix L
[V,d] = eig(L);

%# Sort the eigenvalues and the eigenvectors in descending order.
[d,order] = sort(real(diag(d)), 'descend');
V = V(:,order);

%# kepp only the largest k eigenvectors
%# In this case 4 vectors are enough to explain 99.999% of the variance
NUM_VECTORS = sum(cumsum(d)./sum(d) < 0.99999) + 1;
V = V(:, 1:NUM_VECTORS);

%% 4) renormalize rows of V to unit length
VV = bsxfun(@rdivide, V, sqrt(sum(V.^2,2)));

%% 5) cluster rows of VV using K-Means
opts = statset('MaxIter',100, 'Display','iter');
[clustIDX,clusters] = kmeans(VV, NUM_CLUSTERS, 'options',opts, ...
    'distance','sqEuclidean', 'EmptyAction','singleton');

%% 6) assign pixels to cluster and show the results
%# assign for each pixel the color of the cluster it belongs to
clr = lines(NUM_CLUSTERS);
J = reshape(clr(clustIDX,:), [r c 3]);

%# show results
figure('Name',sprintf('Clustering into K=%d clusters',NUM_CLUSTERS))
subplot(121), imshow(I0), title('original image')
subplot(122), imshow(J), title({'clustered pixels' '(color-coded classes)'})

... y el uso de una imagen sencilla casa dibujé en Paint, los resultados fueron los siguientes:

matriz laplaciano imagen agrupado

y por cierto, los primeros 4 valores propios utilizados fueron:

1.0000
0.0014
0.0004
0.0002

y los vectores propios correspondientes [columnas de longitud r * c = 400]:

-0.0500    0.0572   -0.0112   -0.0200
-0.0500    0.0553    0.0275    0.0135
-0.0500    0.0560    0.0130    0.0009
-0.0500    0.0572   -0.0122   -0.0209
-0.0500    0.0570   -0.0101   -0.0191
-0.0500    0.0562   -0.0094   -0.0184
......

Tenga en cuenta que se lleva a cabo el paso por encima de lo que usted no mencionó en su pregunta (matriz de Laplace, y normalizar sus filas)

Otros consejos

Yo recomendaría este artículo . El autor implementa Eigenfaces para el reconocimiento de rostros. En la página 4 se puede ver que él usa cvCalcEigenObjects para generar los vectores propios de una imagen. En el artículo se muestra toda la etapa de procesamiento previo necesario para este cálculos.

Aquí hay una respuesta no muy útiles:

Lo que hace la teoría (o matemáticas garabateada en un trozo de papel) le dice a los vectores propios debería ser? Aproximadamente.

¿Qué te dice otra biblioteca de los vectores propios debería ser? Lo ideal sería que lo hace un sistema como Mathematica o arce (que puede ser persuadido para calcular a la precisión arbitraria) que diga a los vectores propios debería ser? Si no fuera por un problema de producción-fixo al menos para una solución de prueba de tamaño.

No soy un experto con el procesamiento de imágenes, así que no puedo ser mucho más útil, pero paso mucho tiempo con los científicos y la experiencia me ha enseñado que una gran cantidad de lágrimas y la ira puede ser evitado haciendo algunas matemáticas primera y la formación de una expectativa de qué resultados debe obtener antes de preguntarse por qué se metió 0s por todo el lugar. Seguro que podría ser un error en la aplicación de un algoritmo, podría ser una pérdida de precisión o algún otro problema numérico. Pero usted no sabe y no se debe hacer un seguimiento de esas líneas de investigación aún.

Regards

Marcar

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top