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

本文介绍使用VC编程实现位图灰度化的三种方法,包括RGB平均值法、RGB中间值法及LAB色彩空间转换法,并提供源代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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三色分量的平均值;

VC对位图进行灰度化处理

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

VC对位图进行灰度化处理

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

VC对位图进行灰度化处理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值