数字图像处理报告.docx
- 文档编号:4792309
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:19
- 大小:139.38KB
数字图像处理报告.docx
《数字图像处理报告.docx》由会员分享,可在线阅读,更多相关《数字图像处理报告.docx(19页珍藏版)》请在冰豆网上搜索。
数字图像处理报告
《数字图象处理》课程项目
实施报告
题目:
人脸面部自动定位与分割
组号:
任课教师:
组长:
成员:
成员:
成员:
联系方式:
二〇一五年一月十四日星期三
图目录
一项目介绍
一.1概述
图像分割是图像处理的主要目标,本项目综合利用图像采集、图像增强、彩色图像处理、图像分割等知识,根据人脸肤色检测及脸部五官形状,设计实现人脸照片中的人脸面部检测与五官分割。
一.2功能要求
1.人脸图像的采集
2.人脸图像增强:
去噪、均衡、尺寸归一化、倾斜校正等
3.脸部肤色区域分割:
采用肤色模型检测与分割人脸肤色区域
4.脸部五官区域分割:
采用水平投影等方法去将人脸分割成眉毛、眼睛、鼻子、嘴巴等多个区域
一.3实施要求
1.项目在自己的电脑上用软件完成,图像采集采用数码相机或拍照相机完成。
2.整个项目的程序可以采用Matlab编程实现各种功能,也可以采用其他语言,但要能在最后验收时实际运行演示。
3.项目设计报告要将原理、结果(包括各步骤的图像)、分析等给出,并附上源代码。
二主要设计思想
二.1前期准备
1.图像归一化至固定大小img=imresize(img,[m,n]);
2.去噪:
对同一幅图像分别添加高斯噪声与椒盐噪声,再分别通过3*3与5*5的中值滤波器。
显示频谱图,分析
3.光照补偿
方法一:
同态滤波采用
方法二:
伽马矫正
二.2人脸肤色区域检测
二.2.1方法一
基于已有文献、方法,采取基于RGB、YCbCr颜色空间的简单阈值肤色识别。
主要颜色分布:
(Cb>77AndCb<127)And(Cr>133AndCr<173)
但误差范围较大,无法应用于背景较复杂的图像。
故另使用方法二
二.2.2方法二
采用简易高斯模型
根据事先建立的肤色模型,计算人脸图像中所有像素点颜色与肤色的可能性大小,即相似度大小,其取值范围为[0,1],相似度计算公式如下:
其中:
为像素点在
空间中的向量。
计算完毕后,对所求得的每个P(Cr,Cb)值进行归一化处理,即将每个P(Cr,Cb)值除以该图像中最大的P(Cr,Cb)值,这样就使得各像素的相似度的值在[0,1]之间,并且使肤色区域亮度更加突出。
该值越大,表示属于肤色的可能性也越大,反之越小。
在完成肤色相似度分割之后,接下来进行二值化。
此设定一个阈值,当该点像素的相似度高于这个阈值则认为该点为肤色像素并置1,反之若低于该阈值则置0。
二.3非人脸区域判别
在对肤色区域进行一系列处理后,得到了一系列的候选连通区域。
由于在背景中可能存在很多和人脸肤色相近或相同的区域被误判为人脸区域,因此需进一步根据一些先验知识对这些侯选区域进行判别优化,剔除那些明显不是人脸的区域。
二.3.1判别规则
1.若目标区域的宽度与高度不在规定阈值范围内,则删除该区域
2.若目标区域的外接矩形高宽之比不在规定的阈值范围内时,则删除该区域。
3.矩形度:
若目标区域面积与外接矩形面积之比不再规定阈值范围内,则删除该区域
二.4脖子区域判别
因脖子与人脸区域的颜色分布近乎一致,无法通过上述方法分离。
认为脖子与下部之间的交界处在水平投影方向上,会出现明显的极小值点。
如Figure2所示。
但因为脸部区域的相对复杂性及区域检测的完整性,会使得理想波形在各个区域点出现诸如毛刺的部分,将极大影响分割效果。
此,采用长度为5一维中值滤波器,消除高频部分,使整体尽可能光滑,不影响分界处的选取。
对于绝大部分图像,均能较好的达到预计的切割目的。
但就实际视觉效果而言,直接采用水平直线切割脖子与脸部区域是不合适的。
通过实际测试发现,下巴的边缘轮廓可以用一个二次函数实现拟合。
原设想通过找出脖子与下巴的分界位置loc,再以这条线为基准,向上搜索,找出2个首个为1的点。
同理再找出另外两个点。
通过拟合4点,实现下巴轮廓的勾勒。
但介于矩阵坐标与笛卡尔坐标之间转换的繁琐与时间,放弃。
故,此采用水平投影方法,再通过长度为5的一维中值滤波器,找出脖子与下巴的交界处,分割
二.5五官识别-积分投影
人脸部五官的眉毛、眼睛、鼻子、嘴巴等基本都是水平方向狭长分布,水平方向的灰度和色度变化大。
基于五官的亮度都较脸部其他部分低,通过水平灰度投影通常会在眉毛、眼睛、鼻子、嘴巴等处会产生局部低点,由此再结合五官分布的先验知识来确定眉毛、眼睛、鼻子、嘴巴的垂直位置,然后再在相应位置附近找出各器官的水平位置。
眼:
找出眼睛大致所在区域,通过水平投影与垂直投影,找出两者的交界点,这两点即可认为是眼球所在坐标。
以眼睛为分割线,将两部分为上下两部分,再分别通过水平投影,找出嘴、鼻、眉等分布位置
三主要实施过程
三.1单人
1.图像收集
2.归一化大小
3.去噪
4.光照补偿
5.肤色检测--见Figure1
6.删除非脸部区域Figure2
7.腐蚀膨胀-删除细小的孤立部分;使区域尽量联合
8.条件判别-删除明显非脸型区域
9.找出眼球部分-采用水平、垂直积分投影,标记交界处--见Figure3
10.框出眼睛部分
11.以眼睛为分界线,将脸分割为两部分。
相同方法,标记出眉、鼻、嘴--见Figure4
Figure1
Figure2
Figure3
Figure4
三.2多人
1.脸部肤色识别—见Figure51行2列
2.连通区域标记
3.腐蚀、膨胀—见Figure52行1列
4.条件判断Figure52行2列
Figure5
四结果分析
四.1肤色检测
四.1.1方法一
基于固定颜色空间区域的肤色识别在程序运行时间上具备较大优势。
并且在检测肤色可能分布区域的能力较高,但往往会将非肤色区域检测出来,甚至可能将衣物与肤色相连,使得之后切割步骤无法很好的实现。
在识别单人(证件照)时,以上影响基本可以忽略。
而在识别较多人时,复杂的背景极大干扰检测。
判决条件不易实现
故认为可以将其作为验证的辅助手段,不可为主方法。
四.1.2方法二
方法二较方法一,在检测准确率上有较大的提高。
但限于肤色样本的缺少,使得此方法对于某些肤色区域无法检测出来。
如Figure6所示,在脸部中心区域无法检测出应属于肤色的部分,甚至会出现本应属于一块的区域,因检测问题,被分割成数块不相连的区域。
给后期的检测带了诸多不便。
对于此问题设想的解决办法主要有以下几种:
1.提高肤色样本数
2.降级肤色相似度的阈值设立
3.采用自适应阈值分割
四.1.3肤色检测阶段总结
方法一
方法二
时间
人脸
误检
人脸区
域检测
时间
人来
误检
人脸区
域检测
单人
0.3105s
较高
高
2.6545s
一般
较高
多人
0.3347s
较高
高
2.6776s
较低
较高
四.2去除非人脸区域
四.2.1单脸
对于绝大部分单脸(尤其是证件照)图像,能较好的分割出脖子区域的。
缺陷是因为图像大小的限制,用以确定分割位置loc的极小值可能会不易分辨,尤其是在通过较大的中值滤波器之后。
如Figure2所示。
导致在某些情况下可能会出现过分割的缺点,即将脸分割为两部分,而非脸、脖子。
四.2.2多脸
因图像大小限制,多脸情况下肉眼无法很好的分辨脖子、眉、眼、鼻等区域,故不分析。
四.3五官分割
四.3.1眼
通过水平投影与垂直投影的交界点,找出眼球所在坐标。
转换为灰度图后,因眼球与脸部的灰度值分布间隔较大,故能很好的检测出眼球的分布。
在所测试的单脸图像中,除却肤色检测错误的图像之外,均能较为准确的找出所在点。
四.3.2鼻、嘴
以现采用算法而言,对于一般的单脸图像,这两个部分能较好的分割出来。
但在遇到某些带有胎记或者是光照补偿不理想等原因,造成波形的变换缓慢,对鼻、嘴位置的判别产生较大的影响。
如Figure7所示。
认为造成此问题的主要原因还在于算法对于波形形状的要求较大(过于理想)。
通过一维中值滤波器之后,嘴巴所在区域的分割点会出现两个极小值点。
导致采点采在相邻位置上。
预想解决方法:
同眼睛。
先找出嘴巴的分割点。
以眼、嘴为分割线,将脸分成三块区域,再在中间区域通过投影等方法找出鼻子的分割点
Figure7
参考文献
[1].俞国红.以SEO技术优化高职院校网站的研究[J].徐州建筑职业技术学院学报,2011.
[2].肖明坤.复杂背景下居于肤色分割的人脸检测[D].江苏:
南京邮电大学,2006.4,12-16
[3].冯红军,刘桂林,高立新等.基于小样本训练集的肤色模型建立方法[J].计算机工程与应用,2003,28:
67-71
[4].赵士伟,卓力,王素玉,等.基于数据挖掘的图像压缩域肤色检测算法[J].电子学报,2010,38(3):
605-610.
[5].黄兴,王小涛,陆丽华.一种快速高效的人脸检测方法[J].计算机工程与应用,2013,49(3):
198-201
参考代码
四.4主程序
%{
矩形度公式是Pr=As/ArAs是连通域S的面积,Ar是包围该连通域的最小矩形面积
长宽比公式是Pwl=Wr/LrWr是包围连通域的最小矩形的宽度,Lr是包围连通域的最小矩形的长度、
将此作为单人脸识别模块
单人执行任务较多,故分开
%}
%%前期工作
clearvars-excepthandles;
clc;
delete('resize.jpg');
[fname,pathn]=uigetfile('.jpg');
addpath(pathn);
img=imread(fname);
signal=get(handles.h1,'value');
ifsignal==1
img=jiaozheng(img);
end
img=imresize(img,[256,256]);
figure('numbertitle','off',...
'position',[0,768-520,560,420],...
'name','初步');
subplot(121);
imshow(img);
title('归一化');
img=LightCompensate(img);
subplot(122);
imshow(img);
title('光照补偿');
imwrite(img,'resize.jpg');
%%找脸,腐蚀膨胀
tic
bw=facedet(img);
[bw,loc]=del_neck(bw);
im2=imdil_rode(bw);
%%判断
img=bwlabel(im2,8);
stats=judge(img);%判断
%stats=regionprops(img,'BoundingBox');
%n=length(stats);
%%脸型的多边形截取。
弃
%{
fori=1:
n
rectangle('Position',stats(i).BoundingBox,'EdgeColor','g');
end
%}
%多边形截取
%{
I=imread('resize.jpg');
r=I(:
:
1);
g=I(:
:
2);
b=I(:
:
3);
r=double(r).*double(im2);
g=double(g).*double(im2);
b=double(b).*double(im2);
i1=cat(3,r,g,b);
figure('numbertitle','off',...
'name','output');
imshow(mat2gray(i1));
%}
%%截取图像准备
n=length(stats);
img_resize=imread('resize.jpg');
%%
%figure('numbertitle','off',...
%'name','过程');
%subplot(2,1,1);
%temp=imcrop(img_resize,stats.BoundingBox);
%imshow(temp);
%title('裁剪得');
%clearvars-excepttemp
%img_gray=rgb2gray(temp);
%im2=imfill(im2,'holes');
%subplot(2,1,2);
%imshow(im2);
%title('脸部二值化图像');
%I=imread('resize.jpg');
%%调用-减去非脸型不部分
temp=cut_rgb(img_resize,im2);
%%输出眼睛
bboxes=eyepair(temp);
eye=temp(bboxes
(2):
bboxes
(2)+bboxes(4),bboxes
(1):
bboxes
(1)+bboxes(3));
[loc_x,loc_y1,loc_y2,bboxes]=showeyes(eye,bboxes);
%bboxes=shownose(loc_y1,loc_y2,bboxes);
%bboxes=shownmouth(loc_y1,loc_y2,bboxes)
bboxes=shownother(bboxes,temp,loc,loc_x,loc_y1,loc_y2);
bboxes=showbrow(bboxes);
%IFaces=insertObjectAnnotation(temp,'rectangle',bboxes,'EyePair');
%figure,imshow(IFaces),title('Detectedfaces');
%%最终输出
IFaces=insertShape(temp,'rectangle',bboxes(1,:
));
%IFaces=insertObjectAnnotation(temp,'rectangle',bboxes(1,:
),'Eye_left');
%IFaces=insertObjectAnnotation(IFaces,'rectangle',bboxes(2,:
),'Eye_right');
IFaces=insertShape(IFaces,'rectangle',bboxes(2,:
));
IFaces=insertShape(IFaces,'rectangle',bboxes(3,:
));
IFaces=insertShape(IFaces,'rectangle',bboxes(4,:
));
IFaces=insertObjectAnnotation(IFaces,'rectangle',bboxes(5,:
),'Brow_Left');
%IFaces=insertObjectAnnotation(IFaces,'rectangle',bboxes(6,:
),'Brow_Right');
%IFaces=insertShape(IFaces,'rectangle',bboxes(5,:
));
IFaces=insertShape(IFaces,'rectangle',bboxes(6,:
));
%IFaces=insertObjectAnnotation(IFaces,'rectangle',bboxes(3,:
),'Nose');
figure('numbertitle','off',...
'name','最终');
imshow(IFaces),title('Detectedfaces');
holdon
plot(bboxes(1,1)+loc_y1,bboxes(1,2)+loc_x,'r+');
plot(bboxes(1,1)+loc_y2,bboxes(1,2)+loc_x,'r+');
%%记时
time=num2str(toc);
msgbox(['时间',time,'s'],'运行时间');
四.5同态滤波
%同态滤波
%%
functionJ=lvbo(img)
%img=imread('camera.jpg');
%img=rgb2gray(img);
%figure,subplot(1,2,1),imshow(img),title('原图');
%img=im2double(img);
img=double(img);
[M,N]=size(img);
img=img+0.00001;
%lnimg=log2(img);%取对数
lnimg=log(img);%取对数
Fimg=fft2(lnimg);%傅里叶变换
%P=fftshift(Fimg);%将频域原点移到图像中心;
%subplot(2,2,2),imshow(uint8(abs(P))),title('滤波前的频谱图像')
x0=floor(M/2);
y0=floor(N/2);
Do=10;%截止频率
c=1.50;
%%参数设置。
。
。
。
。
惨啊啊啊啊啊
Hh=1.1;Hl=0.6;
%%
foru=1:
M
forv=1:
N
D(u,v)=sqrt((u-x0)^2+(v-y0)^2);%点(i,j)到频率平面原点的距离
H(u,v)=(Hh-Hl)*(1-exp(-c*D(u,v)^2/(Do^2)))+Hl;%同态滤波器函数
end
end
hImg=Fimg.*H(u,v);%Q=fftshift(hImg);
%subplot(2,2,4),imshow(uint8(abs(Q)),[]),title('滤波后的频谱图像')
gImg=ifft2(hImg);%反傅立叶变换
Y=exp(gImg);%取指数
%J=im2uint8(Y);
J=uint8(Y);
%subplot(1,2,2),imshow(J,[]),title('同态滤波处理后的图像')
四.6肤色检测-简易高斯模型
%{
找脸区域
输入图像矩阵
输出为二值图像bw
%}
functionbw=facedet(II)
%clear,clc;
%[fname,pathn]=uigetfile('.jpg');
%addpath(pathn);
%img=imread(fname);
%resize,240*320;
%模糊化处理,均值滤波
%I=iblur(II);
I=II;
I=double(I);
loaddatac;
loaddatam;
[cb,cr]=getcbcr(I);
%初参数值
h=size(I,1);
w=size(I,2);
skinsim=zeros(h,w);
%inc=inv(c);
fori=1:
h
forj=1:
w
x=[cb(i,j)cr(i,j)]';
skinsim(i,j)=exp(-0.5*(x-m)'/c*(x-m));%skinsim(i,j)=exp(-0.5*(x-m)'*inc*(x-m));
end
end
maxeskin=max(skinsim(:
));
skinsim=skinsim/maxeskin;
skinsim=skinsim*255;
%figure,imshow(skinmap),title('skinmap');
bw=im2bw(skinsim,0.22);
%figure('numbertitle','off',...
%'name','检测区域-二值');
%subplot(122);
figure('position',[280,768-520,560,420]);
imshow(bw);
title('检测区域-二值');
四.7切割非脸区域
%脖子区域寻找
%输入变量bw,output_single.m中的bw
function[img,loc]=del_neck(bw)
bw=medfilt2(bw,[11,11]);
img=imfill(bw,'holes');
%figure('numbertitle','off',...
%'name','步骤2-切割');
%imshow(img);
sum_y=sum(img,2);
sum_y=medfilt1(sum_y,9);
n=length(sum_y);
y=1:
n;
figure('numbertitle','off',...
'name','步骤2-去多余',...
'position',[560,768-520,560,420]);
subplot(122);
plot(y,sum_y);
title('水平投影曲线');
holdon;
[a,b]=findpeaks(sum_y);%a-pksb-loc
%[~,temp2]=min(a);
%pks=a(temp2);
%loc=b(temp2);
[~,temp1]=max(a);
[~,loc]=min(sum_y(b(temp1):
b(temp1+1)));
loc=loc+b(temp1);
plot(loc,sum_y(loc),'r+');
img(loc:
n,:
)=0;
subplot(121);
%figure('numbertitle','off',...
%'name','步骤2-切割');
imshow(img,[]);
title('切割后二值图');
四.8条件判断
%条件判断
%输入的是二值化图像,输出也是
functionbw=judge(img)
%img=im2;
stats=regionprops(img,'BoundingBox');
%temptemp=stats;
temp=regionprops(img,'Area');
n=length(stats);
%计算长宽比;[x,y,width,height]
fori=n:
-1:
1
%stats(i).Area=temp(i).Area;
temp1=stats(i).BoundingBox(1,4)/stats(i).BoundingBox(1,3);
iftemp1<0.8||temp1>2.1
stats(i)=[];%删除行
temp(i)=[];
end
end
%矩形度公式是Pr=As/ArAs是连通域S的面积,Ar是包围该连通域的最小矩形面积
n=length(stats);
fori=n:
-1:
1
if(temp(i).Area/(stats(i).BoundingBox(1,4)*stats(i).BoundingBox(1,3))<0.5)%...
%||temp(i).Area<200)
stats(i)=[];
temp(i)=[];
end
end
bw=stats;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)