![b04d3c7cd6c2761210b48edbb0b27f44.png](https://i-blog.csdnimg.cn/blog_migrate/464579567aa51e414fbca2209f9f410b.jpeg)
首先,我得说,网上关于伽马错误的资料实在是太多了,应该说绝大多数都是错的,只有很少的是正确的,导致我各种困惑不解。
作者:高兴
可以听说读写中文、英文和韩文,日文只能读不会听说写
央视NEWS频道 New Money栏目 嘉宾
![d0405a20f898392ecc2108e69a01706c.gif](https://i-blog.csdnimg.cn/blog_migrate/f6e778308e845bebc01b18b0743d4bd7.gif)
首先,我得说,网上关于伽马错误的资料实在是太多了,应该说绝大多数都是错的,只有很少的是正确的,导致我各种困惑不解。
![847aa5e07b0c068b344d2b79c59758ef.png](https://i-blog.csdnimg.cn/blog_migrate/d744c59e32203f9989e3d5327104a644.jpeg)
所以如果你们对Gamma感兴趣,我建议你们千万不要去网上搜,都是错误信息!还是看我写的吧。
那么,伽马校正到底是什么?
这要从CRT的技术特性开始讲起。
![b1d852eae771cb4b7864bd90a047e77a.png](https://i-blog.csdnimg.cn/blog_migrate/9043b07b751c8fb9b0e22c4a981b928e.png)
如上图所示,CRT显示器是靠电压来驱动一个能够发射电子束的电子枪来击打荧光屏上的三种荧光粉,使其发出RGB三种颜色的光,通过调节电压的方向可以改变电子束击打在屏幕上的位置,实现扫描,并根据输入信号的大小来调节电压的大小从而改变荧光粉发出光的明暗。
但是,电压的大小与荧光粉发出光的明暗之间并不是一个简单的线型关系。在大部分区间,两者之间是一个幂函数关系。
![02d08b5c6b7d9c130fdfa9b34cf36c03.png](https://i-blog.csdnimg.cn/blog_migrate/76829a6c415e0ee0f7bdc8299393c5c9.jpeg)
如果输出亮度是Y,出入电压是X的话:
Y = Xn
n就是决定X和Y之间关系的指数。
在X很小的一个比较小的区间里,两者之间又是一个线性关系。
![4ed62c0dca95a491a0afeed537335dd8.png](https://i-blog.csdnimg.cn/blog_migrate/5ab4685230d6d732225d32bcede3ae1f.jpeg)
此时:
Y = aX
a是在这个区间决定两者之间关系的系数。
在一个显示器被制作出来以后,n和a的大小就已经被确定了。当时各个CRT厂商的技术其实差不多,做出来的产品可能略有差别,但是大部分都差不多。
如果我们只是单纯考虑两者之间的指数关系的话,n一般是在2.5左右。
如果还是把两者之间的关系看做指数,但是针对小区间的线性关系做出一定修正的话,可以粗略的认为n是在2.2左右。
这个2.2就是大多数CRT显示器的伽马值。
![e9c4be51cedc9209f5664c1786187399.png](https://i-blog.csdnimg.cn/blog_migrate/074e5e2b6cd2df13a8c1fba1c8626cf5.jpeg)
我知道有很多很多资料都只说这个值应该是2.5,很不幸,很多资料都是不准确的。
注意,
这两个数字并不是从理论上计算出来的,而是从实际统计市面上的产品的特性并总结出来的。
那么,因为照相机的CMOS/CCD的输出电压与输入的光子数之间是一个线性的关系,
![67cfa48f2bd30a57a0749bbb66e3456e.png](https://i-blog.csdnimg.cn/blog_migrate/ba052a6826ff1c680be2dd84489afb57.jpeg)
如果把照相机输出的信息直接输出给显示器的话,最终输出的结果就会是这样的:
![553168ef322ea8ac82d71fe9e033c032.png](https://i-blog.csdnimg.cn/blog_migrate/e870c0c65929ddcd26397ec46fa984ca.jpeg)
很明显,正常记录的信号,在CRT上输出的时候,会变得非常暗(输出低)。
比如正常如果是线性关系的话,50%亮度的入射光在显示屏上也应该按照50%的亮度被输出,但是因为这个指数关系,50%2.2 = 21.8%,实际上在CRT显示器上只会按照21.8%来被输出,比应有的强度要低一半还多!
如下图,正常的照片会显得非常灰暗。
![f631fc6f1836564c06d69c2aa1960c2c.png](https://i-blog.csdnimg.cn/blog_migrate/90d7341677fa36961ea51647933a8e4e.jpeg)
那么,怎么解决这个问题呢?
当然,我们可以想办法改良CRT显示器,让它能够线性输出,这需要在全球所有的CRT设备里面加入一个补偿电路,肯定是很费钱费力啊。或者我们在节目制作的摄像机上增加一个电路,让它能够中和CRT电视的效果怎么样呢?
因为当时可不像现在这样人人都可以拍摄视频制作节目,那个时候全世界就没有多少摄像机,内容制作者屈指可数,所以当然是改变摄像机的设计更make sense啊。
所以在CCD/CMOS记录完信息,需要保存或者直接传输电视信号之前,我们可以先对信号做一个与显示器伽马完全相反的逆指数计算,Y = X1/2.2,然后再保存或者输出,这样在显示器上不就能够正确的显示了吗?
![790294602a9d7eb9b9a03731ccb29658.png](https://i-blog.csdnimg.cn/blog_migrate/940c00a9ef5fa291898a7d6d81638e64.jpeg)
好像这样,
![f708bebe12556d9f08797d39f2ba33b3.png](https://i-blog.csdnimg.cn/blog_migrate/f4a25e621211cd97242c4a4a533418ba.jpeg)
比如下面这个照片:
![fa727144d2d37a33e54f2d92e96e701a.png](https://i-blog.csdnimg.cn/blog_migrate/89c0796c370f048aecb67db5905654d5.jpeg)
经过在储存阶段针对CRT伽马校正的补偿以后,图像终于可以正常显示了!
Wait!我们还有一个因素没有考虑,那就是环境光。
我们在基础篇讲过,环境光的明暗也会影响人度色彩的判断。比如粉色不过是显得发白的红色,棕色是暗淡的橙色,灰色是暗淡的白色而已。
而我们对明暗的判断是相对的。
![0ec68f9737c5729cefaf1621f3c2932c.png](https://i-blog.csdnimg.cn/blog_migrate/bf6ff18c77d474870b6ecea55b25f869.jpeg)
上面那个圆和下面的圆的颜色是一样的,是环境光让我们觉得上面的是棕色,下面的是橙色而已。再比如这个图:
![0e7559cd8a2b2a849c25236127c0f661.png](https://i-blog.csdnimg.cn/blog_migrate/a16d9a7eb1b3db6b478bdf4b08355c3e.jpeg)
乍一看A和B的颜色不一样,但是其实那也是环境光带给我们的一种“错觉”(特殊的颜色概念)而已。
那么,我们知道,节目的拍摄和制作一般都是在比较明亮的地方,比如白天的室外,或者是灯光明亮的室内摄影棚,所以在这种环境光下制作的节目,如果在家庭环境或者办公室观看会怎么样呢?
尤其是家庭环境,主要观看电视的时间是在晚上,很多家庭都会关灯或者开一个小灯看电视,导致电视成为整个客厅最亮的光源。这个时候,因为环境光过暗,电视上的颜色会比拍摄的时候看起来更明亮,棕色可能会看成橙色,灰色可能会变成白色。
所以,为了让观众能有更好的观看体验,节目在制作的时候不应该完全补偿CRT的伽马特性,而是保留一点点,这个数值,经过试验(假定拍摄时的环境光是D65,而观看的时候的环境光是D50),算出来最终Gamma是1.125的时候,视觉效果最好。
那么最终的Y = Xn x 2.2 = 1.125
可以解出来
n= 1/1.956 ≈ 0.51
那就意味着在储存视觉信息的时候,应该对信息做一个Y = X0.51的补偿。
也就是说CCD/CMOS记录的信息都要经过这个Y = X0.51的数学变换再存储或者传送,才能保证在显示器上得到正确的显示效果。
好像下面这样。
![a4a0d6024cdb258129bb2e1dc82a5268.png](https://i-blog.csdnimg.cn/blog_migrate/a5b0c5a91d61a55a981d375a45dd1033.jpeg)
很多材料都在讲什么人眼视觉感受都是非线性的云云,对于暗部的信号更敏感,所以如果用一个0.51的指数去补偿输入信号的话,可以去补偿人眼的这种特性,还能节省带宽什么的。
这些说法要么就是错的,要么就是和Gamma的关系很小,要么只是Gamma偶然的副产品而已,真正的在对视觉信息进行编码的时候需要做伽马调整的唯二的理由就是要补偿CRT的电子枪的特性与环境光的不同。
不服来辩!
![d5507768d2b8e2976ebb194627c7ae39.png](https://i-blog.csdnimg.cn/blog_migrate/8b4e31b96774d64bdc00d3a45caa0e68.jpeg)
然而,Gamma Correction确实有一个很好的副作用,就是能够更好的利用2^14/2^8 = 2^6 = 64个14位的数据。
好,另外一方面,我们人类从远古以来就害怕黑夜。尤其是晚上太可怕了,各种野兽和妖魔鬼怪。所以我们为了生存就特别注意在晚上观察黑暗的四周,提防危险,时刻准备战斗(逃跑)。具体可以看基础篇关于视杆细胞的部分。
所以,人类对于暗光的层次的分辨能力要远远强于对亮光的层次的分辨能力,请看下图。
![6e419c35962a923f8242eba61ff1e888.png](https://i-blog.csdnimg.cn/blog_migrate/4ede8fd22334709beabcf7922f6d3c5a.png)
同样是从黑到白分成十个等级,第一行的层次感是不是要远高于第二行?同样是十个数据,第一行给我们提供了更多的信息。
所以,同等带宽/存储空间的前提下,尽量存储更多的暗部的信息可以给人带来更多的信息量。
在将CCD/CMOS记录的14位信息存储为8位信息的时候,如果先将14位信息进行伽马转换,首先因为下面这样的函数模样,所以Y值在X值的相对高值区间会更加“拥挤”,在Y值的相对低值区间反而会非常“宽松”。
![ec801ac0be25654381fbb45a8da2a41a.png](https://i-blog.csdnimg.cn/blog_migrate/42ad14bac8c27cfdb3b39248bf7010bf.jpeg)
那么,因为有精度限制,所以四舍五入之后,在X值的相对高值区间的很多Y值会出现重复数字的情况,从而形成了重复数据,即亮部变得不太层次分明,而在暗部区域的数字,因为比较宽松,相对距离较大,所以重复数字会非常少,层次仍然十分分明。如果再将14位数据转化为8位的数据的话,这个现象会更加明显,最后实现了在同等带宽/存储空间的前提下,存储/传输了更多的暗部的信息的效果。
这才是所谓的节省带宽提高数据质量以及适应视觉感受特性的真相,四舍五入!!!!
![790294602a9d7eb9b9a03731ccb29658.png](https://i-blog.csdnimg.cn/blog_migrate/940c00a9ef5fa291898a7d6d81638e64.jpeg)
后来,以LCD为代表的的平面显示器开始逐渐取代CRT,这些显示器大部分的输出亮度与输入信号之间是成类似线性的关系的。嗯,其实不是完美的线性,但是也不是CRT那种幂函数的关系。(主要是蓝色偏弱)
再加上照相机CCD/CMOS也是线性的,电脑的CG处理也是线性的,那么,是不是就不用做Gamma Correction了?
是的。。。如果不上网、不看电影、不看电视、不看照片也可以的话。
因为CRT作为主流电视机技术和电脑显示器技术已经存在太多年了,导致大部分的图像、视频以及互联网上的内容,甚至操作系统、浏览器等软件都在制作的时候考虑到CRT的Gamma特性,做出了上面所述的反向补偿。
那么,如果平板显示器不做任何Gamma Correction的话,就意味着在显示过去和现有的内容的时候,会出现显示不正常,画面过于明亮的效果。为了保证兼容性,平板显示器厂家只好在显示器内部加入相应的电路,去模拟过去CRT显示器的Gamma效果。简直是历史逆行,没办法啊,内容为王。。。
LCD模仿CRT的Gamma特性有两种方式,一种是简单的模拟方式,做一个专用的符合幂函数关系的模拟电路,针对所有输入的信号都进行一次Gamma转换。这样做简单直接,但是缺点是不能调整Gamma值,不能适应某些情况对颜色的细微调整的需求,最重要的是只适用于VGA接口输入的模拟信号。
另一种更好的方式是采用一种叫LUT(Look Up Table)的方式。
什么是LUT呢?简单的说就像是一个小抄本一样。针对任意一个在范围内的输入,都会有一个已经计算好的答案。不需要每次都用公式再计算一次,这样可以大大减少计算负担并加快输出速度。
LUT还有一个好处是,可以在芯片里存储多个LUT,这样根据需求不同,可以迅速的随时切换。
关于LUT,更具体的信息可以看下面的附录9。
所以,对于Gamma,我们可以这样总结一个公式:
Viewing Gamma = Camera Gamma x Display Gamma = Camera Gamma x CRT Gamma x LUT Gamma
代入上面的数据的话
1.125 = 1/1.956 x 2.2 x 1
另外,很多人说因为苹果电脑有很多印刷行业客户,而印刷打印产业的实际展示环境的背景光是在非常明亮的环境,所以要使用更高的伽马值来展现更明亮的画面,为了保证脑画面与打印输出的画面的一致性,苹果采用了1.8的伽马值。
这种说法是一半正确一般错误的。实际情况是2009年以前的Mac的最终Display Gamma是用的是1.571左右instead of 2.2。苹果的显示器的物理Gamma其实和PC的一样都是2.2,并不是什么特制的产品.但是苹果通过在系统和显卡上增加LUT,实现了最终Display Gamma 1.571的输出。最终的Viewing Gamma的结果还是要取决于Camera Gamma,也就是内容的Gamma。
现在因为sRGB和Adobe RGB 1998等主流标准都是采用2.2的Gamma值,所以苹果也把自己的LUT取消,直接采用2.2了。