1、光线补偿
(1)算法思想:
光线补偿的想法的提出主要是考虑到肤色等色彩信息经常受到光源颜色、图像采集设备的色彩偏差等因素的影响,而在整体上偏离本质色彩而向某一方向移动,即我们通常所说的色彩偏冷、偏暖、照片偏黄、便蓝等等。这种现象在艺术照片中更为常见。所以Anil K.Jain等提出,为了抵消这种整个图像中存在着的色彩偏差,我们将整个图像中所有像素亮度(是经过了非线形r-校正后的亮度)从高到低进行排列,取前5%的像素,如果这些像素的数目足够多(例如,大于100),我们就将它们的亮度作为“参考白”(Reference White),也即将它们的色彩的R、G、B分量值都调整为255。整幅图像的其他像素点的色彩值也都按这一调整尺度进行交换。 (2) 具体实现光线补偿功能:
明白了光线补偿这功能的算法及思想,就可以编码实现其功能了,实现过程如下: ①、 编辑菜单IDR_MAINFRAM,先在其中添加一菜单项,将其命名为“预处理”,并在其属性栏中将其设为“弹出”菜单,点击预处理该菜单项将会弹出一个新的子菜单,此时把该子菜单命名为“光线补偿”,并把其ReadyLightingconpensate()
hDIBTemp = gDib.CopyHandle(hDIB); gDib.LightingCompensate(hDIB); GlobalUnlock(hDIB); Invalidate();
光线补偿功能实质上是用上段代码中的LightingCompensate()函数来进行实现。函数LightingCompensate()是类DIB的一个成员函数。其核心代码如下所述:
ID设为
ID_READY_LIGHTINGCONPENSATE,对应文件FaceDetectView.Cpp中的函数
实
现
,
并
在
void
CFaceDetectView::
OnReadyLightingconpensate()中添加如下代码:
//下面的循环对图像进行光线补偿 for(i =0;i for(int j=0;j //获取像素偏移 lOffset = this->PixelOffset(i,j,wBytesPerLine); //得到蓝色分量 16 } *(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 原图 17 图4-2 光线补偿效果图 2、 图像灰度化 (1)算法思想 ① 彩色转换成灰度 将彩色图像转化为灰阶图像常采用如下的经验式: gray=0.39×R+0.50×G+0.11×B(式3) 其中,gray为灰度值,R、G、B分别为红色、绿色和蓝色分量值。 ② 灰度比例变换 灰度比例变换是把原像素的灰度乘以一个缩放因子,并最后截至[0,255]。 ③ 灰度线性变换 当图像由于成像时曝光不足或曝光过度,会产生对比度不足的弊病,从而使图像中的细节分辨不清。将图像灰度进行线性扩展,常能显著地改善图像的外观。灰度线性变换的计算式为: g = (d?c)(f?a)?c,f?[a,b] b?a (式4) f,其他 式中,f是原像素的灰度,g为变换后的灰度。该变换把属于[a,b]的灰度级变换至灰度区间[c,d],而没有在[a,b]区间的原像素灰度将保持不变。这里a,b,c,d,f,g均为[0,255]之间的整数值。可见,a被映射为c,b被映射为d。 18 ④ 灰度线性截断 灰度线性截断的思想是:如果原像素的灰度小于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 图像灰度化效果图 19 3、高斯平滑 (1) 算法思想 在介绍高斯平滑前,先介绍模板操作。模板操作是数字图像处理中经常用到的一种运算方法,图像的平滑、锐化以及细化、边缘检测都要用到模板操作。例如:有一种常见的平滑算法是将原图中一个像素的灰度值和它周围邻近八个像素的灰度值相加,然后求得的平均值(除以9)作为新图中该像素的灰度值,用如下方法来表示该操作: 1 1 1 1/9 1 1· 1 1 1 1 上式类似于矩阵,我们通常称之为模板。中间的黑点表示该元素中心元素,即该个元素是要进行处理的元素。如果模板是: 1· 1 1 1/9 1 1 1 1 1 1 则该操作应该描述为:将原图中一个像素的灰度值和它右下邻近的8个像素的灰度值相加,然后将求得的平均值9(除以9)作为新图中该像素的灰度值。如果模板为 2. , 1 则表示将自身灰度值的2倍加下边的元素灰度值作为新值,而 2 则表示将自身 1. 灰度值加上边元素灰度值的2倍作为新灰度值。通常模板不允许移出边界,所以处理后的图像会比原图小,例如:当模板是 1. 0 原图灰度值矩阵是 1 1 1 1 1 0 2 2 2 2 2 2 3 3 3 3 3 时,经过模板操作后的图像为 5 5 5 5 - 8 8 8 8 - 11 11 11 11 - - - - - - 20 4 4 4 4 4