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] ... 下一页 >>