|
|
关于Soft Boy一文:《将RGB值转换为灰度值的简单算法》算法的意见
原文对公式描述如下:
R = G = B = 0.3R + 0.6G + 0.1B; //第二版改正后的公式
//第一版中的错误公式是 R = G = B = ( R + G + B ) / 3;
原文算法如下:
WORD RGB16toGray(WORD sour)
{
WORD t;
WORD r, g, b;
r= sour >> RMove;
g= (GMask & sour) >> GMove;
b= BMask & sour;
t = (r*3+b*6+g)/10; //第二版改正的地方
return (t<<RMove)|(t<<GMove)|t;
}
我这里讨论的就是这一行:
t = (r*3+b*6+g)/10; //第二版改正的地方
实际上根据我的测试,R:G:B的正确比例更趋近于2:3:1,所以经过更改,我把算法更改为:
t= ((r<<1) + (g<<2) + b + 31) >> 3;//按照2:4:1的比例合成再加1份白色调节
有人要问为什么变成了2:4:1了呢?因为人眼感觉绿色实际上比其他颜色更明亮一些,而且天蓝色RGB(0,255,255)和绿色RGB(0,255,0)等含绿色的颜色又经常出现(天空,草地……),所以我把绿色*4(就是<<2)。为什么又加了个31呢?因为柔和明亮一些的图象让人眼感到更舒适,所以我加了个31使的图象更白更柔和一些(顺便凑成8倍用来除以8[就是>>3])。
这些改动都是通过实际实验了很多次得出的,综合了速度和让人感到舒适两部分要求。
详细请见下面的图片对照。
游戏原图: |
|