2012-03-16 22:51:31|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 图形/图像, MFC|来源:唯设编程网
VC编程实现位图像素操作(一)介绍了位图处理类CImageUtility的初始化方法,包括资源申请,资源释放,以及将HBITMAP位图加载到CBitmap类型的成员指针变量中,位图处理类CImageUtility还实现了其他位图处理方法:位图灰度化、位图二值化、位图反向、自动色阶、切除空白边、位图拷贝。
本文将着重讨论位图的灰度化方法,比较三种获取灰度值算法之间的差异,并给出实际的VC源代码,最后展示出实际的灰度化效果,读者可以根据实际需要选择合适的方案。
示例:
// 图像灰度化处理
// 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种不同计算灰度值算法实际的灰度化效果,读者可以根据需要选择合适的方案。