众所周知,PCA(Principal Component Analysis) (也叫作 Karhunen-Loeve 变换)在模式识别和计算机视觉领域是一个经典的特征提取和数据降维的工具。而2DPCA(二维主成分分析法)方法是在 PCA 的基础之上发展起来的一种新型的主成分分析方法. 相对于传统的PCA方法,2DPCA是基于二维图像矩阵的,而非一维图像向量。这种处理方法不需要事先把图像转成一维的向量,相当于去除了图像的行向量或列向量的相关性。
在 2DPCA 中,图像的协方差矩阵可以通过使用原始图像矩阵直接构造出来。与 PCA 构造的协方差矩阵相比,使用 2DPCA 的协方差矩阵要小很多。其主要优点有:
2DPCA 是 Yang 和Zhang 等人提出来的一种直接图像投影技术,本质上是一种主成分的方法,同时也是一种非监督的学习方法。
设 Ai,i=1,2,⋯,N 是 N 个样本图像, Aj∈Rm×n 。 首先计算协方差矩阵,也就是总体散布矩阵 Gt :
由于只在列方向降低了维数,降维的效果不理想。为了更好的降维,D.Q. Zhang 和 Z.H. Zhou 提出了双向的二维主成分分析方法(2D2DPCA),也就是在行和列两个方向都进行2DPCA处理。
对所有的训练样本进行上诉的 2DPCA 处理之后得到新的训练样本 Fj,j=1,2,⋯,N ,其中 Yj∈Rm×k 。在新样本上构造协方差矩阵 G∗t :
2DPCA 的实现
def TwoDPCA(imgs,p):
'''
imgs 是三维的图像矩阵,第一维是图像的个数
'''
a,b,c = imgs.shape
average = np.zeros((b,c))
for i in range(a):
average += imgs[i,:,:]/(a*1.0)
G_t = np.zeros((c,c))
for j in range(a):
img = imgs[j,:,:]
temp = img-average
G_t = G_t + np.dot(temp.T,temp)/(a*1.0)
w,v = np.linalg.eigh(G_t)
w = w[::-1]
v = v[::-1]
for k in range(c):
alpha = sum(w[:k])*1.0/sum(w)
if alpha >= p:
u = v[:,:k]
break
return u
2D2DPCA 的实现
def TTwoDPCA(imgs,p):
u = TwoDPCA(imgs,p)
a1,b1,c1 = imgs.shape
img = []
for i in range(a1):
temp1 = np.dot(imgs[i,:,:],u)
img.append(temp1.T)
img = np.array(img)
uu = TwoDPCA(img,p)
return u,uu
参考文献
[1] Jian Y, David Z, Frangi A F, et al. Two-dimensional PCA: a new approach to appearance-based face representation and recognition.[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2004, 26(1):131-137.
[2] 陆丽. 基于人脸图像的性别识别与年龄估计研究[D]. 上海交通大学, 2010.