首页 > 代码库 > ActionScript3游戏中的图像编程(连载二十)

ActionScript3游戏中的图像编程(连载二十)

1.4.2 灰度的计算方法


      回过头来看RGB,站在科学的角度来解释,它们确实也有更明亮的理由,因为下面一排色彩反射出来的色光总量是上一排色的两倍。
      为此,作者曾自作聪明地发明了一条“原创”的灰度公式:


      Gray=(r+g+b)/3


      哈哈,用色光总量来表达颜色的灰度想必就比较准确了吧!沾沾自喜一番以后,我还试着用这条自创的定律来转换这张测试图片,上下色块的灰度果然拉开了,可是很不幸地,左右相邻,边界分明的色块依然粘连在一块(图 1.30)。
 


图 1.30 笔者“自创”的灰度转换


      显然此法生成的黑白照难登大雅之堂,色块之间的分界线全部丢失,而且同一行的颜色在我们人类的视觉系统里,亮度也不尽相同。比如视网膜会认为上排的绿色要比旁边的红和蓝明亮一些,而下排的粉红色则没有相邻的黄色与淡绿来得刺眼。

      一项伟大的发明——灰度心理学公式诞生了!它汇聚了光学物理,眼球视光学,人类心理学,美术鉴赏等前沿学科之精华,集科技,艺术,社会科学于一体,高深莫测,唯美维妙,堪称视觉科学史上最惊天地,泣鬼神之大作,没有之一。


      灰度心理学公式并不复杂,它深入浅出地描述了各种颜色对肉眼刺激程度的差异,仅仅使用最简单的加法和乘法就完成了灰度的整个演算过程:


      Gray = r*0.299 + g*0.587 + b*0.114


      其中,r,g,b被标准化为0~1。


      如果读者有阅读过fl.motion.AdjustColor类的代码,想必就会对这条公式有一种似曾相识的感觉,AdjustColor里用到了公式里的3个系数(具体数值可能有一些微小的差异)。实际上,AdjustColor正是用灰度代替了亮度,至于为什么,看看上面的黑白照转换结果就不言而喻了。


      令r=g=b=1,灰度就刚好等于100%,所以它实质上是对RGB三个数值做了一个加权平均数的运算,其中g的权重(通俗点说叫比重)最大,红色次之,蓝色最小。因此,心理学公式认为,绿色最刺眼,它比红色要明亮1倍,反射一点绿光对视网膜的刺激相当于两点红光。


      以上描述与肉眼的感知相当接近,但至于具体数值是如何测算出来的,我就无从考究了。


      我尝试运用灰度心理学公式对图 1.27进行灰度转换,效果要比自己“原创”的定律有水平多了(图 1.31)。
 


图 1.31 用心理学公式做灰度转换


      至此,亮度与灰度的关系已经比较明确,他们都为量化色彩的明暗而生,本着“科技以人为本”的精神推动着人类社会精神文明的进步。其中,亮度着重对整体的把握,从颜色类别,鲜艳程度,明暗程度三个人类感知属性去描述被数理科学抽象过的色彩数值,而灰度则更强调对事物单项属性的深度探讨,有针对性地弥补HSB模式中亮度计算方法与视觉器官不够吻合的缺陷。


      现在大概再也没有人会去拍摄黑白照片了(纯粹抱着怀旧心态的除外),即使遇到了真正需要使用黑白图像的场合(例如纪实片录制现场,汶川地震的哀悼日等),也不会专程从博物馆借一台19世纪出厂的黑白相机来开展拍摄工作,而是选择使用Photoshop等软件对彩色图像进行转灰的处理,而灰度处理的算法,恰恰就来源于上述的心理学公式。


      而在艺术编程领域,灰度除了用来直接制作黑白效果(比如游戏按钮的禁用状态,玩家复活前的灰度效果等等)以外,还广泛应用于图像识别,色彩调整,边缘检测,光影预处理,模型上色等图像处理技术中(Photoshop的颜色混合模式就是一个成功的典范)。它的专一性使图形的创作流程有章可循,让艺术不再只掌握在设计师的手上。


      下面我们就借助灰度公式搭配出一套相对和谐的色系。