Matlab实现人脸识别

 最近在学习matlab图像处理部分,发现人脸识别这一块非常好玩,在这里做个总结。

人脸识别之一:查找图片中的人脸并用方框圈出

           这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取RGB图片--->转换为灰度图像--->图像处理--->人脸识别。从书中摘出的代码如下:

clear all
clc

%获取原始图片
i=imread('face.jpg');
I=rgb2gray(i);        
BW=im2bw(I);             %利用阈值值变换法将灰度图像转换成二进制图像
figure(1);
imshow(BW);
%最小化背景
[n1 n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;

for i=1:10
    y1=1;y2=c;
    for j=1:10
        if(y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
            loc=find(BW(x1:x2,y1:y2)==0);
            [o p]=size(loc);
            pr=o*100/s;
            if pr<=100
                BW(x1:x2,y1:y2)=0;
                r1=x1;r2=x2;s1=y1;s2=y2;
                pr1=0;
            end
            imshow(BW);
        end
        y1=y1+c;
        y2=y2+c;
    end
    x1=x1+r;
    x2=x2+c;
end
figure(2)
subplot(1,2,1);
imshow(BW)
title('图像处理');
%人脸识别
L=bwlabel(BW,8);
BB=regionprops(L,'BoundingBox');
BB1=struct2cell(BB);
BB2=cell2mat(BB1);

[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1
    p=BB2(1,k)*BB2(1,k+1);
    if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
        mx=p;
        j=k;
    end
end
subplot(1,2,2);
title('人脸识别');
imshow(I);
hold on;
rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','r')

实验效果图:

                            

从实验效果图中,可以看出红框框出了人脸部分。

人脸识别之二:由输入的人像识别出数据库中人像

      这种情况类似于手机人脸解锁,通过当前的人脸去和保存的人脸做比对来实现解锁等功能;从网上看了好多资料,由于个人能力有限大多都没仿真出来,最后通过学习PCA算法,了解到可通过PCA算法对输入矩阵降维,提取特征值和特征向量的方式来做人脸比对。具体的PCA的东西在这里不作介绍,主要介绍一下如何实现人脸比对。

      大致步骤:制作人脸数据样本--->PCA提取样本数据特征值--->人脸比对

1.人脸样本

       从网上搜集了10张人脸图片,来制作成样本。

                           

%读取转换10张图片,生成数据矩阵
function ImgData = imgdata()  
%导入图片
picture1 = rgb2gray(imread('1.jpg')); 
picture2 = rgb2gray(imread('2.jpg')); 
picture3 = rgb2gray(imread('3.jpg')); 
picture4 = rgb2gray(imread('4.jpg'));   
picture5 = rgb2gray(imread('5.jpg'));  
picture6 = rgb2gray(imread('6.jpg')); 
picture7 = rgb2gray(imread('7.jpg'));  
picture8 = rgb2gray(imread('8.jpg'));   
picture9 = rgb2gray(imread('9.jpg'));
picture10 = rgb2gray(imread('10.jpg'));  
[m,n] = size(picture1); 
picture_ten = {picture1,picture2,picture3,picture4,picture5,picture6,picture7,picture8,picture9,picture10};  
for i=1:10 
    %把m*n的矩阵变换成1*(m*n)的矩阵  
    ImgData(i,:) = reshape(picture_ten{i},1,m*n);  
end  
%数据范围缩小到0到1之间  
ImgData = double(ImgData)/255;  

2. PCA分析

function Cell_ten = PCA(imgdata,k)  
[m,n] = size(imgdata);    
img_mean = mean(imgdata); %计算每列平均值  
img_mean_ten = repmat(img_mean,m,1); %复制m行平均值至矩阵img_mean_ten 
Z = imgdata - img_mean_ten;  
T = Z'*Z;%协方差矩阵      
[V,D] = eigs(T,k); %计算T中最大的前k个特征值与特征向量  
img_new = imgdata*V*D;  %低维度下的各个人脸的数据  
Cell_ten = {img_new,V,D};

3.通过输入测试人脸从数据库中找到相对应人脸

function face=  facefind(Cell_ten,testdata)%此函数代码借鉴于他人,还未征求其同意,这里就暂时略过

这里testdata是测试图片的数据

4.主程序调用

img=imgdata(); %图片矩阵数据
Cell_ten=PCA(img,2);% PCA
face1=facefind(Cell_ten,imread('test.jpg'));%识别
subplot(1,2,1)
imshow('test.jpg')
title('测试图像')
subplot(1,2,2)
imshow(strcat(num2str(face1),'.jpg'))
title('数据库图像')

测试效果:

                                    

使用这个方式可以实现简单的人脸识别,但精确度不高;使用神经网络会使精确度大幅度提高,再接再厉,学习使用神经网络实现人脸识别。此文介绍原理性的东西较少,现在对于介绍这一方面,本人比较欠缺,今后的日子里会更新些算法学习的东西。

猜你喜欢

转载自blog.csdn.net/weixin_42183571/article/details/80684382