图像处理——matlab人脸识别(1)

图像处理——matlab人脸识别(1),第1张

目录


一、前言


二、相关程序

(一)主函数

(二)图库生成函数

(三)图库图像命名函数

(四)待识别图库生成函数

(五)待识别图库命名函数

(六)图像数据导入函数

(七)PCA简单主成分分析函数

(八)图像匹配函数


三、识别效果



一、前言

近期,要做一个人脸识别的课题,于是在前人的基础上做了一些。


对于图像处理我还属于初学阶段,在人脸识别算法上没有采用很高级的算法。


参考的文章:

利用MATLAB截取图片某个区域_蓝天萝卜-CSDN博客

Matlab实现人脸识别_王小壮的博客-CSDN博客_matlab人脸识别

MATLAB中cell(元胞)数组的基本用法_脉望虫的博客-CSDN博客_matlab中cell函数

程序的主思路是:

1.首先确定两张待检测图片,一张图(图1)作为生成的图库使用,另外一张(图2)作为目标图片进行识别,一般来讲,图1中的人脸数要多余图2中的人脸数,否则可能会导致重复识别。


2.对与图片中人脸的检索用matlab自带的vision.CascadeObjectDetector()函数检测照片上的图片(vision.CascadeObjectDetector()的用法参见之前发的一篇博客:基于matlab实现的人脸检测_xiaolizi_331的博客-CSDN博客)

3.将图1和图2中的图片检测出以后,对图像进行分割转化,存入元胞数组中,以便进行下一步数据分析。


4.是图像识别的核心部分,采用简单主成分分析算法和范数将目标图片与图库中最接近目标图片的图进行匹配,完成人脸识别。



二、相关程序 (一)主函数

ori_pic=imread('yangliwei.jpeg');
lib_pic=imread('hangtianyuan.jpeg');
[facebox_aim,pic_cell_aim]=aim_face(ori_pic);
[facebox_lib,pic_cell_lib,file_name]=lib_face(lib_pic);
%% 
%%定义目标个数
n_f=size(pic_cell_aim,2);%定义目标图像个数
for i=1:n_f
img=imgdata(file_name); %图片矩阵数据
Cell_ten=PCA(img,2);% 调用PCA函数
pic_aim=cell2mat(pic_cell_aim(i)); %将元胞数组转为矩阵不然会报错
face1=facefind(Cell_ten,pic_aim);
figure,subplot(1,2,1)
imshow(pic_aim)
title('目标图像')
subplot(1,2,2)
imshow(strcat(num2str(face1),'.jpg'))
title('自建库中图像')
end
(二)图库生成函数
function  [facebox_lib,pic_cell_lib,file_name]=lib_face(lib_pic)
faceDetector = vision.CascadeObjectDetector(); % 构造检测器对象。


%lib_pic = imread('hangtianyuan.jpeg'); % 读取包含面部的图像。


facebox_lib = step(faceDetector, lib_pic); % 开始检测,将结果存储到facebox变量中 finalImage = insertShape(lib_pic, 'Rectangle', facebox_lib,'LineWidth',5); figure; imshow(finalImage); %% ================================= % pic = imread('face2.png'); % imshow(pic); n_lib=size(facebox_lib,1); local=zeros(n_lib,4); local(:,1)=facebox_lib(:,1); local(:,2)=facebox_lib(:,1)+facebox_lib(:,3); local(:,3)=facebox_lib(:,2); local(:,4)=facebox_lib(:,2)+facebox_lib(:,3); %% pic_1 = imcrop(lib_pic,[local(1,1),local(1,3),abs(local(1,2)-local(1,1)),abs(local(1,3)-local(1,4))]); file_name=file_num(n_lib); pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小 figure,imshow(pic_n); pic_cell_lib={pic_n}; imwrite(pic_1,file_name(1,:),'BitDepth',8); for i=2:n_lib %[x,y] = ginput(2); %确定图像上的两点利用ginput函数,返回值是两点的坐标 pic_1 = imcrop(lib_pic,[local(i,1),local(i,3),abs(local(i,2)-local(i,1)),abs(local(i,3)-local(i,4))]); %利用imcrop函数对图像进行切割,输入参数是一个定点坐标, %从该定点出发向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的区域进行切割 pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小 figure,imshow(pic_n); pic_cell_lib=[pic_cell_lib,pic_n]; imwrite(pic_n,file_name(i,:),'BitDepth',8);

(三)图库图像命名函数
function A1=file_num(n)
A1 = [49 46 106 112 103];
A1=char(A1);
for i=1:n-1
A2 = [i+49 46 106 112 103];%asc码值
A1=char(A1,A2);
end
end
(四)待识别图库生成函数
function  [facebox_aim,pic_cell_aim]=aim_face(ori_pic)
faceDetector = vision.CascadeObjectDetector(); % 构造检测器对象。


%image = imread('yangliwei.jpeg'); % 读取包含面部的图像。


facebox_aim = step(faceDetector, ori_pic); % 开始检测,将结果存储到facebox变量中 finalImage = insertShape(ori_pic, 'Rectangle', facebox_aim,'LineWidth',5); figure; imshow(finalImage); %% =============================================================== % pic = imread('face2.png'); % imshow(pic); n_aim=size(facebox_aim,1); local=zeros(n_aim,4); local(:,1)=facebox_aim(:,1); local(:,2)=facebox_aim(:,1)+facebox_aim(:,3); local(:,3)=facebox_aim(:,2); local(:,4)=facebox_aim(:,2)+facebox_aim(:,3); %% pic_1 = imcrop(ori_pic,[local(1,1),local(1,3),abs(local(1,2)-local(1,1)),abs(local(1,3)-local(1,4))]); pic_cell_aim={pic_1}; file_name_aim=aim_name(n_aim); pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小 figure,imshow(pic_n); imwrite(pic_1,file_name_aim(1,:),'BitDepth',8); for i=2:n_aim %[x,y] = ginput(2); %确定图像上的两点利用ginput函数,返回值是两点的坐标 pic_1 = imcrop(ori_pic,[local(i,1),local(i,3),abs(local(i,2)-local(i,1)),abs(local(i,3)-local(i,4))]); %利用imcrop函数对图像进行切割,输入参数是一个定点坐标, %从该定点出发向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的区域进行切割 pic_cell_aim=[pic_cell_aim,pic_1]; pic_n=imresize(pic_1,[100 100]);%将所有图片转到100*100大小 figure,imshow(pic_n); imwrite(pic_n,file_name_aim(i,:),'BitDepth',8); end

(五)待识别图库命名函数
function A1=aim_name(n)
A1 = [97 105 109 95 110 97 109 101 49 46 106 112 103];
A1=char(A1);
for i=1:n-1
A2 = [97 105 109 95 110 97 109 101 i+49 46 106 112 103];%asc码值
A1=char(A1,A2);
end
end
(六)图像数据导入函数
%--------------函数说明-------------    
%    整合输入的人脸样本  
%    输出:样本矩阵  
%-----------------------------------    
% function ImgData = imgdata()  
%用法:  ImgData = imgdata();  

%分别导入图片  
%% =======================================
function ImgData=imgdata(file_name)
%% file_name
nn=size(file_name,1);
%%
namud = 0.5;   %原始图片缩小倍数  
pic_N=imread(file_name(1,:));
 pic_N=imresize(pic_N,[100 100]);
     pic_N=imresize(pic_N,namud);
pic_N=rgb2gray(pic_N);
pic_all={pic_N};
for i=2:nn
    pic_N=imread(file_name(i,:));
    pic_N=rgb2gray(pic_N);
    pic_N=imresize(pic_N,[100 100]);%将所有图片转到100*100大小
    pic_N=imresize(pic_N,namud);

[m,n] = size(pic_N);  %取图片大小  
pic_all=[pic_all,pic_N];
end
%% ====================================================
for i=1:nn 
    %把m*n的矩阵变换成1*(m*n)的矩阵  
    ImgData(i,:) = reshape(pic_all{i},1,m*n);  
end  
%讲数据范围缩小到0到1之间  
ImgData = double(ImgData)/255;  
(七)PCA简单主成分分析函数
%-----简单主成分分析算法  
%-----输入:样本集合矩阵:img  
%           降维的维数 :k  
%-----输出:细胞结构体数据 :Cell_all  
%-----------------------------------    
function Cell_all = PCA(img,k)  
%reshape函数:改变句矩阵的大小,矩阵的总元素个数不能变  
%img = [1,2;2,1;3,3;3,6;6,3];  
% k = 2;  
% img = double(img);  
[m,n] = size(img);  %取大小  
img_mean = mean(img); %求每列平均值  
img_mean_all = repmat(img_mean,m,1);%复制m行平均值至整个矩阵  
Z = img - img_mean_all;  
T = Z'*Z;%协方差矩阵      
[V,D] = eigs(T,k);%计算T中最大的前k个特征值与特征向量  
img_new = img*V*D;  %低维度下的各个脸的数据  
Cell_all = {img_new,V,D};
(八)图像匹配函数
%-----人脸匹配  
%-----输入:细胞结构体数据Cell_all(包括样本集合,特征值与特征向量)  
%           想要识别的人脸(彩色图像)  
%-----输出:匹配的结果  
%-----------------------------------    
function FaceFind = facefind(Cell_all,img2find)  
%细胞结构体的调用  
img_all = Cell_all{1};  
[m1,n1] = size(img_all);  
V = Cell_all{2};  
D = Cell_all{3};  
namud = 0.5;  %图片缩小的倍数  
%对需要识别的图像进行灰度等的处理  
pic = rgb2gray(img2find);  %灰度处理  
pic = imresize(pic,[100 100]);
pic = imresize(pic,namud);  %变换大小  
[m2,n2] = size(pic);   
pic = reshape(pic,1,m2*n2);  %重新排列  
pic = double(pic)/255;         
pic_done = pic*V*D;  %处理完的数据  
%% 归一化  --》避免运算出现特别大的数据  
Ma = max(max(pic_done));  
Mi = min(min(pic_done));  
pic_done = pic_done/(Ma - Mi);  
%%  
for i=1:m1  
    % 归一化  --》避免运算出现特别大的数据  
    Ma1 = max(img_all(i,:));  
    Mi1 = min(img_all(i,:));  
    img_all(i,:) = img_all(i,:)/(Ma1 - Mi1);  
    %求范数--》把他们之间的几何距离作为评判与哪一个人脸最近的标准  
    error(i) = norm(img_all(i,:)-pic_done);  
end  
%找到其中最近的就认为是所要识别的人脸  
E=min(error);
if E>10
    return
end
FaceFind = find(error == min(error));  

% FaceFind = error;

三、识别效果

原图库图像:

 人脸检测后:

 分割后图片:

 目标图像:

 人脸检测后:

 图像分割后:

 图像匹配,完成图片识别:

 有什么问题的小伙伴可以评论见

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/589819.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-13
下一篇 2022-04-13

发表评论

登录后才能评论

评论列表(0条)

保存