VC编程使用3种方案实现位图图像灰度化
VC编程实现位图像素操作(一)介绍了位图处理类CImageUtility的初始化方法,包括资源申请,资源释放,以及将HBITMAP位图加载到CBitmap类型的成员指针变量中,位图处理类CImageUtility还实现了其他位图处理方法:位图灰度化、位图二值化、位图反向、自动色阶、切除空白边、位图拷贝。
本文将着重讨论位图的灰度化方法,比较三种获取灰度值算法之间的差异,并给出实际的VC源代码,最后展示出实际的灰度化效果,读者可以根据实际需要选择合适的方案。
1. 位图灰度化:
示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
// 图像灰度化处理
// gType-灰度计算方式
void
CImageUtility::ImageGrayProcess(GrayType gType)
{
// 目前只处理24位以上的位图
if
(nPixBytes <3)
return
;
//定义RGB存储空间
int
nRGB[3];
//定义LAB储存空间
double
fLAB[3];
// 执行灰度化计算
for
(
long
nHeight=0; nHeight<bmSrcInfo.bmHeight; nHeight++)
{
for
(
long
nWidth=0; nWidth<bmSrcInfo.bmWidth; nWidth++)
{
//获取对应像素点得颜色
getPixelColor(nRGB,nHeight,nWidth);
//根据不同的方案设置灰度值
switch
(gType){
case
AVERAGE:
//平均值
{
BYTE
Gray = (
BYTE
)((nRGB[0]+nRGB[1]+nRGB[2])/ nPixBytes);
//均值
nRGB[0]=Gray;
nRGB[1]=Gray;
nRGB[2]=Gray;
break
;
}
case
MIDVALUE:
//中间值
{
BYTE
maxValue=max(max(nRGB[0],nRGB[1]),nRGB[2]);
BYTE
minValue=min(min(nRGB[0],nRGB[1]),nRGB[2]);
BYTE
Gray = (
BYTE
)((maxValue-minValue)/2);
//中值
nRGB[0]=Gray;
nRGB[1]=Gray;
nRGB[2]=Gray;
break
;
}
case
L_VALUE:
//LAB中的亮度分量
{
CColorUtility::_cie_rgb2lab(nRGB,fLAB);
fLAB[1]=0.0;
fLAB[2]=0.0;
CColorUtility::_cie_lab2rgb(fLAB,nRGB);
break
;
}
}
//设置像素点颜色
setPixelColor(nRGB,nHeight,nWidth);
}
}
bmpSrc->SetBitmapBits(dwBmByteSize, pBmBits);
}
|
获取位图指定像素点的灰度值主要有三种方案:
a.将灰度值设置成RGB三色分量的平均值;

b.将灰度值设置成RGB三色分量最大值与最小值的平均值;

c.首先将RGB色彩空间转换成LAB色彩空间,将灰度值设置成LAB颜色值的L(亮度)分量:

上面列出了3种不同计算灰度值算法实际的灰度化效果,读者可以根据需要选择合适的方案。