matlab jacobi算法求特征值_matlab 实现基于 PCA 的人脸识别算法

一、问题描述

在一个 yale 人脸库中,有 15 个人,每人有 11 幅图像。要求选定每一个人的 若干幅图像组成样本库,由样本库得到特征库。再任取 yale 图像库的一张图片, 识别它的身份。 

对于一幅图像可以看作一个由像素值组成的矩阵,也可以扩展开,看成一个 矢量。如一幅N*N象素的图像可以视为长度为N 2的矢量,这样就认为这幅图像是 位于N 2维空间中的一个点,这种图像的矢量表示就是原始的图像空间,但是这个 空间仅是可以表示或者检测图像的许多个空间中的一个。不管子空间的具体形式 如何,这种方法用于图像识别的基本思想都是一样的,首先选择一个合适的子空 间,图像将被投影到这个子空间上,然后利用对图像的这种投影间的某种度量来 确定图像间的相似度,最常见的就是各种距离度量。因此,本次采用PCA算法确定一个子空间,最后使用最小距离法进行识别,并用matlab实现。 二、PCA 原理和人脸识别方法

(1)K-L 变换 K-L 变换以原始数据的协方差矩阵的归一化正交特征矢量构成的正交矩阵作 为变换矩阵,对原始数据进行正交变换,在变换域上实现数据压缩。它具有去相 关性、能量集中等特性,属于均方误差测度下,失真最小的一种变换,是最能去 除原始数据之间相关性的一种变换。PCA 则是选取协方差矩阵前 k 个最大的特征值的特征向量构成 K-L 变换矩阵。

(2)主成分的数目的选取 保留多少个主成分取决于保留部分的累积方差在方差总和中所占百分比(即 累计贡献率),它标志着前几个主成分概括信息之多寡。实践中,粗略规定一个 百分比便可决定保留几个主成分;如果多留一个主成分,累积方差增加无几,便 不再多留。

(3)人脸空间建立 假设一幅人脸图像包含 N 个像素点,它可以用一个 N 维向量 Γ 表示。这样, 训练样本库就可以用 Γi(i=1,...,M)表示。协方差矩阵 C 的正交特征向量 就是组成人脸空间的基向量,即特征脸。将特征值由大到小排列:λ1≥λ2≥...≥λr,其对应的特征向量为 μk。这样 每一幅人脸图像都可以投影到由 u1,u2,...,ur张成的子空间中。因此,每一幅人 脸图像对应于子空间中的一点。同样,子空间的任意一点也对应于一幅图像。

(4)人脸识别 有了这样一个由"特征脸"张成的降维子空间,任何一幅人脸图像都可以向其 投影得到一组坐标系数,这组系数表明了该图像在子空间中的位置,从而可以作 为人脸识别的依据。计算数据库中每张图片在子空间中的坐标,得到一组坐标, 作为下一步识别匹配的搜索空间。计算新输入图片在子空间中的坐标,采用最小距离法,遍历搜索空间,得到 与其距离最小的坐标向量,该向量对应的人脸图像即为识别匹配的结果。

三、实现步骤 1) 每人选取 4 幅共 60 幅作为训练样本,将每一幅图像(128*128)写成列向量 形式 Xi (16384*1)排列成数据矩阵                                X = (X1,X2,…,Xn) (n=60) 2) 求均值向量                                μ = 1/? ∑ ?? ? ?  中心化后数据矩阵                               C=(X1-μ,X2-μ,…,Xn-μ)  协方差矩阵                                   ∑= 1/ ? CCT 3) 通过求 C T C 来求协方差矩阵特征值,选取最大的 k 个,求出特征向量(特征 脸)ei,将 k 个这样的特征向量按列排成变换矩阵                            (16384*k) W=(e1,e2,…,ek) 4) 计算每幅图像的投影(k 维列向量)                                  Yi=W T (Xi-μ) 5) 计算待识别人脸的投影(k 维列向量),设待识别人脸为                                Z chZ=WT (Z-μ)  6) 遍历搜索进行匹配                                 Yj=min||Yi-chZ||  那么 Z 就是第 j 个人 四、结果与分析 matlab 界面效果如下所示

5d9a4c757b52775a7fd762adc492937a.png

图 1 用户使用界面                                      图 2 选择图片

5139afa0b24d543c1972939226e795ae.png

图 3 图片选择后                                       图 4 识别后 由于利用了标准库,并且识别的人数不是很多,也没有选择有大块左阴影和 右阴影的人作为训练集以及测试,所以最终的结果还是非常不错的,识别率可达 100%。但是选择有较大阴影的人做测试,则会出现识别错误,所以 PCA 算法还是存 在一定的局限性。

81a2507314b85992621edacd4d67773b.png

                            图 5 识别错误附录——matlab 源码
function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% read image to be recognizeglobal im;[filename, pathname] = uigetfile({'*.bmp'},'choose photo');str = [pathname, filename];im = imread(str);axes( handles.axes1);imshow(im);% --- Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global imglobal referenceglobal Wglobal imgmeanglobal col_of_dataglobal pathnameglobal img_path_list% 预处理新数据im = double(im(:));objectone = W'*(im - imgmean);distance = 100000000;% 最小距离法,寻找和待识别图片最为接近的训练图片for k = 1:col_of_data temp = norm(objectone - reference(:,k)); if(distance>temp) aimone = k; distance = temp; aimpath = strcat(pathname, '/', img_path_list(aimone).name); axes( handles.axes2 ) imshow(aimpath) endend% 显示测试结果% aimpath = strcat(pathname, '/', img_path_list(aimone).name);% axes( handles.axes2 )% imshow(aimpath)% --- Executes on button press in pushbutton3.function pushbutton3_Callback(hObject, eventdata, handles)% hObject handle to pushbutton3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)global referenceglobal Wglobal imgmeanglobal col_of_dataglobal pathnameglobal img_path_list% 批量读取指定文件夹下的图片 128*128pathname = uigetdir;img_path_list = dir(strcat(pathname,'\*.bmp'));img_num = length(img_path_list);imagedata = [];if img_num >0 for j = 1:img_num img_name = img_path_list(j).name; temp = imread(strcat(pathname, '/', img_name)); temp = double(temp(:)); imagedata = [imagedata, temp]; endendcol_of_data = size(imagedata,2);% 中心化 & 计算协方差矩阵imgmean = mean(imagedata,2);for i = 1:col_of_data imagedata(:,i) = imagedata(:,i) - imgmean;endcovMat = imagedata'*imagedata;[COEFF, latent, explained] = pcacov(covMat);% 选择构成 95%能量的特征值i = 1;proportion = 0;while(proportion < 95) proportion = proportion + explained(i); i = i+1;endp = i - 1;% 特征脸W = imagedata*COEFF; % N*M 阶W = W(:,1:p); % N*p 阶% 训练样本在新座标基下的表达矩阵 p*Mreference = W'*imagedata;
ps:需要完整代码私聊或者留下邮箱。留言板
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值