RGB图像的主成分分析

6 投票
1 回答
12810 浏览
提问于 2025-04-17 23:07

我正在尝试在Python中使用PCA来去除RGB图像之间的相关性。 我使用的是O'Reilly计算机视觉书中的代码:

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

我知道我需要把图像变成一维的,但它的形状是512x512x3。这个3的维度会影响我的结果吗?我该怎么处理这个? 我怎么才能找到一个具体的数字来表示保留了多少信息呢?

1 个回答

10

如果你的图像有三个颜色通道(就像RGB图像那样),你需要把图像的形状调整成下面这样:

X = X.reshape(-1, 3)

对于一个512x512的图像,新的X的形状会变成(262144, 3)。这里的3并不会影响你的结果;这个维度代表的是图像数据中的特征。X的每一行都是一个样本或观察值,而每一列则代表一个变量或特征。

图像中的总方差等于np.sum(S),也就是特征值的总和。你保留的方差量取决于你选择保留哪些特征值和特征向量。所以如果你只保留第一个特征值和特征向量,那么你保留的图像方差的比例将等于:

f = S[0] / np.sum(S)

撰写回答