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种不同计算灰度值算法实际的灰度化效果,读者可以根据需要选择合适的方案。