RGB图转灰度图经典的心理学公式:
Gray = R*0.299 + G*0.587 + B*0.114
一般地,在程序中浮点型的运算较整型慢,特考虑用整型移位的方式进行色彩转化。
不同的整型值大小对应不同的转化精度,2位至20位的精度转化公式如下:
Gray = (R*1 + G*2 + B*1) >> 2
Gray = (R*2 + G*5 + B*1) >> 3
Gray = (R*4 + G*10 + B*2) >> 4
Gray = (R*9 + G*19 + B*4) >> 5
Gray = (R*19 + G*37 + B*8) >> 6
Gray = (R*38 + G*75 + B*15) >> 7
Gray = (R*76 + G*150 + B*30) >> 8
Gray = (R*153 + G*300 + B*59) >> 9
Gray = (R*306 + G*601 + B*117) >> 10
Gray = (R*612 + G*1202 + B*234) >> 11
Gray = (R*1224 + G*2405 + B*467) >> 12
Gray = (R*2449 + G*4809 + B*934) >> 13
Gray = (R*4898 + G*9618 + B*1868) >> 14
Gray = (R*9797 + G*19235 + B*3736) >> 15
Gray = (R*19595 + G*38469 + B*7472) >> 16
Gray = (R*39190 + G*76939 + B*14943) >> 17
Gray = (R*78381 + G*153878 + B*29885) >> 18
Gray = (R*156762 + G*307757 + B*59769) >> 19
Gray = (R*313524 + G*615514 + B*119538) >> 20
一般地,10位的精度较为常用(精度太高,效率会降低)。
例如,RGB32转灰度代码如下:
------------------------------------------
void RGB32ToGray ( unsigned char *pIn, unsigned char *pOut, const int height, const int width, const int flag )
{
int green, red, blue;
for ( int i = 0; i < height; i++ )
{
for ( int j = 0; j < width; j++ )
{
blue = pIn[i*width * 4 + j * 4]; //注意排列顺序B G R
green = pIn[i*width * 4 + j * 4 + 1];
red = pIn[i*width * 4 + j * 4 + 2];
pOut[i*width + j] = (unsigned char)((blue * 117 + green * 601 + red * 306) >> 10);
}
}
}
-------------------------------------------
特别地,主要RGB32中色彩分量的排列顺序,以上的RGB32排列为 [ B G R NULL ] 。