算法思想:
光线补偿的想法的提出主要是考虑到肤色等色彩信息经常受到光源颜色、图像采集设备的色彩偏差等因素的影响,而在整体上偏离本质色彩而向某一方向移动,即我们通常所说的色彩偏冷、偏暖、照片偏黄、便蓝等等。这种现象在艺术照片中更为常见。所以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);
//得到蓝色分量
*(lpData+lOffset) = colorb;
//绿色分量
colorb = *(lpData+lOffset+1);
colorb *=co;
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 光线补偿效果图