数字图像处理--基于Matlab的人脸检测研究

一.项目目标

特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。而人脸识别则是特征识别一大应用。

本项目,将设计并实现基于Matlab的人脸识别算法,通过对人脸的颜色集训练得到一组人脸特征,再从一张新的图片中识别出人脸。最后还将测验在不同情况下的效果,以及将功能扩展到识别某个人脸或某种其他物体。

二.项目原理

1.特征提取

特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。 特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。

2.颜色直方图法

由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,本项目采取基于颜色特征的颜色直方图算法

颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。

3.颜色量化计

算颜色直方图需要将颜色空间划分成若干个小的颜色区间,每个小区间成为直方图的一个bin。这个过程称为颜色量化(color quantization)。然后,通过计算颜色落在每个小区间内的像素数量可以得到颜色直方图。颜色量化有许多方法,例如向量量化、聚类方法或者神经网络方法。最为常用的做法是将颜色空间的各个分量(维度)均匀地进行划分。相比之下,聚类算法则会考虑到图像颜色特征在整个空间中的分布情况,从而避免出现某些bin中的像素数量非常稀疏的情况,使量化更为有效。

上述的颜色量化方法会产生一定的问题。设想两幅图像的颜色直方图几乎相同,只是互相错开了一个bin,这时如果我们采用L1距离或者欧拉距离计算两者的相似度,会得到很小的相似度值。为了克服这个缺陷,需要考虑到相似但不相同的颜色之间的相似度。一种方法是采用二次式距离。另一种方法是对颜色直方图事先进行平滑过滤,即每个bin中的像素对于相邻的几个bin也有贡献。这样,相似但不相同颜色之间的相似度对直方图的相似度也有所贡献。

选择合适的颜色小区间(即直方图的bin)数目和颜色量化方法与具体应用的性能和效率要求有关。一般来说,颜色小区间的数目越多,直方图对颜色的分辨能力就越强。然而,bin的数目很大的颜色直方图不但会增加计算负担,也不利于在大型图像库中建立索引。而且对于某些应用来说,使用非常精细的颜色空间划分方法不一定能够提高检索效果,特别是对于不能容忍对相关图像错漏的那些应用。

4.项目方法

本实验针对图片集Faces目录下的28张人脸,试以此作为样本训练人脸标准v。再对图像中的所有像素点的颜色,计算其中各个颜色出现的频率,得到特征u。

训练人脸标准v:在将图像量化分块之后,建立拥有不同长度(即颜色个数的位数L)的特征向量v,而L将分别取3、4、5、6得到四个不同的v。当適取3/4/5/6时,意味着对于每个uint8只选取其前3/4/5/6位作为特征。故而L越大,v中每个元素包含的信息量越大,而L越小,v中每个点对应的颜色数目就越多。例如:L为3的v中每个元素(即该颜色的概率密度)对应于L为4 的v中,RGB前3位相同的颜色的概率密度之和。对于L为5同理。获取每个分块的对应的颜色直方图(即分布情况),计算颜色分布概率,经过33次训练后取平均值,最后得到标准v

获取颜色特征u:输人图像并对图像做分块处理(类似于JPEG编码)。对于每块图像块R,计算其特征u®,计算u®与v的度量系数,与阈值判定该块是否为人脸将相邻的人脸块统一并进行标识(用方框围住)。最后在图像上用多个小方框框出人脸,实现人脸识别。

三.设计思路

设计算法步骤如下:
1 根据训练集训练出特征标准v;
2.输人图像并对图像做分块处理(类似于JPEG编码);
3.对于每块图像块R,计算其特征u®;
4.计算u®与v的度量系数,与阈值判定该块是否为人脸;
5.将相邻的人脸块统一并进行标识(用方框围住);

四.具体实现

以下进行该算法的实现与结果测试:

1.训练特征标准

观察Faces中的训练样本,每张图片基本都是人脸,仅有少数的其它干扰,故我们可以认为训练集中的图片仅由人脸构成。故而我们定义函数feature_extract()来对单张图片进行特征提取,编写train.m脚本实现训练,并将得到 的标准特征v存入文件face_standard.mat中。

feature_extract()的关键代码如下

pic = double(reshape(pic,size(pic,1)*size(pic,2),1,3));
%新数组pic的维数大小为长*宽*3(有RGB三组值)

v = zeros(2^(3*L),1);%建立特征向量的数组,维数是2的3*L次幂
basic = 2^(8-L);
%初始化 

for i = 1:size(pic,1)    
    a = [pic(i,1,1),pic(i,1,2),pic(i,1,3)]; %取出像素,
    index = sum(floor(a/basic).*(2.^(2*L:-L:0)))+1;
    %计算该颜色对应的下标    
    v(index) = v(index) + 1;             %次数+1
end
v = v/size(pic,1);
%循环统计每个颜色出现的次数并求出频率

流程图如下:
在这里插入图片描述
train.m关键代码如下

for i = 1:num        
    v{L-2} = v{L-2} + feature_extract('Faces/',strcat(num2str(i),'.bmp'),L);    end

v{L-2} = v{L-2}/num;%进行num次提取特征训练,再取平均值end

%得到v数组

流程图如下:
在这里插入图片描述
得到的结果v如图(L=3):
在这里插入图片描述

2.输入图像并对其分块处理

不妨尝试取block」长的正方形大小的图像块进行处理(16<=block_l<=50,依图像不同而有变化),取图像块顺序为逐行取,

但有一点,此处若每行最后一块大小不足block_l*block_l大小,并不进行补全, 而是直接取剩下的即可。此块代码较简单,且类似于JPEG编码中的分块,不在此赘述。详见face_detect()函数。

3.计算图像块特征u

与训练特征标准中的对单张图片求槪正的方法一致。不再费述。

4.计算度量系数,从而进行检测

代码如下:

u = feature_extract(block,L);%获取该图像的特征u             
cor = sqrt(u)'*sqrt(v);%计算系数        
if cor >= threshold%如果大于阈值              
identify(i,j) = 1;%则是人脸            
rectangle('Position',...);%将该图像用红色小方框框出        
end  

流程图如下:
在这里插入图片描述
但是在此处阈值需要设定的较好,方可有较好的识别效果。为此写了 一个脚本来对不同阈值的效果进行对比(即效果图全部显示),随后用手工的方法挑最佳阈值。效果图如下:
在这里插入图片描述

5.将相邻的方块统一并进行标识

此处只需相邻的方块进随并,忽略单独的小方块即可。合招戈码可顧文件face_detect.m 修改后效果图如下(好看多了):
在这里插入图片描述

6.测试

我们再选择一张合照进行测试:
在这里插入图片描述
可以看出,虽然检测出人脸,但是方框过多,将人脸以及其他皮肤也识别了出来,这是由于颜色直方图是根据颜色特征进行是别的,而裸露的身体和人脸颜色特征相似,故也可以被识别出来。

解决方法有两种,一种是将识别定义为对人体裸露皮肤的识别,一种是考虑其他方法比如颜色集颜色距等等。但是总的来说L=6的情况似乎较好一些。

五.扩展研究

1.对变换后效果

对图像分别进行如下变换:
(a)顺时针旋转90度
(b)保持高度不变,宽度拉伸为原来的2倍(imresize)
©适当改麵5色(imadjust)再通过算法得到结果:

代码如下:

img = imread('test.jpg');
[y,num,identify] = face_detect(img,L,thresholds(L-2));
%原图 

img2 = rot90(img);
%将原图翻转90[y,num,identify] = face_detect(img2,L,thresholds(L-2)); 

img3 = imresize(img,[size(img,1) 2*size(img,2)],'nearest');
%将原图宽扩大2[y,num,identify] = face_detect(img3,L,thresholds(L-2)); 

img4 = imadjust(img,[.2 .3 0; .6 .7 1],[]);
%改变颜色对比度和颜色种类,即改变颜色[y,num,identify] = face_detect(img4,L,thresholds(L-2));

结果如下:
在这里插入图片描述
可以看出,对图像旋转、更改大小后,对于检测没有什么影响。但是对于颜色做出修改后,无法检测出人脸,原因就在于算法是基于训练出的颜色的,若将颜色多,则无法有效地进行识别。而颜色与旋转、改变大小等操作无关,所以结果基本一致。

2. 功能扩展

可以通过增加训练集数量,来达到对某个人种或某张人脸的识别。还可以考虑对某种动物比如猫进行识别,以及对某个其他物体进行识别,从而不局限于人脸识别。

六.参考文献

颜色特征提取 https://blog.csdn.net/u012507022/article/details/51614851通过计算机视觉进行人脸识别 https://ww2.mathworks.cn/discovery/face-recognition.html基于MATLAB的人脸识别算法的研究https://blog.csdn.net/baidu_34971492/article/details/78713367图像特征提取feature extractionhttps://blog.csdn.net/sinat_39372048/article/details/81461636《数字图像处理》作者: [美]冈萨雷斯 出版社: 电子工业出版社

发布了17 篇原创文章 · 获赞 12 · 访问量 1668

猜你喜欢

转载自blog.csdn.net/weixin_42784535/article/details/104672675