基于matlab程序实现人脸识别

合集下载

matlab 模式识别案例

matlab 模式识别案例

matlab 模式识别案例一、介绍模式识别是一种通过学习样本数据集合中的规律,从而对未知数据进行分类或预测的技术。

在实际应用中,模式识别广泛应用于图像识别、语音识别、生物信息学等领域。

而MATLAB作为一种强大的数学计算软件,提供了丰富的工具包和函数用于模式识别的实现。

本文将介绍十个基于MATLAB的模式识别案例。

二、案例一:手写数字识别手写数字识别是模式识别中的经典问题之一。

利用MATLAB的图像处理工具箱,可以实现对手写数字图像的分割、特征提取和分类。

通过对训练集的学习,建立一个分类器,然后用测试集进行验证,即可实现对手写数字的识别。

三、案例二:人脸识别人脸识别是模式识别中的重要应用之一。

利用MATLAB的人脸识别工具箱,可以实现对人脸图像的特征提取和分类。

通过对训练集的学习,建立一个人脸模型,然后用测试集进行验证,即可实现对人脸的识别。

四、案例三:语音识别语音识别是模式识别中的重要应用之一。

利用MATLAB的语音处理工具箱,可以实现对语音信号的特征提取和分类。

通过对训练集的学习,建立一个语音模型,然后用测试集进行验证,即可实现对语音的识别。

五、案例四:信号识别信号识别是模式识别中的重要应用之一。

利用MATLAB的信号处理工具箱,可以实现对信号的特征提取和分类。

通过对训练集的学习,建立一个信号模型,然后用测试集进行验证,即可实现对信号的识别。

六、案例五:文本分类文本分类是模式识别中的重要应用之一。

利用MATLAB的自然语言处理工具箱,可以实现对文本的特征提取和分类。

通过对训练集的学习,建立一个文本模型,然后用测试集进行验证,即可实现对文本的分类。

七、案例六:图像分割图像分割是模式识别中的重要问题之一。

利用MATLAB的图像处理工具箱,可以实现对图像的分割。

通过对图像的像素进行聚类,将图像划分为不同的区域,从而实现图像分割。

八、案例七:异常检测异常检测是模式识别中的重要问题之一。

利用MATLAB的统计工具箱,可以实现对数据的异常检测。

基于matlab程序实现人脸识别

基于matlab程序实现人脸识别

基于matlab程序实现人脸识别
人脸识别已经成为一个广泛被应用的技术,例如手机的解锁方式,安全系统等等。

它是一种基于人脸图像进行身份验证或身份识别的技术,也是近年来计算机视觉和模式识别领域研究的热点方向之一。

在这篇文档中,我们将介绍如何使用matlab编写一个简单的人脸识别程序。

人脸识别是什么?
人脸识别可以被定义为一个过程,旨在使用数字算法识别和验证图像或视频中
人脸身份。

在计算机科学的领域中,这项技术可以被描述为一种模式识别技术,
旨在通过在人脸图像上提取可识别特征来确定身份验证。

通俗易懂地理解,就是计算机能够识别人脸的特征,并将其与已知的数据匹配,从而确定人物身份。

人脸识别程序的开发流程
以下是本文介绍的基本程序开发流程:
1.数据集导入和预处理
2.特征提取和脸部对齐
3.模型训练和分类器设计
4.模型评估和测试
数据集导入和预处理
考虑到一个好的项目,我们需要一个良好的数据集。

在这里,我们可以使用来
自orl人脸数据集的数据。

该数据集中包含的有40个人的400幅灰度图像,每个
人有10个不同的示例。

您可以从该网站下载并使用这些数据来测试您的算法。

在这个过程中,我们需要使用matlab中的imread函数将数据读取为数字矩阵,然后将数据分为训练集和测试集。

这个过程旨在将原始的数据转换为我们算法能
够处理的数字矩阵,并将数据划分为训练集和测试集。

``` % 读取数据集 dataFolderPath =。

基于MATLAB的人脸朝向识别

基于MATLAB的人脸朝向识别

clear allclc;%% 人脸特征向量提取% 人数M=10;% 人脸朝向类别数N=5;% 特征向量提取pixel_value=feature_extraction(M,N);%% 训练集/测试集产生% 产生图像序号的随机序列rand_label=randperm(M*N);% 人脸朝向标号direction_label=repmat(1:N,1,M);% 训练集train_label=rand_label(1:30);P_train=pixel_value(train_label,:)';Tc_train=direction_label(train_label);T_train=ind2vec(Tc_train);% 测试集test_label=rand_label(31:end);P_test=pixel_value(test_label,:)';Tc_test=direction_label(test_label);%% K-fold交叉验证确定最佳神经元个数k_fold=10;Indices=crossvalind('Kfold',size(P_train,2),k_fold); error_min=10e10;best_number=1;best_input=[];best_output=[];best_train_set_index=[];best_validation_set_index=[];h=waitbar(0,'正在寻找最佳神经元个数.....');for i=1:k_fold% 验证集标号validation_set_index=(Indices==i);% 训练集标号train_set_index=~validation_set_index;% 验证集validation_set_input=P_train(:,validation_set_index);validation_set_output=T_train(:,validation_set_index);% 训练集train_set_input=P_train(:,train_set_index);train_set_output=T_train(:,train_set_index);for number=10:30for j=1:5rate{j}=length(find(Tc_train(:,train_set_index)==j))/length(find(train_set_index==1)) ;endnet=newlvq(minmax(train_set_input),number,cell2mat(rate));% 设置网络参数net.trainParam.epochs=100;net.trainParam.show=10;net.trainParam.lr=0.1;net.trainParam.goal=0.001;% 训练网络net=train(net,train_set_input,train_set_output);waitbar(((i-1)*21+number)/219,h);%% 仿真测试T_sim=sim(net,validation_set_input);Tc_sim=vec2ind(T_sim);error=length(find(Tc_sim~=Tc_train(:,validation_set_index)));if error<error_minerror_min=error;best_number=number;best_input=train_set_input;best_output=train_set_output;best_train_set_index=train_set_index;best_validation_set_index=validation_set_index;endendenddisp(['经过交叉验证,得到的最佳神经元个数为:' num2str(best_number)]); close(h);%% 创建LVQ网络for i=1:5rate{i}=length(find(Tc_train(:,best_train_set_index)==i))/length(find(best_train_set_i ndex==1));endnet=newlvq(minmax(best_input),best_number,cell2mat(rate),0.01);% 设置训练参数net.trainParam.epochs=100;net.trainParam.goal=0.001;net.trainParam.lr=0.1;%% 训练网络net=train(net,best_input,best_output);%% 人脸识别测试T_sim=sim(net,P_test);Tc_sim=vec2ind(T_sim);result=[Tc_test;Tc_sim]%% 结果显示% 训练集人脸标号strain_label=sort(train_label(best_train_set_index));htrain_label=ceil(strain_label/N);% 训练集人脸朝向标号dtrain_label=strain_label-floor(strain_label/N)*N;dtrain_label(dtrain_label==0)=N;% 显示训练集图像序号disp('训练集图像为:' );for i=1:length(find(best_train_set_index==1))str_train=[num2str(htrain_label(i)) '_'...num2str(dtrain_label(i)) ' '];fprintf('%s',str_train)if mod(i,5)==0fprintf('\n');endend% 验证集人脸标号svalidation_label=sort(train_label(best_validation_set_index)); hvalidation_label=ceil(svalidation_label/N);% 验证集人脸朝向标号dvalidation_label=svalidation_label-floor(svalidation_label/N)*N; dvalidation_label(dvalidation_label==0)=N;% 显示验证集图像序号fprintf('\n');disp('验证集图像为:' );for i=1:length(find(best_validation_set_index==1)) str_validation=[num2str(hvalidation_label(i)) '_'...num2str(dvalidation_label(i)) ' '];fprintf('%s',str_validation)if mod(i,5)==0fprintf('\n');endend% 测试集人脸标号stest_label=sort(test_label);htest_label=ceil(stest_label/N);% 测试集人脸朝向标号dtest_label=stest_label-floor(stest_label/N)*N;dtest_label(dtest_label==0)=N;% 显示测试集图像序号fprintf('\n');disp('测试集图像为:');for i=1:20str_test=[num2str(htest_label(i)) '_'...num2str(dtest_label(i)) ' '];fprintf('%s',str_test)if mod(i,5)==0fprintf('\n');endend% 显示识别出错图像error=Tc_sim-Tc_test;location={'左方' '左前方' '前方' '右前方' '右方'};for i=1:length(error)if error(i)~=0% 识别出错图像人脸标号herror_label=ceil(test_label(i)/N);% 识别出错图像人脸朝向标号derror_label=test_label(i)-floor(test_label(i)/N)*N;derror_label(derror_label==0)=N;% 图像原始朝向standard=location{Tc_test(i)};% 图像识别结果朝向identify=location{Tc_sim(i)};str_err=strcat(['图像' num2str(herror_label) '_'...num2str(derror_label) '识别出错.']);disp([str_err '(正确结果:朝向' standard...';识别结果:朝向' identify ')']);endend% 显示识别率disp(['识别率为:' num2str(length(find(error==0))/20*100) '%']); % 特征提取子函数function pixel_value=feature_extraction(m,n)pixel_value=zeros(50,8);sample_number=0;for i=1:mfor j=1:nstr=strcat('Images\',num2str(i),'_',num2str(j),'.bmp');img= imread(str);[rows cols]= size(img);img_edge=edge(img,'Sobel');sub_rows=floor(rows/6);sub_cols=floor(cols/8);sample_number=sample_number+1;for subblock_i=1:8for ii=sub_rows+1:2*sub_rowsfor jj=(subblock_i-1)*sub_cols+1:subblock_i*sub_colspixel_value(sample_number,subblock_i)=...pixel_value(sample_number,subblock_i)+img_edge(ii,jj);endendendendendfunction [w1,w2]=lvq1_train(P,Tc,Num_Compet,pc,lr,maxiter)%% 初始化权系数矩阵% 输入层与竞争层之间权值bound=minmax(P);w1=repmat(mean(bound,2)',Num_Compet,1);% 竞争层与输出层之间权值Num_Output=length(pc);pc=pc(:);indices=[0;floor(cumsum(pc)*Num_Compet)];w2=zeros(Num_Output,Num_Compet);for i=1:Num_Outputw2(i,(indices(i)+1):indices(i+1)) = 1;end%% 迭代计算n=size(P,2);for k=1:maxiterfor i=1:nd=zeros(Num_Compet,1);for j=1:Num_Competd(j)=sqrt(sse(w1(j,:)'-P(:,i)));end[min_d,index]=min(d);n1=compet(-1*d);n2=purelin(w2*n1);if isequal(Tc(i),vec2ind(n2));w1(index,:)=w1(index,:)+lr*(P(:,i)'-w1(index,:));elsew1(index,:)=w1(index,:)-lr*(P(:,i)'-w1(index,:));endendendfunction [w1,w2]=lvq2_train(P,Tc,Num_Compet,lr,maxiter,w1,w2)%% 迭代计算n=size(P,2);for k=1:maxiterfor i=1:n% 计算各个竞争层神经元与当前输入向量的距离d=zeros(Num_Compet,1);for j=1:Num_Competd(j)=sqrt(sse(w1(j,:)'-P(:,i)));end% 寻找与当前输入向量距离最小的竞争层神经元标号,记为index1[min_d1,index1]=min(d);% 计算与index1相连接的输出神经元对应的类别a1_1=compet(-1*d);n2_1=purelin(w2*a1_1);a2_1=vec2ind(n2_1);% 寻找与当前输入向量距离次小的竞争层神经元标号,记为index2d(index1)=inf;[min_d2,index2]=min(d);% 计算与index2相连接的输出神经元对应的类别a1_2=compet(-1*d);n2_2=purelin(w2*a1_2);a2_2=vec2ind(n2_2);% 判断两个竞争层神经元对应的类别是否相等flag1=isequal(a2_1,a2_2);flag2=min_d1/min_d2>0.6;if ~flag1 && flag2if isequal(Tc(i),a2_1)w1(index1,:)=w1(index1,:)+lr*(P(:,i)'-w1(index1,:));w1(index2,:)=w1(index2,:)-lr*(P(:,i)'-w1(index2,:));elsew1(index1,:)=w1(index1,:)-lr*(P(:,i)'-w1(index1,:));w1(index2,:)=w1(index2,:)+lr*(P(:,i)'-w1(index2,:));endelsew1(index1,:)=w1(index1,:)+lr*(P(:,i)'-w1(index1,:));endendendfunction result=lvq_predict(P,Tc,Num_Compet,w1,w2)n=size(P,2);result=zeros(2,n);result(1,:)=Tc;for i=1:nd=zeros(Num_Compet,1);for j=1:Num_Competd(j)=sqrt(sse(w1(j,:)'-P(:,i)));endn1=compet(-1*d);n2=purelin(w2*n1);result(2,i)=vec2ind(n2);endNum_Correct=length(find(result(2,:)==Tc));accuracy=Num_Correct/n;disp(['accuracy=' num2str(accuracy*100) '%(' num2str(Num_Correct) '/' num2str(n) ')']);%% 清除环境变量clear allclc;%% 人脸特征向量提取% 人数M=10;% 人脸朝向类别数N=5;% 特征向量提取pixel_value=feature_extraction(M,N);%% 训练集/测试集产生% 产生图像序号的随机序列rand_label=randperm(M*N);% 人脸朝向标号direction_label=repmat(1:N,1,M);% 训练集train_label=rand_label(1:30);P_train=pixel_value(train_label,:)';Tc_train=direction_label(train_label);test_label=rand_label(31:end);P_test=pixel_value(test_label,:)';Tc_test=direction_label(test_label);%% 计算PCfor i=1:5rate{i}=length(find(Tc_train==i))/30;end%% LVQ1算法[w1,w2]=lvq1_train(P_train,Tc_train,20,cell2mat(rate),0.01,5); result_1=lvq_predict(P_test,Tc_test,20,w1,w2);%% LVQ2算法[w1,w2]=lvq2_train(P_train,Tc_train,20,0.01,5,w1,w2); result_2=lvq_predict(P_test,Tc_test,20,w1,w2);%% 清除环境变量clear allclc;%% 人脸特征向量提取% 人数M=10;% 人脸朝向类别数N=5;% 特征向量提取pixel_value=feature_extraction(M,N);%% 训练集/测试集产生% 产生图像序号的随机序列rand_label=randperm(M*N);% 人脸朝向标号direction_label=[1 0 0;1 1 0;0 1 0;0 1 1;0 0 1];train_label=rand_label(1:30);P_train=pixel_value(train_label,:)';dtrain_label=train_label-floor(train_label/N)*N;dtrain_label(dtrain_label==0)=N;T_train=direction_label(dtrain_label,:)';% 测试集test_label=rand_label(31:end);P_test=pixel_value(test_label,:)';dtest_label=test_label-floor(test_label/N)*N;dtest_label(dtest_label==0)=N;T_test=direction_label(dtest_label,:)'%% 创建BP网络net=newff(minmax(P_train),[10,3],{'tansig','purelin'},'trainlm'); % 设置训练参数net.trainParam.epochs=1000;net.trainParam.show=10;net.trainParam.goal=1e-3;net.trainParam.lr=0.1;%% 网络训练net=train(net,P_train,T_train);%% 仿真测试T_sim=sim(net,P_test);for i=1:3for j=1:20if T_sim(i,j)<0.5T_sim(i,j)=0;elseT_sim(i,j)=1;endendT_sim T_test。

如何使用Matlab进行人脸检测和人脸识别

如何使用Matlab进行人脸检测和人脸识别

如何使用Matlab进行人脸检测和人脸识别人脸检测和人脸识别是计算机视觉领域中的重要技术应用,可以广泛用于人脸识别系统、人脸支付、安全监控等众多领域。

本文将介绍如何使用Matlab进行人脸检测和人脸识别。

1. 背景介绍人脸检测和人脸识别技术的出现,为计算机系统实现对人脸的自动分析和识别提供了可能。

人脸检测是指从一幅图像或视频序列中确定是否存在人脸,并找出人脸的位置和大小。

而人脸识别则是在检测到的人脸图像上进行特征提取和模式匹配,以实现对人脸的身份识别。

2. 人脸检测在Matlab中,可以使用Viola-Jones算法进行人脸检测。

该算法通过构造Haar特征与Adaboost集成学习算法相结合,能够在较短的时间内实现高效的人脸检测。

具体操作如下:2.1 加载图像首先,在Matlab中加载需要进行人脸检测的图像。

可以使用imread函数进行图像加载,并将其转换为灰度图像进行处理。

例如:```Matlabimage = imread('face.jpg');gray_image = rgb2gray(image);```2.2 构建人脸检测器在Matlab中,可以使用vision.CascadeObjectDetector对象构建人脸检测器。

该对象可以通过Viola-Jones算法进行人脸检测。

具体代码如下:```MatlabfaceDetector = vision.CascadeObjectDetector();bbox = step(faceDetector, gray_image);```2.3 显示检测结果最后,可以使用insertObjectAnnotation函数将检测到的人脸位置在原始图像上标记出来。

代码示例如下:```Matlabdetected_image = insertObjectAnnotation(image, 'rectangle', bbox, 'Face');imshow(detected_image);```3. 人脸识别在Matlab中,可以使用基于人脸特征的Eigenface、Fisherface和LBPH等算法进行人脸识别。

基于MATLAB的人脸识别考勤系统

基于MATLAB的人脸识别考勤系统

电子技术‖77‖基于MATLAB的人脸识别考勤系统◆杨天成本文的主要研究内容是人脸识别技术。

在研究中了解人脸识别技术在国内外的研究现状及发展前景,掌握了部分MA TLAB 的图像处理功能,并按照人脸图像采集、图像预处理、人脸特征提取与识别这条技术路线开发实现了一个简易人脸识别系统。

本次设计中的核心部分是人脸的检测与识别,此人脸识别可应用于企业员工考勤签到上。

本设计分为图像采集、数据库信息存储与显示、人脸识别、数据库信息清除、退出程序几部分组成。

采集图像模块的目的就是采集所要存储的人脸图片,将其存入数据库中,为后面的人脸识别算法提供相应的训练素材。

模块代码如下:if chos==1, clc ;[namefile ,pathname]=uigetfile ('*.pgm','Select image');%读取.pgm 文件 if name fi le~=0[img ,map]=imread (strcat (pathname ,name fi le ));imshow (img ); elsewarndlg ('放入的图片必须是已采集的',' Warning ') end end其中的name fl ie ,和pathname 分别指的是文件名和查找文件的路径。

当点击“采集图像”时,系统会根据操作指令弹出要采集的图片,选择确定后,会将这个图片的路径以及图片名相关信息保存到变量pathname 和name fi le 里。

当采集到图片后要将采集的图片保存到数据库中,此目的是为了给后期人脸识别时提供相应的训练素材。

但是需要注意的是在进行保存图片时要对保存的图片划分类别,同一个人的不同照片要划分到同一类中。

设第一个人的所有图片组成的类别为1,第二个人的所有图片组成的类别就为2,由此以此类推。

每一类的图片种类越多,越能保证后期识别的成功率。

同时为了能够保证录入的信息正确,可以点击“数据库信息”就会显示出数据库中存入了多少张照片以及分了多少类别。

Matlab在视频人脸检测与人脸识别中的应用技巧

Matlab在视频人脸检测与人脸识别中的应用技巧

Matlab在视频人脸检测与人脸识别中的应用技巧人脸检测和人脸识别是计算机视觉领域中的重要研究方向,近年来得到了广泛的应用。

在视频处理中,人脸的准确检测和识别是实现许多高级应用的基础。

Matlab作为一种功能强大的数学建模与仿真软件,提供了丰富的图像处理工具箱,使得人脸检测与识别算法的实现变得简单与高效。

一、图像预处理在进行人脸检测与识别之前,通常需要对图像进行预处理,以提高算法的准确性。

图像预处理的过程包括灰度化、直方图均衡化、尺寸归一化等。

利用Matlab的图像处理工具箱,可以快速实现这些预处理操作。

1.1 灰度化灰度化是将彩色图像转换为灰度图像的过程,将去除色彩信息,使图像变得更易处理。

在Matlab中,使用rgb2gray函数可以方便地将彩色图像转换为灰度图像。

1.2 直方图均衡化直方图均衡化是一种增强图像对比度的方法,通过对图像的灰度直方图进行变换来实现。

在Matlab中,使用histeq函数可以对图像的灰度直方图进行均衡化操作,提高图像的细节显示能力。

1.3 尺寸归一化不同的人脸图像具有不同的尺寸和角度,这对人脸检测与识别算法会造成影响。

为了提高算法的鲁棒性,通常需要将人脸图像进行尺寸归一化处理。

在Matlab中,可以使用imresize函数将图像进行缩放,使得人脸图像具有相同的尺寸。

二、人脸检测人脸检测是指在一幅图像中自动识别和定位人脸的过程,是人脸识别的首要步骤。

Matlab提供了多种人脸检测算法的实现,其中常用的有Haar特征分类器和基于深度学习的卷积神经网络(CNN)。

2.1 Haar特征分类器Haar特征分类器是一种基于机器学习的人脸检测算法,可以通过训练集的正负样本学习出人脸的特征。

在Matlab中,可以使用vision.CascadeObjectDetector对象和trainCascadeObjectDetector函数来实现Haar特征分类器的训练与检测。

2.2 基于深度学习的卷积神经网络(CNN)近年来,深度学习在图像处理领域取得了巨大的突破,其中卷积神经网络是一种非常有效的人脸检测方法。

基于肤色信息的人脸检测MATLAB程序

基于肤色信息的人脸检测MATLAB程序

clear allclose allclc%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 读入待检测图像x=imread('C:\Documents and Settings\Administrator.30178A3145BA4BF\桌面\2.jpg'); %读入图像figureimshow(x)if size(x,3)>1x=rgb2gray(x);%转化为灰度图endx=double(x); %转化为小数型[output,count,m,svec]=facefind(x);%找出人脸,output返回人脸位置和大小信息,count为人脸个数信息,m实际检测到的最大人脸和最小人脸信息imagesc(x)colormap(gray) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 画出人脸框图col=[1 0 0];%人脸框图为红色col=[0 1 0];%人脸框图为绿色t=2; %人脸框图线的宽度N=size(output,2);if (N>0)for i=1:Nx1=output(1,i);x2=output(2,i);y1=output(3,i);y2=output(4,i);vec=[x1 x2 y1 y2]; %方框四个角的坐标ind=find(isinf(vec)); %无限值情况a=200; %should be realmaxvec(ind)=sign(vec(ind))*a;h1=line([vec(1) vec(2)],[vec(3) vec(3)]);h2=line([vec(2) vec(2)],[vec(3) vec(4)]);h3=line([vec(1) vec(2)],[vec(4) vec(4)]);h4=line([vec(1) vec(1)],[vec(3) vec(4)]);h=[h1 h2 h3 h4];set(h,'Color',col);set(h,'LineWidth',t)endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% minf=m(1);maxf=m(2);ex1=size(x,1)*0.01;ex1e=size(x,1)*0.02;ex2=size(x,1)*0.04;ex2e=size(x,1)*0.05;bx1=[0 maxf maxf 0];by1=[ex1e ex1e ex1 ex1];bx2=[0 minf minf 0];by2=[ex2e ex2e ex2 ex2];hold onfill(bx1,by1,[0 1 0])fill(bx2,by2,[0 1 0])hold off。

Matlab中的人脸识别与人脸特征提取

Matlab中的人脸识别与人脸特征提取

Matlab中的人脸识别与人脸特征提取近年来,随着计算机技术的快速发展和应用的普及,人脸识别技术逐渐进入了我们的生活。

无论是在安全领域的门禁系统、身份验证应用,还是在娱乐领域的人脸美化软件,人脸识别都发挥着重要的作用。

而在人脸识别技术的实现中,人脸特征提取是一个关键的环节。

本文将介绍在Matlab中实现人脸识别和人脸特征提取的方法与技巧。

在Matlab中,有许多经典的人脸识别算法可供选择,其中最为常见且被广泛应用的是基于主成分分析(PCA)的人脸识别算法。

PCA是一种经典的降维算法,它通过线性变换将高维数据映射到低维空间中,从而捕捉数据的主要特征。

在人脸识别中,我们可以将每张人脸的像素矩阵视为一个高维数据向量,利用PCA算法将其映射到一个低维特征空间中。

在特征空间中,每张人脸都可以表示为一个特征向量,就像每个人都有自己独特的“人脸特征码”一样。

要在Matlab中实现基于PCA的人脸识别,首先需要收集一组包含多个人脸的图像数据集作为训练样本。

然后,将每个人脸的像素矩阵展开成一个列向量,并将这些列向量按列排成一个矩阵,构成一个大的数据矩阵。

接下来,通过对数据矩阵进行协方差矩阵分解和特征值分解,可以得到一组特征向量。

这些特征向量被称为“特征脸”,它们是训练样本中人脸数据的主要变化方向。

最后,通过计算待识别人脸与训练样本中每个人脸的特征向量的距离,并找出距离最小的特征向量所对应的人脸,即可完成人脸识别的过程。

除了PCA算法,还有其他一些在Matlab中常用的人脸识别算法,如线性判别分析(LDA)算法、小波变换、局部二值模式(LBP)等。

这些算法在原理和实现上各有特点,可以根据实际需求选择合适的算法进行人脸识别。

在人脸识别之前,首先需要对输入的人脸图像进行预处理。

通常的预处理步骤包括灰度化、直方图均衡化和人脸检测。

灰度化是将彩色图像转换为灰度图像,降低了计算复杂度,同时保留了图像的关键信息。

直方图均衡化可以增强图像的对比度,使得人脸特征更加明显。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.人脸识别流程
基本原理
基于YCbCr颜色空间的肤色模型进行肤色分割。

在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。

采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。

流程图
人脸识别流程图
读入原始图像
将图像转化为YCbCr颜色空

利用肤色模型二值化图像并
作形态学处理
选取出二值图像中的白色区
域,度量区域属性,筛选后
得到所有矩形块

筛选特定区域(高度和宽度的比率
在(0.6~2)之间,眼睛特征)

存储人脸的矩形区域
特殊区域根据其他信息筛
选,标记最终的人脸区域
2.人脸识别程序
(1)人脸和非人脸区域分割程序
function result = skin(Y,Cb,Cr)
%SKIN Summary of this function goes here
% Detailed explanation goes here
a=;
b=;
ecx=;
ecy=;
sita=;
cx=;
cy=;
xishu=[cos(sita) sin(sita);-sin(sita) cos(sita)]; %如果亮度大于230,则将长短轴同时扩大为原来的倍
if(Y>230)
a=*a;
b=*b;
end
%根据公式进行计算
Cb=double(Cb);
Cr=double(Cr);
t=[(Cb-cx);(Cr-cy)];
temp=xishu*t;
value=(temp(1)-ecx)^2/a^2+(temp(2)-ecy)^2/b^2; %大于1则不是肤色,返回0;否则为肤色,返回1 if value>1
result=0;
else
result=1;
end
end
(2)人脸的确认程序
function eye = findeye(bImage,x,y,w,h)
%FINDEYE Summary of this function goes here
% Detailed explanation goes here
part=zeros(h,w);
%二值化
for i=y:(y+h)
for j=x:(x+w)
if bImage(i,j)==0
part(i-y+1,j-x+1)=255;
else
part(i-y+1,j-x+1)=0;
end
end
end
[L,num]=bwlabel(part,8);
%如果区域中有两个以上的矩形则认为有眼睛if num<2
eye=0;
else
eye=1;
end
end
(3)人脸识别主程序
clear all;
%读入原始图像
I=imread('');
gray=rgb2gray(I);
ycbcr=rgb2ycbcr(I);%将图像转化为YCbCr空间
heighth=size(gray,1);%读取图像尺寸
width=size(gray,2);
for i=1:heighth %利用肤色模型二值化图像
for j=1:width
Y=ycbcr(i,j,1);
Cb=ycbcr(i,j,2);
Cr=ycbcr(i,j,3);
if(Y<80)
gray(i,j)=0;
else
if(skin(Y,Cb,Cr)==1)%根据色彩模型进行图像二值化 gray(i,j)=255;
else
gray(i,j)=0;
end
end
end
end
se=strel('arbitrary',eye(5));%二值图像形态学处理
gray=imopen(gray,se);
figure;imshow(gray)
[L,num]=bwlabel(gray,8);%采用标记方法选出图中的白色区域stats=regionprops(L,'BoundingBox');%度量区域属性
n=1;%存放经过筛选以后得到的所有矩形块
result=zeros(n,4);
figure,imshow(I);
hold on;
for i=1:num %开始筛选特定区域
box=stats(i).BoundingBox;
x=box(1);%矩形坐标X
y=box(2);%矩形坐标Y
w=box(3);%矩形宽度w
h=box(4);%矩形高度h
ratio=h/w;%宽度和高度的比例
ux=uint16(x);
uy=uint8(y);
if ux>1
ux=ux-1;
end
if uy>1
uy=uy-1;
end
if w<20 || h<20|| w*h<400 %矩形长宽的范围和矩形的面积可自行设定continue
elseif ratio<2 && ratio> && findeye(gray,ux,uy,w,h)==1
%根据“三庭五眼”规则高度和宽度比例应该在(,2)内;
result(n,:)=[ux uy w h];
n=n+1;
end
end
if size(result,1)==1 && result(1,1)>0 %对可能是人脸的区域进行标记
rectangle('Position',[result(1,1),result(1,2),result(1,3),result(1,4) ],'EdgeColor','r');
else
%如果满足条件的矩形区域大于1,则再根据其他信息进行筛选
a=0;
arr1=[];arr2=[];
for m=1:size(result,1)
m1=result(m,1);
m2=result(m,2);
m3=result(m,3);
m4=result(m,4);
%得到符合和人脸匹配的数据
if m1+m3<width && m2+m4<heighth && m3<*width
a=a+1;
arr1(a)=m3;arr2(a)=m4;
%rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');
end
end
%得到人脸长度和宽度的最小区域
arr3=[];arr3=sort(arr1,'ascend');
arr4=[];arr4=sort(arr2,'ascend');
%根据得到的数据标定最终的人脸区域
for m=1:size(result,1)
m1=result(m,1);
m2=result(m,2);
m3=result(m,3);
m4=result(m,4);
%最终标定人脸
if m1+m3<width && m2+m4<heighth && m3<*width
m3=arr3(1);
m4=arr4(1);
rectangle('Position',[m1,m2,m3,m4],'EdgeColor','r');
end
end
end
(4)程序说明
人脸识别程序主要包含三个程序模块,人脸识别主程序由三部分构成。

第一部分:将图像转化为YCbCr颜色空间,根据色彩模型进行图像二值化,二值化图像进行形态学处理、开运算,显示二值图像;第二部分:采用标记方法选取出图中的白色区域,度量区域属性,存放经过筛选以后得到的所有矩形块,筛选特定区域,存储人脸的矩形区域;第三部分:对于所有人脸的矩形区域,如果满足条件的矩形区域大于1则再根据其他信息进行筛选,标记最终的人脸区域。

图像分割程序中,利用肤色可以较为精确的将人脸和非人脸区域分割开来,得到较为精确的二值化图像。

人脸的确认程序,以存储的所有矩形区域作为研究对象,当区域内有眼睛存在时,才认为此区域为人脸区域
3运行结果
(1)第一幅图
原始图像
肤色分割的二值化图像
人脸识别图像
(2)第二幅图
原始图像
肤色分割的二值化图像
人脸识别图像
(3)第三幅图
原始图像
肤色分割的二值化图像
人脸标定。

相关文档
最新文档