前言
PCA算法介绍
PCA算法的步骤:
1:求出每一列的平均值,让该列的元素减去求出的平均值
2:求该矩阵的协方差矩阵
3:求特征值、特征矩阵
4:保留主要的成分
这次讲PCA算法的前期准备工作,即收集朋友的照片,自拍照。以不同的角度拍摄十张照片。然后用PS等图像处理软件对照片进行处理,照片分辨率为92X112像素,72分辨率,8位深度,并将图像变为灰度图像,如下图所示。
将图像保存为JPG格式和PGM格式,JPG格式方便查看,PGM格式让程序进行读取,获取数据。每个人收集十张照片,以0-9进行命名。
因为肖像问题,就不给大家显示人物的图像了。做好这个之后,我们就可以使用jupyter notebook进行编程了。
jupyter notebook编程程序
首先先引入
import numpy as np
import math
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
读取第一张照片,并让其显示出灰色图像。
img = mpimg.imread('./face_image/0/0.pgm')
plt.imshow(img,cmap='gray')
将像素的长和宽进行定义
img_height, img_width = mpimg.imread('./face_image/0/0.pgm').shape #照片像素
通过循环语句一次读取照片的数据,并将数据集保存到vectorized_images中。
#读取train数据
vectorized_images = []
for image_data in range(7):
image_data > 7
img_path ='./face_image/' + str(image_data) + '/'+'{0}.pgm'
for image_no in range(0, 9):
img = mpimg.imread(img_path.format(image_no))
vectorized_images.append(img.ravel())
# ravel函数是 numpy 的函数: 将多维数组中的元素变成一个一维数组
vectorized_images #这是一个list对象,里面每一个一维数组代表一张图片
显示出数据集中的照片
vectorized_images[0].reshape((img_height, img_width))
plt.imshow(vectorized_images[-1].reshape((img_height,img_width)),cmap="gray")
显示出所有的数据集的照片,并将其加上相应的label
#显示所有的train data
nrows = int((img_per_person)/9)
ncols = 9
fig, axes = plt.subplots(nrows,ncols, figsize = (25, 13))
title = 'face {0}'
for i in range(nrows):
for j in range(ncols):
axes[i,j].imshow(vectorized_images[i*9+j].reshape((img_height,img_width)),cmap="gray")
axes[i,j].set_title(title.format(j))
for ax in axes.ravel():
ax.axis('off')
读取出后的结果为:
gamma = np.array(vectorized_images) #把list对象变成数组
print(gamma.shape) #63行,10304列
print(gamma)
计算平均脸
average_face = np.mean(gamma, axis = 0) #axis = 0:压缩行,对各列求均值,返回 1* n 矩阵
print(average_face)
最终将平均脸显示出来
plt.imshow(average_face.reshape((img_height,img_width)),cmap="gray")