Domanda

Ho questa matrice A, che rappresenta somiglianze di intensità dei pixel di un'immagine. Per esempio: si consideri un'immagine 10 x 10. Matrice A in questo caso sarebbe di dimensione 100 x 100 ed elemento A (i, j) avrebbe un valore nell'intervallo da 0 a 1, che rappresenta la somiglianza dei pixel i per j in termini di intensità.

Sto usando OpenCV per l'elaborazione delle immagini e l'ambiente di sviluppo è C su Linux.

Obiettivo è quello di calcolare gli autovettori della matrice A e ho usato il seguente approccio:

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: Dopo l'esecuzione ottengo quasi tutti i componenti di tutti gli autovettori di essere zero. Ho provato immagini diverse e anche provato popolamento A con valori casuali tra 0 e 1, ma lo stesso risultato.

Alcuni dei migliori autovalori simile al seguente restituito:

9805401476911479666115491135488.000000  
-9805401476911479666115491135488.000000  
-89222871725331592641813413888.000000  
89222862280598626902522986496.000000  
5255391142666987110400.000000

Ora sto pensando sulle linee di utilizzare cvSVD () che esegue decomposizione ai valori singolari della matrice reale virgola mobile e mi potrebbero cedere gli autovettori. Ma prima che ho pensato di chiedere qui. C'è qualcosa di assurdo nel mio approccio attuale? Sto usando l'API destra cioè cvEigenVV () per la matrice ingresso destro (mia matrice a è una matrice in virgola mobile)?

applausi

È stato utile?

Soluzione

Nota per i lettori:. Questo post in un primo momento può sembrare estraneo al tema, ma si prega di fare riferimento alla discussione nei commenti sopra

Quello che segue è il mio tentativo di attuare il spettrale Clustering algoritmo applicato a pixel dell'immagine in MATLAB . Ho seguito esattamente la carta fornita dal @Andriyev:

  

Andrew Ng, Michael Jordan, e Yair Weiss (2002).   Su di clustering spettrale: analisi e un algoritmo.   T. Dietterich, S. Becker, e Z. Ghahramani (Eds.),   I progressi nella Neural Informazioni Sistemi di elaborazione 14. MIT Press

Il codice:

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

... e utilizzando un'immagine semplice casa ho disegnato in vernice, i risultati sono stati:

matrice laplaciano image cluster

e tra l'altro, i primi 4 autovalori utilizzati sono stati:

1.0000
0.0014
0.0004
0.0002

ei corrispondenti autovettori [colonne di lunghezza 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
......

Si noti che ci sono step eseguiti sopra del quale lei non ha citato nella sua interrogazione (matrice Laplacian, e normalizzando le sue file)

Altri suggerimenti

Vorrei raccomandare questo articolo . L'autore implementa Eigenfaces per il riconoscimento del volto. A pagina 4 si può vedere che egli utilizza per generare cvCalcEigenObjects autovettori da un'immagine. Nell'articolo sono presenti l'intera fase di trattamento pre necessario per questo calcoli.

Ecco una risposta non molto utili:

Che cosa significa la teoria (o la matematica scarabocchiato su un pezzo di carta) si raccontano gli autovettori dovrebbe essere? Circa.

Che cosa significa un'altra libreria vi dico gli autovettori dovrebbe essere? Idealmente cosa fa un sistema come Mathematica o acero (che può essere convinto a calcolare con precisione arbitraria) vi dirà autovettori dovrebbe essere? Se non fosse per un problema di produzione-sixed almeno per un problema di prova di dimensioni.

Io non sono un esperto con l'elaborazione delle immagini, quindi non posso essere molto più utile, ma spendo un sacco di tempo con gli scienziati e l'esperienza mi ha insegnato che un sacco di lacrime e la rabbia può essere evitato facendo alcuni matematica prima e formare un'aspettativa di quali risultati si dovrebbe ottenere prima di chiedersi il motivo per cui hai 0s tutto il luogo. Certo potrebbe essere un errore nella realizzazione di un algoritmo, potrebbe essere perdita di precisione o di qualche altro problema numerico. Ma non si conosce e non si deve seguire queste linee di indagine ancora.

Saluti

Mark

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top