一、基础对于彩色转灰度,有一个很著名的心理学公式:Gray=R*0.299+G*0.587+B*0.114二、整数算法而实际应用时,希望避免低速的浮点运算,所以需要整数算法。注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:Gray=(R*299+G*587+B*114+500)/1000RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数除法,所以需要加上500来实现四舍五入。就是由于该算法需要32位运算,所以该公式的另一个变种很流行:Gray=(R*30+G*59+B*11+50)/100但是,虽说上一个公式是32位整数运算,但是根据80x86体系的整数乘除指令的特点,是可以用16位整数乘除指令来运算的。而且现在32位早普及了(AMD64都出来了),所以推荐使用上一个公式。三、整数移位算法上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。移位比除法快多了,所以可以将系数缩放成2的整数幂。习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:0.299*65536=19595.264≈195950.587*65536+(0.264)=38469.632+0.264=38469.896≈384690.114*65536+(0.896)=7471.104+0.896=7472可能很多人看见了,我所使用的舍入方式不是四舍五入。四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法:写成表达式是:Gray=(R*19595+G*38469+B*7472)162至20位精度的系数:Gray=(R*1+G*2+B*1)2Gray=(R*2+G*5+B*1)3Gray=(R*4+G*10+B*2)4Gray=(R*9+G*19+B*4)5Gray=(R*19+G*37+B*8)6Gray=(R*38+G*75+B*15)7Gray=(R*76+G*150+B*30)8Gray=(R*153+G*300+B*59)9Gray=(R*306+G*601+B*117)10Gray=(R*612+G*1202+B*234)11Gray=(R*1224+G*2405+B*467)12Gray=(R*2449+G*4809+B*934)13Gray=(R*4898+G*9618+B*1868)14Gray=(R*9797+G*19235+B*3736)15Gray=(R*19595+G*38469+B*7472)16Gray=(R*39190+G*76939+B*14943)17Gray=(R*78381+G*153878+B*29885)18Gray=(R*156762+G*307757+B*59769)19Gray=(R*313524+G*615514+B*119538)20仔细观察上面的表格,这些精度实际上是一样的:3与4、7与8、10与11、13与14、19与20所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:Gray=(R*38+G*75+B*15)7其实最有意思的还是那个2位精度的,完全可以移位优化:Gray=(R+(WORD)G1+B)2========================在计算机中使用最多的RGB彩色空间,分别对应红、绿、蓝三种颜色;通过调配三个分量的比例来组成各种颜色。一般可以使用1、2、4、8、16、24、32位来存储这三颜色,不过现在一个分量最大是用8位来表示,最大值是255,对于32位的颜色,高8位是用来表示通明度的。彩色图一般指16位以上的图。灰度图有一个特殊之处就是组成颜色的三个分量相等;而一般灰度图是8位以下。在彩色电视机系统中,通常使用一种叫YUV的色彩空间,其中Y表示亮度信号;也就是这个YUV空间解决了彩色电视机和黑白电视机的兼容问题。对于人眼来说,亮度信号是最敏感的,如果将彩色图像转换为灰度图像,仅仅需要转换保存亮度信号就可以。从RGB到YUV空间的Y转换公式为:Y=0.299R+0.587G+0.114B在WINDOWS中,表示16位以上的图和以下的图有点不同;16位以下的图使用一个调色板来表示选择具体的颜色,调色板的每个单元是4个字节,其中一个透明度;而具体的像素值存储的是索引,分别是1、2、4、8位。16位以上的图直接使用像素表示颜色。=================================================那么如何将彩色图转换为灰度图呢?灰度图中有调色板,首先需要确定调色板的具体颜色取值。我们前面提到了,灰度图的三个分量相等。当转换为8位的时候,调色板中有256个颜色,每个正好从0到255个,三个分量都相等。当转换为4位的时候,调色板中16个颜色,等间隔平分255个颜色值,三个分量都相等。当转换为2位的时候,调色板中4个颜色,等间隔平分255个颜色,三个分量相等。当转换为1位的时候,调色板中两个颜色,是0和255,表示黑和白。将彩色转换为灰度时候,按照公式计算出对应的值,该值实际上是亮度的级别;亮度从0到255;由于不同的位有不同的亮度级别,所以Y的具体取值如下:Y=Y/(1(8-转换的位数));最后一点需要注意,得到Y值存放方式是不同的;分别用对应的位数来存储对应的Y值。//----------------------------------------------------------//RGB565转8位灰度图//----------------------------------------------------------TUint8gm_red,gm_green,gm_blue;TInt16*des_ptr;TInt16*pt;pt=(TInt16*)p8;//RGB565流for(TIntj=0;jh;j++){for(TInti=w;i0;i--){gm_red=((*(TInt16*)pt)&0xF800)8;gm_green=((*(TInt16*)pt)&0x07E0)3;gm_blue=((*(TInt16*)pt)&0x001F)3;p[0]=(TUint8)((gm_red*77+gm_green*150+gm_blue*29+128)/256);p++;pt++;}}p=qt;//灰度图指针