数字图像处理人脸检测课程设计报告Word格式.docx
- 文档编号:18710500
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:47
- 大小:28.42KB
数字图像处理人脸检测课程设计报告Word格式.docx
《数字图像处理人脸检测课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《数字图像处理人脸检测课程设计报告Word格式.docx(47页珍藏版)》请在冰豆网上搜索。
色度匹配:
色度匹配就是根据已知条件设定颜色的上下限来对目标进行提取,例如此次人
脸检测系统设计对人眼和嘴巴的提取。
YCC空间中的色度操作就是对Cr、Cb分量的操作。
对人眼提取时的Cb、Cr分量设定限制分别为(115,120),(112,116),对嘴巴提取的Cr分量设定为Cr=138或148,Cb分量限制在[115,125]之间。
亮度匹配:
是根据图像像素的亮度值来确定,可以使用YCC空间中的亮度值Y,也可以采用其他方法。
本系统是在RGB色彩空间中直接计算亮度值来进行匹配。
眼睛亮度的匹配值是在[100,125]之间。
区域定位:
主要通过递归,计算连续目标像素点个数是否符合条件限制的面积提取法来确定是否为正确目标,返回坐标值来确定区域位置,再通过像素点的叠加及坐标求平均值来计算目标中心位置。
去离散点:
图像去噪处理后,也是通过递归函数,获取符合条件连续的像素点个数,若没有达到一定限制要求,则视为非目标值,在最终确定区域时,去掉该区域或该点的值。
四、实验步骤
1、图像读取、均衡化并进行光照补偿处理。
2、肤色分割和人脸色彩建模以及去噪处理,确定人脸大致区域。
3、人眼的匹配与定位。
4、嘴巴的定位。
5、根据定位坐标,勾勒出检测的人脸。
五、实验结果
图像读入,光线补偿后效果
皮肤颜色建模:
膨胀:
腐蚀:
去掉人脸假区域:
再次膨胀:
再次腐蚀及确定人脸区域:
Cr匹配:
Cb匹配:
眼睛色度匹配:
眼睛亮度匹配:
眼睛双重匹配:
去掉假眼睛区域:
勾勒人脸区域:
六、实验心得
通过本次课程设计,使我进一步掌握了数字图像处理的基本知识与对图像处理的技能以及实现方法。
此次系统设计用到的最基础的就是对二值图像的去噪处理,即不断调用膨胀、腐蚀的闭运算,另外还有图像的均衡化。
七、主要代码
//图像均衡化
voidCFaceView:
:
OnUnitary()
{
hDIBTemp=gDib.CopyHandle(hDIB);
//获取复制图片信息
gDib.Normalization(hDIB);
GlobalUnlock(hDIB);
Invalidate();
}
//均衡化
BOOLDIB:
Normalization(HANDLEhDIB)
if(!
hDIB)
returnFALSE;
LPBITMAPINFOHEADERlpbi;
//pImg
intwidth,height;
LPBYTElpData;
//data
WORDwBytesPerLine;
lpbi=(LPBITMAPINFOHEADER)GlobalLock(hDIB);
width=lpbi->
biWidth;
//得到图片宽和高
height=lpbi->
biHeight;
lpData=this->
FindDIBBits(hDIB);
//得到图片数据区
wBytesPerLine=this->
BytePerLine(hDIB);
//得到图片每行的象素所占字节个数(step)
inthist[256];
floatpr[256],sk[256];
inti,j;
for(i=0;
i<
256;
i++)
{
hist[i]=0;
pr[i]=0;
sk[i]=0;
}
intr,g,b,count=0;
longlOffset;
for(i=0;
height;
for(j=0;
j<
width;
j++)
{
//得到象素数据的偏移
lOffset=this->
PixelOffset(i,j,wBytesPerLine);
//得到rgb值
b=*(lpData+lOffset++);
g=*(lpData+lOffset++);
r=*(lpData+lOffset++);
//计算灰度值
intgray=(r*299+g*587+b*114)/1000;
hist[gray]++;
}
count+=hist[i];
pr[i]=hist[i]/(float)count;
sk[0]=255*pr[0];
for(i=1;
sk[i]=sk[i-1]+pr[i]*255;
/*
*(lpData+lOffset)=sk[*(lpData+lOffset)];
*(lpData+lOffset+1)=sk[*(lpData+lOffset+1)];
*(lpData+lOffset+2)=sk[*(lpData+lOffset+2)];
*/
returnTRUE;
//光线补偿
OnLightingconpensate()
{
gDib.LightingCompensate(hDIB);
//光照补偿子函数
LightingCompensate(HANDLEhDIB)
constfloatthresholdco=0.05;
//比例系数(只提取亮度最大的5%像素)
constintthresholdnum=100;
//象素个数的临界常数
inthistogram[256];
//灰度级数组
for(inti=0;
histogram[i]=0;
//对于过于小的图片的判断
if(width*height*thresholdco<
thresholdnum)
returnfalse;
intcolorr,colorg,colorb;
//*****统计整个图片的灰度值
for(intj=0;
colorb=*(lpData+lOffset++);
colorg=*(lpData+lOffset++);
colorr=*(lpData+lOffset++);
intgray=(colorr*299+colorg*587+colorb*114)/1000;
histogram[gray]++;
intcalnum=0;
inttotal=width*height;
intnum;
//设置提取次数(从0计数),从灰度值255依次向下提取
//下面的循环得到满足系数thresholdco的临界灰度级
for(i=0;
{
if((float)calnum<
thresholdco*total)
{
calnum+=histogram[255-i];
//统计满足亮度灰度值的个数
num=i;
//记录提取次数
}
else
break;
intaveragegray=0;
calnum=0;
//得到满足条件的象素总的灰度值
for(i=255;
i>
=255-num;
i--)//255-num表示能提取到的亮度达到5%的灰度值
averagegray+=histogram[i]*i;
//得总的灰度值
calnum+=histogram[i];
//得总的满足条件像素点个数
averagegray/=calnum;
floatco=255.0/(float)averagegray;
//得到光线补偿的系数
//下面的循环对图象进行光线补偿
for(intj=0;
{
lOffset=this->
colorb=*(lpData+lOffset);
colorb*=co;
if(colorb>
255)
colorb=255;
*(lpData+lOffset)=colorb;
colorb=*(lpData+lOffset+1);
*(lpData+lOffset+1)=colorb;
colorb=*(lpData+lOffset+2);
*(lpData+lOffset+2)=colorb;
returnTRUE;
//皮肤建模
OnSkintone()
lpYcc=newBYTE[gwBytesPerLine*gheight];
//申请内存,提供新的data值
gDib.RgbtoYcc(hDIB,lpYcc);
//RGB到YCC色彩空间的转换
gDib.YccTransform(lpYcc,gwBytesPerLine,gheight,gwidth);
//YCC空间的非线性转换,消除色度对亮度的依赖
gDib.faceear(lpYcc,gwBytesPerLine,gheight,gwidth,flag);
//YCC空间的建模
LPBYTElpData=(LPBYTE)GlobalLock(hDIB)+sizeof(BITMAPINFOHEADER);
for(inti=0;
i<
gheight;
i++)
for(intj=0;
j<
gwidth;
j++)
longlOffset=gDib.PixelOffset(i,j,gwBytesPerLine);
if(flag[i][j]==true)//肤色标记为白色
*(lpData+lOffset++)=255;
*(lpData+lOffset++)=0;
}
GlobalUnlock(hDIB);
Invalidate();
//RGB到YCC的空间色彩转换
voidDIB:
RgbtoYcc(HANDLEhDIB,LPBYTElpYcc)
//pImg
//step
//data
//得到图象的基本信息
lpData=FindDIBBits(hDIB);
wBytesPerLine=BytePerLine(hDIB);
//下面的循环实现从rgb到ycc的转化
for(inti=0;
lOffset=PixelOffset(i,j,wBytesPerLine);
//得到rgb数值
intb=*(lpData+lOffset);
intg=*(lpData+lOffset+1);
intr=*(lpData+lOffset+2);
//计算得到y,cr,cb的数值
intY=(257*r+504*g+98*b)/1000+16;
intCr=(439*r-368*g-71*b)/1000+128;
intCb=(-148*r-291*g+439*b)/1000+128;
//保存计算得到的数值
*(lpYcc+lOffset++)=Y;
*(lpYcc+lOffset++)=Cr;
*(lpYcc+lOffset++)=Cb;
//YCC空间的非线性变换的中间量定义
intDIB:
_Cb(intY)
intavrCb;
if(Y<
Kl)//如果亮度很小的情况
avrCb=108+((Kl-Y)*10)/(Kl-Ymin);
elseif(Y>
Kh)//亮度很大的情况
avrCb=108+((Y-Kh)*10)/(Ymax-Kh);
else
avrCb=-1;
returnavrCb;
_Cr(intY)
intavrCr;
Kl)
avrCr=154-((Kl-Y)*10)/(Kl-Ymin);
Kh)
avrCr=154-((Y-Kh)*22)/(Ymax-Kh);
else
avrCr=-1;
returnavrCr;
_WCr(intY)
intWCr;
WCr=WLcr+((Y-Ymin)*(Wcr-WLcr))/(Kl-Ymin);
WCr=WHcr+((Ymax-Y)*(Wcr-WHcr))/(Ymax-Kh);
elseWCr=-1;
returnWCr;
_WCb(intY)
intWCb;
WCb=WLcb+((Y-Ymin)*(Wcb-WLcb))/(Kl-Ymin);
WCb=WHcb+((Ymax-Y)*(Wcb-WHcb))/(Ymax-Kh);
elseWCb=-1;
returnWCb;
//YCC空间的非线性变换
YccTransform(LPBYTElpYcc,WORDwBytesPerLine,intheight,intwidth)
intY;
doubleCr,Cb;
//下面的循环实现ycc色彩空间的非线性转换
lOffset=PixelOffset(i,j,wBytesPerLine);
Y=*(lpYcc+lOffset);
Cr=*(lpYcc+lOffset+1);
Cb=*(lpYcc+lOffset+2);
//如果y数值在两个临界值之间,保持不变
if(Y>
=Kl&
&
Y<
=Kh)
continue;
//调用非线性转换函数调整Cr,Cb的数值并保存
Cr=(Cr-_Cr(Y))*(Wcr/_WCr(Y))+_Cr(Kh);
Cb=(Cb-_Cb(Y))*(Wcb/_WCb(Y))+_Cb(Kh);
*(lpYcc+lOffset+1)=Cr;
*(lpYcc+lOffset+2)=Cb;
//调用人脸建模的主函数
faceear(LPBYTElpYcc,WORDwBytesPerLine,intheight,intwidth,boolflag[ImgRange][ImgRange])
//初始化标志位
ImgRange;
flag[i][j]=false;
intCr;
intCb;
for(i=0;
if(FaceModeling(Cr,Cb))//人脸皮肤颜色建模
{
flag[i][j]=true;
//人脸区域标志位
}
//人脸色彩建模的实现函数
FaceModeling(intCr,intCb)
{
constfloatCx=114.38;
//Cx的系数常量
constfloatCy=160.02;
//Cy的系数常量
constfloattheta=2.53;
//角度常量
constfloatecx=1.60;
//x轴线和y轴线的两个常量
constfloatecy=2.41;
constfloata=25.39;
//长短轴设置
constfloatb=14.03;
constfloatjudge=0.5;
//相似度常量
floatx=cos(theta)*(Cb-Cx)+sin(theta)*(Cr-Cy);
//计算得到x轴数值
floaty=-sin(theta)*(Cb-Cx)+cos(theta)*(Cr-Cy);
//y轴数值
floattemp=pow(x-ecx,2)/pow(a,2)+pow(y-ecy,2)/pow(b,2);
//计算离心率
//如果满足要求返回真,否则假
if(fabs(temp-1.0)<
judge)
returnTRUE;
//膨胀
OnDilationFirst()
gDib.Dilation(hDIB);
//四邻域的膨胀
Dilation(HANDLEhDIB)
LPBITMAPINFOHEADERlpb
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 检测 课程设计 报告