这种类似于智能手机拍照时,屏幕里那个框任务头部的红框。大致步骤为:获取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('数据库图像')
测试效果:
使用这个方式可以实现简单的人脸识别,但精确度不高;使用神经网络会使精确度大幅度提高,再接再厉,学习使用神经网络实现人脸识别。此文介绍原理性的东西较少,现在对于介绍这一方面,本人比较欠缺,今后的日子里会更新些算法学习的东西。