资源技术动态Matlab实现人脸识别

Matlab实现人脸识别

2019-10-08 | |  157 |   0

原标题:Matlab实现人脸识别   

来源:CSDN博客   [ wjzblog ]       链接:https://blog.csdn.net/weixin_42183571/article/details/80684382


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

           这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取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')

实验效果图:

                            01.png

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


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

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

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

1.人脸样本

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

                           02.png

%读取转换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);
%PCAface1=facefind(Cell_ten,imread('test.jpg'));
%识别subplot(1,2,1)imshow('test.jpg')title('测试图像')subplot(1,2,2)imshow(strcat(num2str(face1),'.jpg'))
title('数据库图像')

测试效果:

                                    03.png

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

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:图像入门:MATLAB图像识别

下一篇:深度学习之图像分类--VGG

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...