当前位置:文档之家› MATLAB 高级编程与工程应用 人脸识别 实验报告+源代码

MATLAB 高级编程与工程应用 人脸识别 实验报告+源代码

MATLAB 高级编程与工程应用 人脸识别 实验报告+源代码
MATLAB 高级编程与工程应用 人脸识别 实验报告+源代码

MATLAB高级编程与工程应用

实验四图像处理

第一章基础知识

1、MATLAB 提供了图像处理工具箱,在命令窗口输入help images 可查看该工具箱内的所有函数。请阅读并大致了解这些函数的基本功能。

大致了解。

2、利用MATLAB 提供的Image file I/O 函数分别完成以下处理:

(a)以测试图像的中心为圆心,图像的长和宽中较小值的一半为半径画一个红颜色的圆;分析:直接利用半径条件,满足条件的点将红色元素置为255,绿色和蓝色元素置为0,于是得到如下图像:

源代码:

load('hall_color.mat');

%首先获得三原数组

R = hall_color(:,:,1);

G = hall_color(:,:,2);

B = hall_color(:,:,3);

%将圆上的点改为红色

for i = 1:120

for j = 1:168

a = abs(i - 60.5);

b = abs(j - 84.5);

d = sqrt(a ^ 2 + b ^ 2);

if(abs(d - 60) < 0.5)

R(i,j) = 255;

G(i,j) = 0;

B(i,j) = 0;

end

end

end

%生成新的矩阵

hall_color1(:,:,1) = R;

hall_color1(:,:,2) = G;

hall_color1(:,:,3) = B;

imshow(hall_color1);

(b)将测试图像涂成国际象棋状的“黑白格”的样子,其中“黑”即黑色,“白”则意味着保留原图。用一种看图软件浏览上述两个图,看是否达到了目标。

分析:首先设置标记flag在进行循环,对不同方格实行颜色更改就行。

效果:

源代码:

clear all;

load('hall_color.mat');

R = hall_color(:,:,1);

G = hall_color(:,:,2);

B = hall_color(:,:,3);

flag = 1;

for i = 1:8

flag = mod((flag + 1),2);

for j = 1:8

if(flag == 1)

for m = 15*(i - 1) + 1:15*i

for n = 21*(j - 1) + 1:21*j

R(m,n) = 0;

G(m,n) = 0;

B(m,n) = 0;

end

end

end

flag = mod((flag + 1),2);

end

end

hall_color1(:,:,1) = R;

hall_color1(:,:,2) = G;

hall_color1(:,:,3) = B;

imshow(hall_color1);

用看图软件打开成功:

第二章图像压缩编码

1、图像的预处理是将每个像素灰度值减去128 ,这个步骤是否可以在变换域进行?请在测试图像中截取一块验证你的结论。

分析:可以在变换域进行,这个操作对应于在变换域将直流分量减去128*8*8/8 = 1024,于是可以得到如下图像:

原图为:

直接将灰度值减去128得到图像为:

通过改变变换域数据的方式得到图像为:

对比发现,两种变换方式得到的预处理后图像都是一样的。另外需要说明一下,为了让预处理后的图像显示出来不全为黑色,我将原图像的灰度像素均乘以了一个2,这样可以更加方便的对比变换后的图像。

2、请编程实现二维DCT ,并和MATLAB 自带的库函数dct2 比较是否一致。

分析:由PDF中的补充知识我们可以知道,任意二维矩阵做DCT变换的时候都可以由它和与之大小相同的余弦序列矩阵加权表示,也就是说C = DPD?T,那么我们先找出相应的D矩阵,于是我写出程序循环得到了相应维度的D矩阵,然后可以直接使用矩阵乘法得到相应的二维DCT变换,这样与MATLAB自带的库函数dct2虽然在代码实现上有一定的差异(dct2中调用了一维DCT函数实现二维DCT),但是结果实际上是一致的。

得到DCT系数矩阵的代码如下所示:

%生成8*8 DCT系数矩阵

clc;

%参数定义及初始化

N = 8;

DCT = zeros(N,N);

%计算DCT系数矩阵

DCT(1,:) = sqrt(1/N);

for i = 2:N;

for j = 1:N

DCT(i,j) = sqrt(2/N)*cos((i - 1)*(2*j - 1)*pi/(2*N));

end

end

3、如果将DCT 系数矩阵中右侧四列的系数全部置零,逆变换后的图像会发生什么变化?选取一块图验证你的结论。如果左侧的四列置零呢?

分析:

检测图像如下图所示:

如果DCT系数矩阵中右侧四列的系数全部置零,逆变后的图像高频成分将会被抹去,得到图像如下图所示:

比较两个图,可以发现在黑灰、白灰以及黑白交界处有些许变化,右下角的变化较为明显,之后我将两个图像矩阵作差,这样可以更加直观的看到除去高频成分后的差异:

很明显的我们可以看到在上面所谓的交界处差值绝对值交大,而越往相邻颜色差异不大的块走,那个差值的绝对值越小。

进一步调整。

如果DCT系数矩阵中左侧四列的系数全部置零,逆变后的图像直流分量以及低频分量都被抹去,得到的图像如下图所示:

可以看到,完全就是一片黑的。查看逆变后的矩阵我发现,两次逆变后的矩阵相加之和就是原来的矩阵了,也就是说他们是互补的。

4、若对DCT 系数分别做转置、旋转90 度和旋转180 度操作(rot90) ,逆变换后恢复的图像有何变化?选取一块图验证你的结论。

分析:

我选择如下图像作验证:

首先,将DCT系数作转置,逆变换后恢复得到的图像如下图所示:

明显我们可以看到逆变换后恢复的图像是原图像逆时针旋转了90

度后的结果,原因是对DCT系数转置,原来各横行频率信息变为各竖列频率信息,对应于原图像的横竖调换。

进一步,将DCT系数做旋转90度操作,逆变换后恢复得到的图像如下图所示:

可以看到图像发生了较大变化,分析其原因主要是DCT系数旋转90度后,频域内原来的竖列直流信息的行列最高频分量变成了图像的直流分量,这个分量较小,而原图像直流分量变成了各列最高频分量的直流分量,这个分量比较大,还原回去的新图像各竖列的波动较大,而整体灰度较暗。

下面,将DCT系数做旋转90度操作,逆变换后恢复得到的图像如下图所示:

观察发现图像的变化更大了,黑白交错得更厉害,分析其原因在于将DCT系数旋转180度后,原图像直流分量编程各横行竖列的最高频率分量,这个量是比较大的,而原图像横行竖列的最高频率分量变为了图像的直流分量,这个量是相当小的,所以说最终逆变后的图

像沿横竖两个方向的灰度波动都交大,并且图像整体灰度较暗。

源代码如下:

image_2_4.m

clc;

C = dct2(P);

C1 = C';

C2 = rot90(C);

C3 = rot90(C2);

imtool(idct2(C),[0 255]);

imtool(idct2(C1),[0 255]);

imtool(idct2(C2),[0 255]);

imtool(idct2(C3),[0 255]);

5、如果认为差分编码是一个系统,请绘出这个系统的频率响应,说明它是一个___高通__(低通、高通、带通、带阻)滤波器。DC 系数先进行差分编码再进行熵编码,说明DC 系数的__低__频率分量更多。

分析:

首先写出系统的差分方程如下:

y(n) = x(n-1) – x(n)

对方程进行Z变换后得到如下传递函数:

H(z)=Y(z)

X(z)

=

1?z

z

然后画出频率相应得到:

由此可知系统呈现高通特性,说明DC系数的低频分量更多,通过差分编码后可以尽可能多的减短码长。

源代码如下:

image_2_5.m

clc,close all;

a = [1];

b = [-1 1];

tf(b,a);

figure;

freqz(b,a);

6、DC预测误差的取值和Category 值有何关系?如何利用预测误差计算出其Category ?

分析:

Category值就是DC预测误差的绝对值的二进制位长,可以得到一个转换公式:

Category ={floor(log2(|DC |))+1,DC ≠0

0,DC =0

7、你知道哪些实现Zig-Zag 扫描的方法?请利用MATLAB 的强大功能设计一种最佳方法。 分析:

Zigzag 扫描实现将每一个8*8矩阵的DCT 系数按照特定的顺序存

储成一列数据,但是在实现扫描的Z 字型移动时,会遇到较多麻烦,在编程实现时,可以建立一个映射关系,采取顺序扫描,离散映射的方法快速获得列矢量各元素。 下表表示矩阵各系数对应编号:

按照二维顺序扫描此8*8图像,然后按照对应编号将每个分量映射到矢量的对应位置。

写出函数zigzag()

源代码如下所示:

zigzag.m:

function Z = zigzag(C)

order = [ 1 2 6 7 15 16 28 29;

3 5 8 1

4 17 27 30 43;

4 9 13 18 26 31 42 44;

10 12 19 25 32 41 45 54;

11 20 24 33 40 46 53 55;

21 23 34 39 47 52 56 61;

22 35 38 48 51 57 60 62;

36 37 49 50 58 59 63 63;];

Z = zeros(64,1);

for i = 1:8

for j = 1:8

Z(order(i,j)) = C(i,j);

end

end

end

8、对测试图像分块、DCT和量化,将量化后的系数写成矩阵的形式,其中每一列为一个块的DCT系数Zig-Zag扫描后形成的列矢量,第一行为各个块的DC系数。

分析:

首先将测试图像分成互补重叠的8*8小块,然后依次对每一个8*8小块进行DCT变换,得到8*8的DCT系数矩阵,系数矩阵除以量化矩阵得到根据权重量化的DCT系数,接着调用7问中的zigzag()函数

将量化后的DCT系数按顺序存储成为64*1的列向量,最后将所有列向量按行并起来即可得到用来表征整个图像的DCT系数矩阵,这个整体图像DCT系数矩阵的第一行即为DC系数,其余为AC系数。

原代码如下:

image_2_8.m

clc,close all,clear all;

load JpegCoeff.mat;

load hall.mat;

%实现分块

[a b] = size(hall_gray);

M = 8*ones(1,a/8);

N = 8*ones(1,b/8);

Block = mat2cell(hall_gray,M,N);

%DCT变换、量化、zigzag扫描

J = zeros(64,a*b/64); %a*b/64为分块数目

for i = 1:a*b/64

Block{i} = double(Block{i}) - 128; %预处理

C = dct2(Block{i}); %DCT变换

C_qual = round(C./QTAB); %量化

J(:,i) = zigzag(C_qual); %zigzag扫描

end

9、请实现本章介绍的JPEG编码(不包括写JFIF文件),输出为DC系数的码流、AC系数的码流、图像高度和图像宽度,将这四个变量写入Jpegcodes.mat文件。

分析:

按照pdf中所给的编码方式分别写出DC编码和AC编码的函数,然后将使用8问方法处理过后的矢量调用这两个函数分别得到了DC系数的码流和AC系数的码流。

源代码如下:

clc,close all,clear all;

load JpegCoeff.mat;

load hall.mat;

%实现分块

[a b] = size(hall_gray);

M = 8*ones(1,a/8);

N = 8*ones(1,b/8);

Block = mat2cell(hall_gray,M,N);

%DCT变换、量化、zigzag扫描

J = zeros(64,a*b/64); %a*b/64为分块的数目

for i = 1:a*b/64

Block{i} = double(Block{i}) - 128; %预处理

C = dct2(Block{i}); %DCT变换

C_qual = round(C./QTAB); %量化

J(:,i) = zigzag(C_qual); %zigzag扫描

end

%熵编码

DC = DCencode(J(1,:));%调用函数DCencode实现直流编码

AC = ACencode(J); %调用函数Cencode实现交流编码

%保存

save Jpegcodes.mat DC AC a b;

DCencode.m

function DC = DCencode(dc)

%读入DCTAB

load JpegCoeff.mat;

%进行差分运算

[a b] = size(dc);

dc_dif = zeros(1,b);

dc_dif(1) = dc(1);

dc_dif(2:end) = dc(1:end - 1) - dc(2:end);

DC = zeros(0);

for i = 1:b %计算各category,用于定位DCTAB中对应行数if dc_dif(i) ~= 0;

category = floor(log2(abs(dc_dif(i)))) + 1;

else

category = 0;

end

%提取category的huffman码

len = DCTAB(category + 1,1);

dc_huff = DCTAB(category + 1,2:len + 1);

%生成相应二进制码

dc_bin = de2bi(abs(dc_dif(i)),'left-msb');

if(dc_dif(i) < 0)

dc_bin = ~dc_bin;

end

%生成完整编码

if(category == 0)

DC = [DC,dc_huff];

else

DC = [DC,dc_huff,dc_bin];

end

end

end

ACencode.m

function AC = ACencode(J)

%读入ACTAB

load JpegCoeff.mat;

%初始化

ZRL = [1 1 1 1 1 1 1 1 0 0 1];

EOB = [1 0 1 0];

[a b] = size(J);

AC = zeros(0);

for i = 1:b

if(any(J(2:end,i))) %如果此子向量中存在非0系数

place = find(J(2:end,i)); %定位此序列中向量非0系数所在下标

last = place(end) + 1; %校正下标值,应加1

Run = 0;

for j = 2:last

if(J(j,i) == 0)

Run = Run + 1;

if(Run == 16)

AC = [AC,ZRL];

Run = 0;

end

else

Size = floor(log2(abs(J(j,i)))) + 1;

len = ACTAB(Run*10 + Size,3);

ac_huff = ACTAB(Run*10 + Size,4:len + 3);%得到对应huffman编码

ac_bin = de2bi(abs(J(j,i)),'left-msb'); %转化为二进制数

if(J(j,i) < 0) %对负数取反

ac_bin = ~ac_bin;

end

AC = [AC,ac_huff,ac_bin];

Run = 0;

end

end

end

AC = [AC,EOB]; %插入块结束符

end

end

10、计算压缩比(输入文件长度/输出码流长度),注意转换为相同进制。

分析:

输出码流长度= DC码流长度+ AC码流长度+ 高的二进制位长+ 宽的二进制位长,由此可以得到输出码流长度= 2173 + 23072 + 8 + 8 = 25261,而输入文件长度= 120*168*8 = 161280,最终我们可以得到压缩比= 161280/25261 ≈6.385。

11、请实现本章介绍的JPEG解码,输入是你生成的Jpegcodes.mat文件。分别用客观(PSNR)和主观方式评价编解码效果如何。

分析:

按照编码的逆顺序处理了自己生成的Jpegcodes.mat文件,生成如下图像:

按照课件中的方法编程计算出了PSNR系数的大小:

由此不管是从主管观察还是客观的用PSNR系数来判断,都可以看到解码出来的图像与原图像相比的效果是不太好的。

源代码如下:

image_2_11.m

clc,close all,clear all;

%载入相关数据

load JPEGCodes.mat;

load JpegCoeff.mat;

%解码

J_dc = DCdecode(DC,a,b);

J_ac = ACdecode(AC,a,b,ACTAB);

J = cell2mat({J_dc;J_ac});%第一行是直流分量,之后为交流分量

%反zigzag扫描,反量化,反DCT变换

Block = cell(a/8,b/8);

for i = 1:a*b/64

Q = Izigzag(J(:,i));%调用自定义反zigzag函数,恢复量化系数矩阵

C = Q.*QTAB; %反量化

Block{i} = idct2(C);%反DCT变换

Block{i} = Block{i} + 128; %反预处理

end

%拼接恢复图像

hall_gray2 = cell2mat(Block);

hall_gray2 = uint8(hall_gray2);

save hall_gray2.mat hall_gray2;

%画出图像进行对比

load hall.mat

figure;

subplot(1,2,1),imshow(hall_gray,[0 255]);

subplot(1,2,2),imshow(hall_gray2);

izigzag.m

function C = Izigzag(J)

order = [ 1 2 6 7 15 16 28 29;

3 5 8 1

4 17 27 30 43;

4 9 13 18 26 31 42 44;

10 12 19 25 32 41 45 54;

11 20 24 33 40 46 53 55;

21 23 34 39 47 52 56 61;

22 35 38 48 51 57 60 62;

36 37 49 50 58 59 63 64;];

C = zeros(8,8);

for i = 1:64

C(i) = J(order(i));

end

end

DCdecode.m

function J = DCdecode(DC,a,b)

%解码恢复预测误差序列

J_dif = ones(1,a*b/64);

i = 1;

j = 1;

while i <= length(DC);

%计算category

if(DC(i) == 0)

if(DC(i + 1) == 0)

category = 0;

i = i + 2;

elseif(DC(i + 2) == 0)

category = 1;

i = i + 3;

else

category = 2;

i = i + 3;

end

elseif(DC(i + 1) == 0)

if(DC(i + 2) == 0)

category = 3;

i = i + 3;

else

category = 4;

i = i + 3;

end

elseif(DC(i + 2) == 0);

category = 5;

i = i + 3;

elseif(DC(i + 3) == 0)

category = 6;

i = i + 4;

elseif(DC(i + 4) == 0)

category = 7;

i = i + 5;

elseif(DC(i + 5) == 0)

category = 8;

i = i + 6;

elseif(DC(i + 6) == 0)

category = 9;

i = i + 7;

elseif(DC(i + 7) == 0)

category = 10;

i = i + 8;

elseif(DC(i + 8) == 0)

category = 11;

i = i + 9;

end

%二进制转化为十进制

if category == 0

J_dif(j) = 0;

j = j + 1;

else

DC_bin = DC(i:i + category - 1);

if(DC_bin(1) == 0)

DC_bin = ~DC_bin;

J_dif(j) = - bi2de(DC_bin,'left-msb'); j = j + 1;

else

J_dif(j) = bi2de(DC_bin,'left-msb');

j = j + 1;

end

i = i + category;

end

基于matlab的人脸识别源代码

function varargout = FR_Processed_histogram(varargin) %这种算法是基于直方图处理的方法 %The histogram of image is calculated and then bin formation is done on the %basis of mean of successive graylevels frequencies. The training is done on odd images of 40 subjects (200 images out of 400 images) %The results of the implemented algorithm is 99.75 (recognition fails on image number 4 of subject 17) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @FR_Processed_histogram_OpeningFcn.,.. 'gui_OutputFcn', @FR_Processed_histogram_OutputFcn.,.. 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

基于matlab程序实现人脸识别

基于m a t l a b程序实现 人脸识别 TYYGROUP system office room 【TYYUA16H-TYY-TYYYUA8Q8-

基于m a t l a b程序实现人脸识别 1.人脸识别流程 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显着不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。 人脸识别流程图 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;

人脸识别系统设计与仿真 基于matlab的(含matlab源程序)版权不归自己 交流使用

人脸识别系统设计与仿真基于matlab的(含matlab源程序) 交流使用参考后自行那个删除后果自负 目录 第一章绪论 (2) 1.1 研究背景 (2) 1.2 人脸图像识别的应用前景 (3) 1.3 本文研究的问题 (4) 1.4 识别系统构成 (5) 1.5 论文的内容及组织 (7) 第二章图像处理的Matlab实现 (8) 2.1 Matlab简介 (8) 2.2 数字图像处理及过程 (8) 2.2.1图像处理的基本操作 (8) 2.2.2图像类型的转换 (9) 2.2.3图像增强 (9) 2.2.4边缘检测 (10) 2.3图像处理功能的Matlab实现实例 (11) 2.4 本章小结 (15) 第三章人脸图像识别计算机系统 (16) 3.1 引言 (16) 3.2系统基本机构 (17)

3.3 人脸检测定位算法 (18) 3.4 人脸图像的预处理 (25) 3.4.1 仿真系统中实现的人脸图像预处理方法 (26) 第四章基于直方图的人脸识别实现 (29) 4.1识别理论 (29) 4.2 人脸识别的matlab实现 (29) 4.3 本章小结 (30) 第五章总结 (31) 致谢 (32) 参考文献 (33) 附录 (35)

第一章绪论 本章提出了本文的研究背景及应用前景。首先阐述了人脸图像识别意义;然后介绍了人脸图像识别研究中存在的问题;接着介绍了自动人脸识别系统的一般框架构成;最后简要地介绍了本文的主要工作和章节结构。 1.1 研究背景 自70年代以来.随着人工智能技术的兴起.以及人类视觉研究的进展.人们逐渐对人脸图像的机器识别投入很大的热情,并形成了一个人脸图像识别研究领域,.这一领域除了它的重大理论价值外,也极具实用价值。 在进行人工智能的研究中,人们一直想做的事情就是让机器具有像人类一样的思考能力,以及识别事物、处理事物的能力,因此从解剖学、心理学、行为感知学等各个角度来探求人类的思维机制、以及感知事物、处理事物的机制,并努力将这些机制用于实践,如各种智能机器人的研制。人脸图像的机器识别研究就是在这种背景下兴起的,因为人们发现许多对于人类而言可以轻易做到的事情,而让机器来实现却很难,如人脸图像的识别,语音识别,自然语言理解等。如果能够开发出具有像人类一样的机器识别机制,就能够逐步地了解人类是如何存储信息,并进行处理的,从而最终了解人类的思维机制。 同时,进行人脸图像识别研究也具有很大的使用价依。如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。现在己

(完整word版)基于MATLAB的人脸识别

图像识别 题目:基于MATLAB的人脸识别 院系:计算机科学与应用系 班级: 姓名: 学号: 日期:

目录 引言 (1) 1 人脸识别技术 (2) 1.1人脸识别的研究内容 (2) 1.1.1人脸检测(Face Detection) (2)

1.1.2人脸表征(Face Representation) (2) 1.2几种典型的人脸识别方法 (3) 1.2.1基于几何特征的人脸识别方法 (3) 1.2.2基于K-L变换的特征脸方法 (4) 1.2.3神经网络方法 (4) 1.2.4基于小波包的识别方法 (5) 1.2.5支持向量机的识别方法 (5) 2 人脸特征提取与识别 (5) 2.1利用PCA进行特征提取的经典算法——Eigenface算法 (6) 2.2 PCA人脸识别流程 (6) 2.3特征向量选取 (8) 2.4距离函数的选择 (9) 2.5 基于PCA的人脸识别 (9) MATLAB人脸识别程序 (10) 3 MATLAB软件程序编写 (10) 3.1.创建图片数据库 (10) 3.2 主程序 (11) 3.3最终程序结果 (12) 4 心得与体会 (12) 参考文献 (13)

引言 随着社会的发展及技术的进步,社会各方面对快速高效的自动身份验证的需求可以说无处不在,并与日俱增。例如,某人是否是我国的居民,是否有权进入某安全系统,是否有权进行特定的交易等。尤其是自2001年美国“9.1l”恐怖袭击发生以来,如何在车站、机场等公共场所利用高科技手段,迅速而准确地发现并确认可疑分子成了目前世界各国在反恐斗争中普遍关注的问题。为此,各国都投入大量人力、物力研究发展各类识别技术,使得生物特征识别技术得到了极大的发展。生物特征识别技术主要包括:人脸识别、虹膜识别、指纹识别、步态识别、语音识别、笔迹识别、掌纹识别以及多生物特征融合识别等。人类通过视觉识别文字,感知外界信息。在客观世界中,有75%的信息量都来自视觉,因此让计算机或机器人具有视觉,是人工智能的重要环节。由于生物特征是人的内在属性,具有很强的稳定性和个体差异性,因此是身份验证最理想的依据。与虹膜、指纹、基因、掌纹等其他人体生物特征识别系统相比,人脸识别系统更加直接、方便、友好,易于为用户所接受,并且通过人脸的表情、姿态分析,还能获得其它识别系统难以得到的一些信息。 人脸识别技术在国家重要机关及社会安防领域具有广泛用途。例如:公安系统的罪犯识别、信用卡验证、医学、档案管理、视频会议、人机交互系统等身份识别和各类卡持有人的身份验证。同其他人体生物特征(如:指纹、掌纹、虹膜、语音等)识别技术相比,人脸识别技术的隐性最好,人脸识别系统更直接、友好,是当今国际反恐和安防最重视的科技手段和攻关标志之一。虽然人类能毫不费力地识别出人脸及表情,但对人脸的机器自动识别确实一个难度极大的课题,它涉及到模式识别、图像处理及生理、心理学等诸多方面的知识。人脸识别技术的研究虽然己经取得了一定的可喜成果,但在实际应用中仍存在着许多严峻的问题。人脸的非刚体性、姿态、表情、发型以及化妆的多样性都给正确识别带来了困难,要让计算机像人一样方便地识别出大量的人脸,尚需不同科学研究领域的科学家共同不懈的努力。

人脸识别MATLAB代码

1.色彩空间转换 function [r,g]=rgb_RGB(Ori_Face) R=Ori_Face(:,:,1); G=Ori_Face(:,:,2); B=Ori_Face(:,:,3); R1=im2double(R); % 将uint8型转换成double型G1=im2double(G); B1=im2double(B); RGB=R1+G1+B1; row=size(Ori_Face,1); % 行像素 column=size(Ori_Face,2); % 列像素 for i=1:row for j=1:column rr(i,j)=R1(i,j)/RGB(i,j); gg(i,j)=G1(i,j)/RGB(i,j); end end rrr=mean(rr); r=mean(rrr); ggg=mean(gg); g=mean(ggg); 2.均值和协方差 t1=imread('D:\matlab\皮肤库\1.jpg');[r1,g1]=rgb_RGB(t1); t2=imread('D:\matlab\皮肤库\2.jpg');[r2,g2]=rgb_RGB(t2); t3=imread('D:\matlab\皮肤库\3.jpg');[r3,g3]=rgb_RGB(t3); t4=imread('D:\matlab\皮肤库\4.jpg');[r4,g4]=rgb_RGB(t4); t5=imread('D:\matlab\皮肤库\5.jpg');[r5,g5]=rgb_RGB(t5); t6=imread('D:\matlab\皮肤库\6.jpg');[r6,g6]=rgb_RGB(t6); t7=imread('D:\matlab\皮肤库\7.jpg');[r7,g7]=rgb_RGB(t7); t8=imread('D:\matlab\皮肤库\8.jpg');[r8,g8]=rgb_RGB(t8);

基于MATLAB的人脸识别

基于MATLAB的人脸识别

————————————————————————————————作者: ————————————————————————————————日期:

图像识别 题目:基于MATLAB的人脸识别 院系:计算机科学与应用系 班级: 姓名: 学号: 日期:

设计题目基于MATLAB的人脸识别设 计技术参数 测试数据库图片10张训练数据库图片20张图片大小1024×768 特征向量提取阈值 1 设计要求综合运用本课程的理论知识,并利用MATLAB作为工具实现对人脸图片的预处理,运用PCA算法进行人脸特征提取,进而进行人脸匹配识别。 工作量 两周的课程设计时间,完成一份课程设计报告书,包括设计的任务书、基本原理、设计思路与设计的基本思想、设计体会以及相关的程序代码; 熟练掌握Matlab的使用。 工作计划第1-2天按要求查阅相关资料文献,确定人脸识别的总体设计思路; 第3-4天分析设计题目,理解人脸识别的原理同时寻求相关的实现算法;第5-8天编写程序代码,创建图片数据库,运用PCA算法进行特征提取并编写特征脸,上机进行调试; 第9-12天编写人脸识别程序,实现总体功能; 第13-14天整理思路,书写课程设计报告书。 参考资料1 黄文梅,熊佳林,杨勇编著.信号分析与处理——MATALB语言及应用.国防科技大学出版社,2000 2 钱同惠编著.数字信号处理.北京:机械工业出版社,2004 3 姚天任,江太辉编著.数字信号处理.第2版.武汉:武汉理工大学出版社,2000 4 谢平,林洪彬,王娜.信号处理原理及应用.机械工业出版社,2004 5刘敏,魏玲.Matlab.通信仿真与应用.国防工业出版社,2005 6 楼顺天.基于Matlab7.x 的系统分析与设计.西安电子科技大学,2002 7孙洪.数字信号处理.电子工业出版社,2001 目录 引言?错误!未定义书签。 1 人脸识别技术?错误!未定义书签。 1.1人脸识别的研究内容?错误!未定义书签。 1.1.1人脸检测(Face Detection)........... 错误!未定义书签。

人脸识别matlab程序

人脸识别 % FaceRec.m % PCA 人脸识别修订版,识别率88% % calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5 a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); % imshow(a); b=a(1:112*92); % b 是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b); allsamples=[allsamples; b]; % allsamples 是一个M * N 矩阵,allsamples 中每一行数 据代表一张图片,其中M=200 end end samplemean=mean(allsamples); % 平均图片,1 × N for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; % xmean 是一个M ×N 矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end; % 获取特征值及特征向量 sigma=xmean*xmean'; % M * M 阶矩阵 [v d]=eig(sigma); d1=diag(d); % 按特征值大小以降序排列 dsort = flipud(d1); vsort = fliplr(v); %以下选择90%的能量 dsum = sum(dsort); dsum_extract = 0; p = 0; while( dsum_extract/dsum < 0.9) p = p + 1; dsum_extract = sum(dsort(1:p)); end

基于matlab的人脸识别技术

基于matlab 的人脸识别技术 论文 摘要:随着计算机技术的飞速发展,人脸识别技术逐渐发展壮大起来,并应用到众多领域。 人脸识别是指在人脸检测的基础上针对输入的人脸图像,通过特征提取与特征匹配,找出与人脸库中匹配的人脸图像,从而达到识别效果。当前主要采取的人脸识别方法有:基于几何特征的方法 ,基于模板的方法和基于模型的方法。 这些方法较适合于人脸信息的验证,即待识别者是否为预先指定的对象。不足之处在于,需要建立一个拥有庞大人脸信息的训练样本库,因此就降低了输出结果的时效性和准确性。在应用领域中存在局限性,不适于具有庞大人脸样本训练库的身份鉴别领域。鉴于种种不足,本文提出了一种基于可变人脸库的快速人脸识别方法,使人脸识别技术适用于更多的行业。网络信息化时代的一大特征就是身份的数字化和隐性化,如何准确鉴定一个人的身份,保护信息安全是当今信息化时代必须解决的一个关键社会问题。正在悄然兴起的人脸识别技术正好可以解决这一问题。 关键词:模式识别,K-L 变换,人脸识别,图像处理,matlab,图像增强,边缘检测,图像预处理,灰度直方图,特征提取 1.1识别系统构成 自动人脸识别系统具有如图所示的一半框架并完成相应功能的任务。 (1)人脸图像的获取:一般来说,图像的获取都是通过摄像头摄取,氮摄取的图像可以是真人,也可以是人脸的图片或者为了相对简单,可以不考虑通过摄像头来摄取头像,而是直接给定要识别的图像。 (2)人脸的检测:人脸检测的任务是判断静态图像中是否存在人脸。若存在人脸,给出其在图像中的坐标位置,人脸区域大小等信息。而人脸跟踪需要进一步输出所检测到的人脸位置,大小等状态随时间的连续变化情况。 (3)特征提取通过人脸特征点的检测与标定可以确定人脸图像中显著特征点的位置(如眼睛,眉毛,鼻子,嘴巴等器官),同时还可以得到这些器官及其面部轮廓的形状信息的描述。 1.人脸特征提取的算法:K-L 变换是图像压缩中的一种最优正交变换,通过它可以把人脸样本从高维空间表示转换到低维空间表示,且由低维空恢复的人脸样本和原人脸样本具有最小的均方误差,从而可用人脸样本在低维空间的变换系数作为对人脸特征的描述。其中主元分析法(PCA )就是基于K-L 变换的一种比较流行的算法,它是统计学中分析数据的一种有效的方法,其目的是在数据间中找到一组向量以尽可能地解释数据的方差,将数据从原来的R 维空间将维投影到M 维空间(R>>M)并保存数据的主要信息,从而使数据更易于处理.按照K-L 变换识别算法流程.从人脸样本中提取面部特征.是人脸识别中重要步骤.其实质是一个从高维图像空间到低维数字空间的转换过程,可表示为:Y=T{x} 式中:x 表示原始数据,Y 表示为特征信息,T 表示映射 人脸样本特征提取算法如下:首先计算该库中所有样本的平均值(平均脸): ∑==p i n f P f 1 1 式中;P 表示照片数.f 表示每张照片的线性表示然后构建协方差矩阵: T T i p i i A A f f P C ?==∑=)'('11 式中:f f f i -='表示每张照片与样本平均值的差。A 表示差值形成的矩阵 接着,进行特征的提取:由于此协方差矩阵进行求解特征值和特征向量比较困难的,因此采用奇异值分解的方法得到特征矩阵。 i T i f U Y '=

基于matlab程序实现人脸识别

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); %二值化

人脸识别PCA算法matlab实现及详细步骤讲解

%FaceRec.m %PCA人脸识别修订版,识别率88% %calc xmean,sigma and its eigen decomposition allsamples=[];%所有训练图像 for i=1:40 for j=1:5 a=imread(strcat('e:\ORL\s',num2str(i),'\',num2str(j),'.jpg')); %imshow(a); b=a(1:112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上 到下,从左到右 b=double(b); allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数 据代表一张图片,其中M=200 end end samplemean=mean(allsamples);%平均图片,1×N for i=1:200xmean(i,:)=allsamples(i,:)-samplemean;%xmean是一个M×N矩阵,xmean 每一行保存的数据是“每个图片数据-平均图片” end; %获取特征值及特征向量 sigma=xmean*xmean';%M*M阶矩阵 [v d]=eig(sigma); d1=diag(d); %按特征值大小以降序排列 dsort=flipud(d1); vsort=fliplr(v); %以下选择90%的能量 dsum=sum(dsort); dsum_extract=0; p=0; while(dsum_extract/dsum<0.9) p=p+1; dsum_extract=sum(dsort(1:p)); end i=1; %(训练阶段)计算特征脸形成的坐标系 base=xmean'*vsort(:,1:p)*diag(dsort(1:p).^(-1/2)); %base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1) %详见《基于PCA的人脸识别算法研究》p31 %xmean'*vsort(:,i)是小矩阵的特征向量向大矩阵特征向量转换的过程 %while(i<=p&&dsort(i)>0) %base(:,i)=dsort(i)^(-1/2)*xmean'*vsort(:,i);%base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化(使其方差为1) %详见《基于PCA的人脸识别算法研究》p31 %i=i+1;%xmean'*vsort(:,i)是小矩阵的特征向量向大矩阵特 征向量转换的过程 %end %以下两行add by gongxun将训练样本对坐标系上进行投影,得到一个M*p阶矩阵allcoor allcoor=allsamples*base;%allcoor里面是每张训练人脸图片在M*p子空间中的一个点,即在子空间中的组合系数, accu=0;%下面的人脸识别过程中就是利用这些组合系数来进行识别

基于matlab的简单人脸识别程序代码

基于matlab的简单人脸识别实例 简介 人脸识别特指利用分析比较人脸视觉特征信息进行身份鉴别的计算机技术。人脸识别是一项热门的计算机技术研究领域,在生活中许多领域都有着重要应用。 内容 这里通过对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理。进而得到人脸区域。 代码 % Bylyqmath % DLUT School of Mathematical Sciences % BLOG:https://www.doczj.com/doc/e65961427.html,/lyqmath clc; clear all; close all; % 载入图像 Img = imread('face.jpg'); if ndims(Img) == 3 I=rgb2gray(Img); else I = Img; end BW = im2bw(I, graythresh(I)); % 二值化 figure; subplot(2, 2, 1); imshow(Img); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(Img); title('网格标记图像', 'FontWeight', 'Bold'); hold on; [xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ... round(linspace(1, size(I, 2), 10))); mesh(yt, xt, zeros(size(xt)), 'FaceColor', ... 'None', 'LineWidth', 3, ... 'EdgeColor', 'r'); subplot(2, 2, 3); imshow(BW); title('二值图像', 'FontWeight', 'Bold'); [n1, n2] = size(BW); r = floor(n1/10); % 分成10块,行 c = floor(n2/10); % 分成10块,列 x1 = 1; x2 = r; % 对应行初始化 s = r*c; % 块面积 for i = 1:10

照片人脸检测MATLAB代码(汇编)

% 载入图像 Img = imread('star1.jpg'); if ndims(Img) == 3 I=rgb2gray(Img); else I = Img; end BW = im2bw(I, graythresh(I)); % 二值化 figure; subplot(2, 2, 1); imshow(Img); title('原图像', 'FontWeight', 'Bold'); subplot(2, 2, 2); imshow(Img); title('网格标记图像', 'FontWeight', 'Bold'); hold on; [xt, yt] = meshgrid(round(linspace(1, size(I, 1), 10)), ... round(linspace(1, size(I, 2), 10))); mesh(yt, xt, zeros(size(xt)), 'FaceColor', ... 'None', 'LineWidth', 3, ... 'EdgeColor', 'r'); subplot(2, 2, 3); imshow(BW); title('二值图像', 'FontWeight', 'Bold'); [n1, n2] = size(BW); r = floor(n1/10); % 分成10块,行 c = floor(n2/10); % 分成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); [p, q] = size(loc); pr = p/s*100; % 黑色像素所占的比例数 if pr <= 100 BW(x1:x2, y1:y2) = 0; end end y1 = y1+c; % 列跳跃 y2 = y2+c; % 列跳跃 end x1 = x1+r; % 行跳跃 x2 = x2+r; % 行跳跃

基于MATLAB的人脸识别源程序

基于MATLA酌人脸识别源程序1?色彩空间转换function [r,g]=rgb_RGB(Ori_Face) R=0ri_Face(:,:,1); G=0ri_Face(:,:,2); B=Ori_Face(:,:,3); R1=im2double(R); % 将uint8 型转换成double型 G1=im2double(G); B1=im2double(B); RGB=R1+G1+B1; row=size(Ori_Face, 1); %行像素 column=size(Ori_Face,2); %列像素for i=1:row for j=1:column rr(i,j)=R1(i,j)/RGB(i,j); gg(i,j)=G1(i,j)/RGB(i,j); end

end rrr=mean(rr); r=mean(rrr); ggg=mean(gg); g=mean(ggg); 2?均值和协方差

皮肤库\2?jpg');[r2,g2]=rgb_RGB(t2); 皮肤库\3?jpg');[r3,g3]=rgb_RGB(t3); 皮肤库\4?jpg');[r4,g4]=rgb_RGB(t4); 皮肤库\5?jpg');[r5,g5]=rgb_RGB(t5); 皮肤库\6?jpg');[r6,g6]=rgb_RGB(t6); 皮肤库\7?jpg');[r7,g7]=rgb_RGB(t7); 皮肤库\8?jpg');[r8,g8]=rgb_RGB(t8); 皮肤库\9?jpg');[r9,g9]=rgb_RGB(t9); 皮肤库\10?jpg');[r10,g10]=rgb_RGB(t10); 皮肤库\11?jpg');[r11,g11]=rgb_RGB(t11); 皮肤库\12?jpg');[r12,g12]=rgb_RGB(t12); 皮肤库\13?jpg');[r13,g13]=rgb_RGB(t13); 皮肤库\14?jpg');[r14,g14]=rgb_RGB(t14); 皮肤库\15?jpg');[r15,g15]=rgb_RGB(t15); 皮肤库\16?jpg');[r16,g16]=rgb_RGB(t16); 皮肤库\17?jpg');[r17,g17]=rgb_RGB(t17); 皮肤库\18?jpg');[r18,g18]=rgb_RGB(t18); 皮肤库\19?jpg');[r19,g19]=rgb_RGB(t19); 皮肤库\20?jpg');[r20,g20]=rgb_RGB(t20); 皮肤库\21?jpg');[r21,g21]=rgb_RGB(t21);

基于matlab程序实现人脸识别

基于matlab程序实现人脸识别 1 ?人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb- Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。1.1.2流程图 人脸识别流程图 读入原始图像 将图像转化为YCbCr颜色空 间 选取岀二值图像中的白色区 域,度量区域属性,筛选后 得到所有矩形块 ■筛选特定区域(高度和宽度的比率 在(0.6-2之间,眼睛特征) 是 存储人睑的矩形区域 特殊区域根据其他信息筛 选,标记最终的人脸区域

2?人脸识别程序 (1) 人脸和非人脸区域分割程序function result = Skin(Y J Cb)Cr) %SKIN SUmmary Of this function goes here % DetaiIeCl explanation goes here a=25.39; b=14.03; ecx=1.60; ecy=2.41; Sita=2.53; CX=IO9.38; cy=152.02; XiShU=[cos(sita) Sirl(Sita);-Sin(Sita) COS(Sita)]; %如果亮度大于230,则将长短轴同时扩大为原来的1.1倍if (Y>230) a=1.1*a; b=1.1*b; end %根据公式进行计算Cb=doub∣Θ(Cb); Cr=double(Cr); t=[(Cb-cx);(Cr-Cy)]; temp=xishu*t; VaIUe=(temp(1)-ecx)A2^A2+(temp(2)-ecy)A2t)A2; %大于1则不是肤色,返回0;否则为肤色,返回1 if ValUe>1 result=O; else result=1; end end (2) 人脸的确认程序 function eye = findeye(blmage,x,y5w5h) %FINDEYE SUmmary Of this funCtiOn goes here % DetaileCl explanation goes here Part=Zeros(h,w); %二值化 for i=y:(y+h) for j=x:(x+w) if blmage(i,j)==O

基于肤色的人脸检测matlab代码

main close all clear all clc %输入图像名字 img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s'); %当输入0时结束 while~strcmp(img_name,'0') %进行人脸识别 facedetection(img_name); img_name=input('请输入图像名字(图像必须为RGB图像,输入0结束):','s'); end facedetection function facedetection(img_name) %读取RGB图像 I=imread(img_name); %转换为灰度图像 gray=rgb2gray(I); %将图像转化为YCbCr颜色空间 YCbCr=rgb2ycbcr(I); %获得图像宽度和高度 heigth=size(gray,1); width=size(gray,2); %根据肤色模型将图像二值化 for i=1:heigth 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=bwmorph(gray,'erode'); %imopen先腐蚀再膨胀 gray=imopen(gray,SE); %imclose先膨胀再腐蚀 %gray=imclose(gray,SE); 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=uint8(x); uy=uint8(y); if ux>1 ux=ux-1; end if uy>1 uy=uy-1; end %可能是人脸区域的矩形应满足以下条件: %1、高度和宽度必须都大于20,且矩形面积大于400 %2、高度和宽度比率应该在范围(0.6,2)内 %3、函数findeye返回值为1 if w<20||h<20||w*h<400 continue elseif ratio<2&&ratio>0.6&&findeye(gray,ux,uy,w,h)==1 %记录可能为人脸的矩形区域 result(n,:)=[ux uy w h]; n=n+1; end end

人脸识别核心算法及MATLAB代码

人脸识别核心算法 在检测到人脸并定位面部关键特征点之后,主要的人脸区域就可以被裁剪出来,经过预处理之后,馈入后端的识别算法。识别算法要完成人脸特征的提取,并与库存的已知人脸进行比对,完成最终的分类。我们在这方面的主要工作包括: ?基于LGBP的人脸识别方法 问题: 统计学习目前已经成为人脸识别领域的主流方法,但实践表明,基于统计学习的方法往往会存在“推广能力弱”的问题,尤其在待识别图像“属性”未知的情况下,更难以确定采用什么样的训练图像来训练人脸模型。鉴于此,在对统计学习方法进行研究的同时,我们还考虑了非统计模式识别的一类方法。 思路: 对于给定的人脸图像,LGBP方法首先将其与多个不同尺度和方向的Gabor滤波器卷积(卷积结果称为Gabor特征图谱)获得多分辨率的变换图像。然后将每个Gabor特征图谱划分成若干互不相交的局部空间区域,对每个区域提取局部邻域像素的亮度变化模式,并在每个局部空间区域内提取这些变化模式的空间区域直方图,所有Gabor特征图谱的、所有区域的直方图串接为一高维特征直方图来编码人脸图像。并通过直方图之间的相似度匹配技术(如直方图交运算)来实现最终的人脸识别。在FERET四个人脸图像测试集合上与FERET97的结果对比情况见下表。由此可见,该方法具有良好的识别性能。而且LGBP方法具有计算速度快、无需大样本学习、推广能力强的优点。参见ICCV2005 表.LGBP方法与FERET'97最佳结果的对比情况 ?基于AdaBoost的Gabor特征选择及判别分析方法 问题: 人脸描述是人脸识别的核心问题之一,人脸识别的研究实践表明:在人脸三维形状信息难以准确获取的条件下,从图像数据中提取多方向、多尺度的Gabor特征是一种合适的选择。使用Gabor特征进行人脸识别的典型方法包括弹性图匹配方法(EGM)和Gabor特征判别分类法(GFC)。EGM在实用中需要解决关键特征点的定位问题,而且其速度也很难提高;而GFC则直接对下采样的Gabor特征用PCA降维并进行判别分析,尽管这避免了精确定位关键特征点的难题,但下采样的特征维数仍然偏高,而且简单的下采样策略很可能遗漏了非常多的有用特征。 摘要: 针对上述问题,我们考虑如何对Gabor特征进行有效降维,将目前受到极大关注的AdaBoost算法创新性的应用于Gabor 特征的选择上来,用于提取对识别最有利的特征(我们称这些选择出来的Gabor特征为AdaGabor特征),并最终通过对AdaGabor特征的判别分析实现识别(称该方法为AGFC识别方法)。在CAS-PEAL和FERET人脸图像库上的对比实验表明:AGFC方法不但可以大大降低Gabor特征的维数从而可以更加有效地避免“维数灾难问题”,降低了计算复杂度,同时识别精度也有了较大的提高。将AGFC与EGM,GFC进一步比较可以看出:无论是EGM还是GFC,均是主观的选择若干面部关键特征点提取人脸的特征表示,而我们提出的AGFC方法则是通过机器学习的方法自动的选择那些对区分不同人脸具有关键作用的Gabor特征。参见下图所示三者之间的区别与联系。参见FG04,AMFG05

关于人脸检测的MATLAB代码

关于人脸检测的Matlab代码 FACE DETECTION: clear all clc %Detect objects using Viola-Jones Algorithm %To detect Face FDetect = vision.CascadeObjectDetector; %Read the input image I = imread('HarryPotter.jpg'); %Returns Bounding Box values based on number of objects BB = step(FDetect,I); figure, imshow(I); hold on for i = 1:size(BB,1) rectangle('Position',BB(i,:),'LineWidth',5,'LineStyle','-','EdgeC olor','r'); end title('Face Detection'); hold off; The step(Detector,I) returns Bounding Box value that contains [x,y,Height,Width] of the objects of interest. BB = 52 38 73 73 379 84 71 71 198 57 72 72 NOSE DETECTION: %To detect Nose NoseDetect = vision.CascadeObjectDetector('Nose','MergeThreshold',16);

基于matlab程序实现人脸识别

基于matlab程序实现人脸识别 1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现,肤色聚类区域在Cb—Cr子平面上的投影将缩减,与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。 1.1.2流程图 人脸识别流程图 读入原始图像 将图像转化为YCbCr颜色空 间 利用肤色模型二值化图像并 作形态学处理 选取出二值图像中的白色区 域,度量区域属性,筛选后 得到所有矩形块 否 筛选特定区域(高度和宽度的比率 在(0.6~2)之间,眼睛特征) 是 存储人脸的矩形区域 特殊区域根据其他信息筛 选,标记最终的人脸区域 2.人脸识别程序

(1)人脸和非人脸区域分割程序 function result = skin(Y,Cb,Cr) %SKIN Summary of this function goes here % Detailed explanation goes here a=25.39; b=14.03; ecx=1.60; ecy=2.41; sita=2.53; cx=109.38; cy=152.02; xishu=[cos(sita) sin(sita);-sin(sita) cos(sita)]; %如果亮度大于230,则将长短轴同时扩大为原来的1.1倍if(Y>230) a=1.1*a; b=1.1*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

相关主题
文本预览
相关文档 最新文档