机器学习之PCA算法的人脸图像识别-平均脸的计算(详细操作步骤)

前言

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")
  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值