最近在学习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('数据库图像')
测试效果:
使用这个方式可以实现简单的人脸识别,但精确度不高;使用神经网络会使精确度大幅度提高,再接再厉,学习使用神经网络实现人脸识别。此文介绍原理性的东西较少,现在对于介绍这一方面,本人比较欠缺,今后的日子里会更新些算法学习的东西。