Frage

Ich habe diese Matrix A, Ähnlichkeiten von Pixelintensitäten eines Bildes darstellen. Zum Beispiel: ein 10 x 10 Bild Betrachten. Matrix A in diesem Fall wäre die Dimension 100 x 100 und das Element A (i, j) würde einen Wert im Bereich von 0 bis 1 hat, was die Ähnlichkeit von Pixel i zu j in Bezug auf der Intensität.

Ich bin mit OpenCV zur Bildverarbeitung und die Entwicklungsumgebung ist C auf Linux.

Ziel ist es, die Eigenvektoren der Matrix A zu berechnen, und ich habe den folgenden Ansatz verwendet:

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    
  }
}

Problem: Nach der Ausführung ich fast alle bekommen Komponenten aller Eigenvektoren Null. Ich habe versucht, verschiedene Bilder und versuchte auch A mit zufälligen Werten zwischen 0 und 1, aber dem gleichen Ergebnis bevölkert.

Nur wenige der Top-Eigenwerte zurück wie folgt aussehen:

9805401476911479666115491135488.000000  
-9805401476911479666115491135488.000000  
-89222871725331592641813413888.000000  
89222862280598626902522986496.000000  
5255391142666987110400.000000

Ich denke jetzt auf den Linien des mit „noreferrer“> cvSVD (), die Zersetzung von realer Gleitpunkt-Matrix Singulärwert durchführt und ich könnte die Eigenvektoren erhalten wird. Aber vorher dachte ich es hier zu fragen. Gibt es etwas absurd in meinem jetzigen Ansatz? Bin ich die richtige API dh cvEigenVV () für die rechte Eingangsmatrix (meine Matrix A ist eine Gleitkomma-Matrix)?

cheers

War es hilfreich?

Lösung

Hinweis für die Leser:. Dieser Beitrag zunächst auf das Thema nicht verwandt zu sein scheint, aber bitte oben auf die Diskussion in den Kommentaren beziehen

Das folgende ist mein Versuch, bei der Umsetzung der Spectral Clustering Algorithmus angewendet, um Bildpixel in MATLAB . Ich folgte genau der Papier von @Andriyev erwähnt:

  

Andrew Ng, Michael Jordan und Yair Weiss (2002).   Auf Spectral Clustering: Analyse und einen Algorithmus.   In T. Dietterich, S. Becker und Z. Ghahramani (Eds.),   Die Fortschritte in der Neural Information Processing Systeme 14. MIT Press

Der Code:

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

... und mit einem einfachen Hause Bild, das ich in Paint zog, waren die Ergebnisse:

Laplace-Matrix Bild geclustert

und durch die Art und Weise, die ersten 4 Eigenwerte wurden verwendet:

1.0000
0.0014
0.0004
0.0002

und die entsprechenden Eigenvektoren [Spalten der Länge 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
......

Beachten Sie, dass es Schritt durchgeführt, über den Sie nicht in Ihrer Frage (Laplace-Matrix und die Normalisierung ihre Zeilen) erwähnen

Andere Tipps

Ich würde dieses Artikel rel="nofollow. Der Autor setzt Eigengesichter für die Gesichtserkennung. Auf Seite 4 kann man sehen, dass er cvCalcEigenObjects nutzt die Eigenvektoren von einem Bild zu erzeugen. In dem Artikel der gesamte Pre Verarbeitungsschritt notwendig für diese Berechnungen gezeigt.

Hier ist eine nicht sehr hilfreiche Antwort:

Was Theorie tut (oder auf einem Stück Papier gekritzelt Mathematik) erzählen Sie die Eigenvektoren sein sollten? Ungefähr.

Was ist eine andere Bibliothek Ihnen sagen, die Eigenvektoren sein sollte? Im Idealfall, was sich ein System wie Mathematica oder Maple (die mit beliebiger Genauigkeit zu berechnen, dazu gebracht werden kann) sagen Sie die Eigenvektoren sein sollte? Wenn nicht für ein produktions sixed Problem zumindest für einen Test großen Problem.

Ich bin kein Experte mit Bildverarbeitung, damit ich nicht viel hilfreicher sein kann, aber ich verbringe hat viel Zeit mit Wissenschaftlern und Erfahrung hat mich gelehrt, dass viele Tränen und Wut können, indem Sie einige Mathematik vermieden werden erste und eine Erwartung zu bilden, welche Ergebnisse Sie vor fragen, bekommen sollten, warum Sie 0s ganzen Ort bekam. Sicher, es könnte ein Fehler bei der Implementierung eines Algorithmus sein, könnte es Genauigkeitsverlust oder ein anderes numerisches Problem sein. Aber Sie wissen nicht, und sollte noch jene Linien der Untersuchung nicht folgen zu lassen.

Viele Grüße

Mark

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top