C++人脸识别系统(论文+算法+英文文献翻译+源代码) 第10页

C++人脸识别系统(论文+算法+英文文献翻译+源代码) 第10页
1、光线补偿
(1)算法思想:
光线补偿的想法的提出主要是考虑到肤色等色彩信息经常受到光源颜色、图像采集设备的色彩偏差等因素的影响,而在整体上偏离本质色彩而向某一方向移动,即我们通常所说的色彩偏冷、偏暖、照片偏黄、便蓝等等。这种现象在艺术照片中更为常见。所以Anil K.Jain等提出,为了抵消这种整个图像中存在着的色彩偏差,我们将整个图像中所有像素亮度(是经过了非线形r-校正后的亮度)从高到低进行排列,取前5%的像素,如果这些像素的数目足够多(例如,大于100),我们就将它们的亮度作为“参考白”(Reference White),也即将它们的色彩的R、G、B分量值都调整为255。整幅图像的其他像素点的色彩值也都按这一调整尺度进行交换。
(2) 具体实现光线补偿功能:
      明白了光线补偿这功能的算法及思想,就可以编码实现其功能了,实现过程如下:
①、  编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为“预处理”,并在其属性栏中将其设为“弹出”菜单,点击预处理该菜单项将会弹出一个新的子菜单,此时把该子菜单命名为“光线补偿”,并把其ID设为ID_READY_LIGHTINGCONPENSATE,对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现,并在void  CFaceDetectView:: OnReadyLightingconpensate()中添加如下代码:

hDIBTemp = gDib.CopyHandle(hDIB);
gDib.LightingCompensate(hDIB);
GlobalUnlock(hDIB);
Invalidate();

光线补偿功能实质上是用上段代码中的LightingCompensate()函数来进行实现。函数LightingCompensate()是类DIB的一个成员函数。其核心代码如下所述:  
  //下面的循环对图像进行光线补偿
  for(i =0;i<height;i++)
   for(int j=0;j<width;j++)
   { 
    //获取像素偏移
    lOffset = this->PixelOffset(i,j,wBytesPerLine);
    www.751com.cn
    if(colorb >255)
     colorb = 255;
    *(lpData+lOffset+1) = colorb;

    //红色分量
    colorb = *(lpData+lOffset+2);
    colorb *=co;
    if(colorb >255)
     colorb = 255;
    *(lpData+lOffset+2) = colorb;

   }

② 光线补偿的效果图如下所示 :
图  4-1 原图
        图4-2  光线补偿效果图
2、  图像灰度化
(1)算法思想
①   彩色转换成灰度
     将彩色图像转化为灰阶图像常采用如下的经验式:
       gray=0.39×R+0.50×G+0.11×B(式3)
其中,gray为灰度值,R、G、B分别为红色、绿色和蓝色分量值。
②   灰度比例变换
灰度比例变换是把原像素的灰度乘以一个缩放因子,并最后截至[0,255]。
③   灰度线性变换
当图像由于成像时曝光不足或曝光过度,会产生对比度不足的弊病,从而使图像中的细节分辨不清。将图像灰度进行线性扩展,常能显著地改善图像的外观。灰度线性变换的计算式为:                                (式4)
f,其他
式中,f是原像素的灰度,g为变换后的灰度。该变换把属于[a,b]的灰度级变换至灰度区间[c,d],而没有在[a,b]区间的原像素灰度将保持不变。这里a,b,c,d,f,g均为[0,255]之间的整数值。可见,a被映射为c,b被映射为d。
④ 灰度线性截断
    灰度线性截断的思想是:如果原像素的灰度小于a,则该像素的灰度等于c;如果原像素的灰度大于b,则该像素的灰度等于d。
(2)具体实现灰度化功能
在明白了灰度化的原理之后,就可进行编码来实现该功能。
①  编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为”图像灰度化”,并将其ID号设为ID_READY_SCALE, 对应文件FaceDetectView.Cpp中的函数ReadyLightingconpensate()实现.
②  现该模块的核心代码如下:
获取蓝色分量
          ColorB=*(lpData + lOffset);
获取绿色分量
     ColorG=*(lpData + lOffset+1);
获取红色分量
     ColorR=*(lpData + lOffset+2);
计算灰度值
     gray = (ColorG*50+ColorR*39+ColorB*11)/100; 
显示灰度图像
     *(lpData + lOffset)=gray ;
     *(lpData + lOffset+1)=gray ;
     *(lpData + lOffset+2)=gray ;
其中lpData是图片数据区,lOffset是图片像素的偏移,gray 是图像的灰度值
③   图像灰度化效果图:
图 4-3 图像灰度化效果图

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有