日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > 循环神经网络 >内容正文

循环神经网络

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

發(fā)布時(shí)間:2024/8/1 循环神经网络 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像处理——matlab人脸识别(1) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、前言

二、相關(guān)程序

(一)主函數(shù)

(二)圖庫(kù)生成函數(shù)

(三)圖庫(kù)圖像命名函數(shù)

(四)待識(shí)別圖庫(kù)生成函數(shù)

(五)待識(shí)別圖庫(kù)命名函數(shù)

(六)圖像數(shù)據(jù)導(dǎo)入函數(shù)

(七)PCA簡(jiǎn)單主成分分析函數(shù)

(八)圖像匹配函數(shù)

三、識(shí)別效果


一、前言

近期,要做一個(gè)人臉識(shí)別的課題,于是在前人的基礎(chǔ)上做了一些。對(duì)于圖像處理我還屬于初學(xué)階段,在人臉識(shí)別算法上沒(méi)有采用很高級(jí)的算法。

參考的文章:

利用MATLAB截取圖片某個(gè)區(qū)域_藍(lán)天蘿卜-CSDN博客

Matlab實(shí)現(xiàn)人臉識(shí)別_王小壯的博客-CSDN博客_matlab人臉識(shí)別

MATLAB中cell(元胞)數(shù)組的基本用法_脈望蟲(chóng)的博客-CSDN博客_matlab中cell函數(shù)

程序的主思路是:

1.首先確定兩張待檢測(cè)圖片,一張圖(圖1)作為生成的圖庫(kù)使用,另外一張(圖2)作為目標(biāo)圖片進(jìn)行識(shí)別,一般來(lái)講,圖1中的人臉數(shù)要多余圖2中的人臉數(shù),否則可能會(huì)導(dǎo)致重復(fù)識(shí)別。

2.對(duì)與圖片中人臉的檢索用matlab自帶的vision.CascadeObjectDetector()函數(shù)檢測(cè)照片上的圖片(vision.CascadeObjectDetector()的用法參見(jiàn)之前發(fā)的一篇博客:基于matlab實(shí)現(xiàn)的人臉檢測(cè)_xiaolizi_331的博客-CSDN博客)

3.將圖1和圖2中的圖片檢測(cè)出以后,對(duì)圖像進(jìn)行分割轉(zhuǎn)化,存入元胞數(shù)組中,以便進(jìn)行下一步數(shù)據(jù)分析。

4.是圖像識(shí)別的核心部分,采用簡(jiǎn)單主成分分析算法和范數(shù)將目標(biāo)圖片與圖庫(kù)中最接近目標(biāo)圖片的圖進(jìn)行匹配,完成人臉識(shí)別。

二、相關(guān)程序

(一)主函數(shù)

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); %% %%定義目標(biāo)個(gè)數(shù) n_f=size(pic_cell_aim,2);%定義目標(biāo)圖像個(gè)數(shù) for i=1:n_f img=imgdata(file_name); %圖片矩陣數(shù)據(jù) Cell_ten=PCA(img,2);% 調(diào)用PCA函數(shù) pic_aim=cell2mat(pic_cell_aim(i)); %將元胞數(shù)組轉(zhuǎn)為矩陣不然會(huì)報(bào)錯(cuò) face1=facefind(Cell_ten,pic_aim); figure,subplot(1,2,1) imshow(pic_aim) title('目標(biāo)圖像') subplot(1,2,2) imshow(strcat(num2str(face1),'.jpg')) title('自建庫(kù)中圖像') end

(二)圖庫(kù)生成函數(shù)

function [facebox_lib,pic_cell_lib,file_name]=lib_face(lib_pic) faceDetector = vision.CascadeObjectDetector(); % 構(gòu)造檢測(cè)器對(duì)象。 %lib_pic = imread('hangtianyuan.jpeg'); % 讀取包含面部的圖像。 facebox_lib = step(faceDetector, lib_pic); % 開(kāi)始檢測(cè),將結(jié)果存儲(chǔ)到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]);%將所有圖片轉(zhuǎn)到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); %確定圖像上的兩點(diǎn)利用ginput函數(shù),返回值是兩點(diǎn)的坐標(biāo) 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函數(shù)對(duì)圖像進(jìn)行切割,輸入?yún)?shù)是一個(gè)定點(diǎn)坐標(biāo), %從該定點(diǎn)出發(fā)向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的區(qū)域進(jìn)行切割 pic_n=imresize(pic_1,[100 100]);%將所有圖片轉(zhuǎn)到100*100大小 figure,imshow(pic_n); pic_cell_lib=[pic_cell_lib,pic_n]; imwrite(pic_n,file_name(i,:),'BitDepth',8);

(三)圖庫(kù)圖像命名函數(shù)

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

(四)待識(shí)別圖庫(kù)生成函數(shù)

function [facebox_aim,pic_cell_aim]=aim_face(ori_pic) faceDetector = vision.CascadeObjectDetector(); % 構(gòu)造檢測(cè)器對(duì)象。 %image = imread('yangliwei.jpeg'); % 讀取包含面部的圖像。 facebox_aim = step(faceDetector, ori_pic); % 開(kāi)始檢測(cè),將結(jié)果存儲(chǔ)到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]);%將所有圖片轉(zhuǎn)到100*100大小 figure,imshow(pic_n); imwrite(pic_1,file_name_aim(1,:),'BitDepth',8);for i=2:n_aim %[x,y] = ginput(2); %確定圖像上的兩點(diǎn)利用ginput函數(shù),返回值是兩點(diǎn)的坐標(biāo) 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函數(shù)對(duì)圖像進(jìn)行切割,輸入?yún)?shù)是一個(gè)定點(diǎn)坐標(biāo), %從該定點(diǎn)出發(fā)向右abs(x(1)-x(2)),向下abs(y(1)-y(2))的區(qū)域進(jìn)行切割 pic_cell_aim=[pic_cell_aim,pic_1]; pic_n=imresize(pic_1,[100 100]);%將所有圖片轉(zhuǎn)到100*100大小 figure,imshow(pic_n); imwrite(pic_n,file_name_aim(i,:),'BitDepth',8); end

(五)待識(shí)別圖庫(kù)命名函數(shù)

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

(六)圖像數(shù)據(jù)導(dǎo)入函數(shù)

%--------------函數(shù)說(shuō)明------------- % 整合輸入的人臉樣本 % 輸出:樣本矩陣 %----------------------------------- % function ImgData = imgdata() %用法: ImgData = imgdata(); %分別導(dǎo)入圖片 %% ======================================= function ImgData=imgdata(file_name) %% file_name nn=size(file_name,1); %% namud = 0.5; %原始圖片縮小倍數(shù) 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]);%將所有圖片轉(zhuǎn)到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 %講數(shù)據(jù)范圍縮小到0到1之間 ImgData = double(ImgData)/255;

(七)PCA簡(jiǎn)單主成分分析函數(shù)

%-----簡(jiǎn)單主成分分析算法 %-----輸入:樣本集合矩陣:img % 降維的維數(shù) :k %-----輸出:細(xì)胞結(jié)構(gòu)體數(shù)據(jù) :Cell_all %----------------------------------- function Cell_all = PCA(img,k) %reshape函數(shù):改變句矩陣的大小,矩陣的總元素個(gè)數(shù)不能變 %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);%復(fù)制m行平均值至整個(gè)矩陣 Z = img - img_mean_all; T = Z'*Z;%協(xié)方差矩陣 [V,D] = eigs(T,k);%計(jì)算T中最大的前k個(gè)特征值與特征向量 img_new = img*V*D; %低維度下的各個(gè)臉的數(shù)據(jù) Cell_all = {img_new,V,D};

(八)圖像匹配函數(shù)

%-----人臉匹配 %-----輸入:細(xì)胞結(jié)構(gòu)體數(shù)據(jù)Cell_all(包括樣本集合,特征值與特征向量) % 想要識(shí)別的人臉(彩色圖像) %-----輸出:匹配的結(jié)果 %----------------------------------- function FaceFind = facefind(Cell_all,img2find) %細(xì)胞結(jié)構(gòu)體的調(diào)用 img_all = Cell_all{1}; [m1,n1] = size(img_all); V = Cell_all{2}; D = Cell_all{3}; namud = 0.5; %圖片縮小的倍數(shù) %對(duì)需要識(shí)別的圖像進(jìn)行灰度等的處理 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; %處理完的數(shù)據(jù) %% 歸一化 --》避免運(yùn)算出現(xiàn)特別大的數(shù)據(jù) Ma = max(max(pic_done)); Mi = min(min(pic_done)); pic_done = pic_done/(Ma - Mi); %% for i=1:m1 % 歸一化 --》避免運(yùn)算出現(xiàn)特別大的數(shù)據(jù) Ma1 = max(img_all(i,:)); Mi1 = min(img_all(i,:)); img_all(i,:) = img_all(i,:)/(Ma1 - Mi1); %求范數(shù)--》把他們之間的幾何距離作為評(píng)判與哪一個(gè)人臉最近的標(biāo)準(zhǔn) error(i) = norm(img_all(i,:)-pic_done); end %找到其中最近的就認(rèn)為是所要識(shí)別的人臉 E=min(error); if E>10return end FaceFind = find(error == min(error)); % FaceFind = error;

三、識(shí)別效果

原圖庫(kù)圖像:

?人臉檢測(cè)后:

?分割后圖片:

?目標(biāo)圖像:

?人臉檢測(cè)后:

?圖像分割后:

?圖像匹配,完成圖片識(shí)別:

?有什么問(wèn)題的小伙伴可以評(píng)論見(jiàn)

?

?

總結(jié)

以上是生活随笔為你收集整理的图像处理——matlab人脸识别(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。