Salut,
Tout d'abord, je te coneil (si c'est possible) d'utiliser la fonction eigh du module scipy.linalg à la place de celui de numpy car elle a l'avantage de retourner les valeur propre ordonnées et tu peux ne calculer que celles dont tu as besoin.
En imaginant que 'imgs' contient toutes tes images sous forms d'un tableau
nimgs x n x n.
1 2 3 4 5 6 7
| nimgs = imgs.shape[0]
n = imgs.shape[1]
imgVec = imgs.reshape(nimgs,n*n)
cov = np.cov(ImgVec.T)
w,u = eigh(cov,eigvals = (n*n-p,n*n-1)) # récupère les p plus grandes valeurs propres.
imgP = np.dot(imgVec - imgVec.mean(0),u) # projecte les images sur la nouvelle base |
Pour projeter les images dans la nouvelle base il suffit d'utiliser la matrices des vecteur propres comme matrice de projection. Si tu veux "blanchir" tes coordonées, c'est à dire donner la même importance à tous les axes dans la nouvelle base tu peux également diviser par la racine carrée des valeurs propres:
imgP = np.dot(imgVec - imgVec.mean(0),u/np.sqrt(w))
Partager