图像处理——matlab人脸识别(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:nnpic_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>10return end FaceFind = find(error == min(error)); % FaceFind = error;三、識別效果
原圖庫圖像:
?人臉檢測后:
?分割后圖片:
?目標圖像:
?人臉檢測后:
?圖像分割后:
?圖像匹配,完成圖片識別:
?有什么問題的小伙伴可以評論見
?
?
總結
以上是生活随笔為你收集整理的图像处理——matlab人脸识别(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装python Scipy库记录
- 下一篇: 电影网络首播后喜剧场上线,搅局者加速行业