title: PCA of RGB Image
body: <p>I'm trying to figure out how to use PCA to decorrelate an RGB image in python. 
  I'm using the code found in the O'Reilly Computer vision book:</p>
  
  <pre><code>from PIL import Image
  from numpy import *
  
  def pca(X):
    # Principal Component Analysis
    # input: X, matrix with training data as flattened arrays in rows
    # return: projection matrix (with important dimensions first),
    # variance and mean
  
    #get dimensions
    num_data,dim = X.shape
  
    #center data
    mean_X = X.mean(axis=0)
    for i in range(num_data):
        X[i] -= mean_X
  
    if dim&gt;100:
        print 'PCA - compact trick used'
        M = dot(X,X.T) #covariance matrix
        e,EV = linalg.eigh(M) #eigenvalues and eigenvectors
        tmp = dot(X.T,EV).T #this is the compact trick
        V = tmp[::-1] #reverse since last eigenvectors are the ones we want
        S = sqrt(e)[::-1] #reverse since eigenvalues are in increasing order
    else:
        print 'PCA - SVD used'
        U,S,V = linalg.svd(X)
        V = V[:num_data] #only makes sense to return the first num_data
  
     #return the projection matrix, the variance and the mean
     return V,S,mean_X
  </code></pre>
  
  <p>I know I need to flatten my image, but the shape is 512x512x3. Will the dimension of 3 throw off my result? How do I truncate this? 
  How do I find a quantitative number of how much information is retained? </p>