VC编程使用3种方案实现位图图像灰度化

2012-03-16 22:51:31|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 图形/图像, MFC|来源:唯设编程网

VC编程实现位图像素操作(一)介绍了位图处理类CImageUtility的初始化方法,包括资源申请,资源释放,以及将HBITMAP位图加载到CBitmap类型的成员指针变量中,位图处理类CImageUtility还实现了其他位图处理方法:位图灰度化、位图二值化、位图反向、自动色阶、切除空白边、位图拷贝。

本文将着重讨论位图的灰度化方法,比较三种获取灰度值算法之间的差异,并给出实际的VC源代码,最后展示出实际的灰度化效果,读者可以根据实际需要选择合适的方案。

1. 位图灰度化:

示例:

// 图像灰度化处理
// 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三色分量的平均值;

VC对位图进行灰度化处理

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

VC对位图进行灰度化处理

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

VC对位图进行灰度化处理

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

发表评论0条 】
网友评论(共?条评论)..
VC编程使用3种方案实现位图图像灰度化