bayunaner

https://www.zhihu.com/question/27467127

 

色彩校正中的 gamma 值是什么?

一直听到这个词就是不知道什么意思,也没找到特别好的介绍。
关注者
1,134
被浏览
158,669
 

21 个回答

收录于编辑推荐 ·

2018年7月4日更新重要视频:《美术中灰色的物理光强——演示人眼亮度感知的非线性》

演示人眼亮度感知的非线性
 

各位网友好,您现在阅读的是2017年12月19日修改后的版本。如果您看过我之前的答案版本,我必须要指出新老答案版本的核心区别:我之前版本的答案认为 sRGB 标准中的 Gamma 校正的幂函数曲线来自于心理学上的韦伯-费希纳定律(Weber-Fechner Law)或斯蒂文思幂定律(stevens\'power law)(这个观点是没啥问题的)。同时认为这条幂函数曲线和 CRT 显示器的物理属性毫无关系(这个“毫无关系”大大的有问题,说的太绝对了)。

 

我之前认为,既然眼睛的特性从心理学上讲是这条曲线,那我们通过实验是可以得到 Gamma=2.2 的 sRGB 标准的,和显示器的物理属性没有任何关系,你用蜡笔的灰度做实验也能得到这条曲线,而蜡笔反射的光,和显示器发出的光,必然没有本质区别,所以即使我们抛开电子产品,也能试验出这么一条 Gamma=2.2 曲线。Gamma 曲线就是把物理光强和美术灰度做了一个幂函数映射。如果媒介灰阶有限呢,比如8位每通道的图片,就必须要做这个映射,否则浪费存储空间。如果灰阶充裕,就不需要做这个映射,直接记录物理光强就可以,比如32位每通道的图片。

 

其实我之前的结论没有太大的问题,很简洁,也比较触及本质,很适合用来理解 Gamma,但是直到今年7月份我看到了

老师写的这个答案:黄一凯:为什么线性渐变的填充,直方图的两头比中间高?,我才猛然意识到,眼睛的感知实在是太复杂了,即使做实验,估计也画不出来这么简洁的幂函数曲线,黄老师的答案中提到了,在 Photoshop 中,使用渐变工具,拉一条从黑到白的渐变,默认其实并不是标准的 0、1、2、3、4、5……254、255 这样的线性数列,而是在高光和暗部有进一步的调节,而如果严格的把灰阶线性排列开来,眼睛看上去未必是舒服的均匀从黑到白渐变。

 

图:黄一凯

我之前所有的探讨都是考察中灰点的映射关系,完全没想到 PS 在高光区和暗部的这些小调节,所以得知这个事实,是很颠覆我的认知的。既然人眼的感知曲线在电脑屏幕上都这么不简洁,那这个简洁的幂函数曲线怎么来的?我们就无法忽视显示器发展史了,看来这个幂函数的基因还是来自于 CRT 显示器,具体的数值 Gamma=2.2 是实验定下来的。眼睛的感受曲线,和 CRT 显示器的物理响应曲线能够基本吻合,这就是我们一直在说的那个美妙的巧合。

 

事实上,在提出 sRGB 标准的时候,相当大的程度上参考了当时市场上主流的摄影机、显示器、扫描仪已有的标准,同时也参考了韦伯定律,但有意思的是,这条 Gamma 校正的幂函数曲线似乎成为了默认的事情,直接就拿过来用,开始讨论 Gamma 应该是多少了,没有解释为什么是幂函数。参见1996年发表的 sRGB 色彩空间提议书:A Standard Default Color Space for the Internet - sRGB。所以我现在的观点是这样:Gamma=2.2 你可以说它由当时主流硬件设备的物理属性而来,因为提出这个标准,就是为了让大家在制造硬件和管理色彩方面有一个统一的方便的标准,是非常务实的,但是同时你不要忽视人的视觉感知习惯才是幕后大 boss,是发生这一切的本质原因。

 

知乎是个较真儿的地方,对就是对,错就是错,之前我的理解有问题,我要承认错误。我不敢说我今天的理解是正确的,但是既然想到了这些,我一定要分享出来。


以下是老答案:

 

我打算抛开计算机图像、显示器发展史等因素,从逻辑上推出Gamma产生的背后原因。

 

先上结论:

 

“Gamma”的产生,原因有二:

 

  1. 人眼对自然亮度感知是非线性的。
  2. 我们用来记录/展示画面的媒介上,动态范围和灰阶预算是有限的。(无论纸张还是屏幕)

 

为了在灰阶预算有限的前提下,协调自然亮度主观灰阶感受这二者的映射关系,Gamma就产生了。

 

 

第一节:韦伯定律

(注:存疑,解释请看第五节第一段,但不影响本文阅读,您可以按顺序先看下去)

 

韦伯定律,即感觉的差别阈限随原来刺激量的变化而变化,而且表现为一定的规律性,用公式来表示,就是△Φ/Φ=C,其中Φ为原刺激量,△Φ为此时的差别阈限,C为常数,又称为韦伯率。

 

解释成人人都懂的大白话就是:人对自然界刺激的感知,是非线性的,外界以一定的比例加强刺激,对人来说,这个刺激是均匀增长的。

 

为什么会有韦伯定律?人不是物理测量仪器,我们用感知是不可能测出某事物具体的物理量的,但是我们可以通过比较,来感知世界

 

以光为例,若在一小黑屋中,点亮了一支蜡烛A,这支蜡烛对屋内的贡献是显著的,在视觉上也感受到极大的明度提升。但是若是屋内已经点亮了1000支蜡烛,此时再点亮一支蜡烛B的话,从物理能量贡献上,这支新蜡烛B与蜡烛A的物理贡献是一样大的,但是在人的视觉中,B引起的“明度”变化,远远不如A。

 

为什么?很好理解啊:对于某事物,同样的变化量△a,总量少的时候,变化显著,容易被人感知,事物总量大了,再变化同样的△a,就不那么容易被察觉了。

 

正因为我们在很多时候不需要知道事物客观的物理量,而是要描述它们的增减关系,所以必须是靠比较来描述,才比较合理,以等比数列增加的物理量,对人的感知来说,是均匀的,比如:

 

  1. 音乐的音阶,是符合十二平均律的,音调的频率以等比数列增加,人听起来是均匀升调。两个八度之间频率翻一倍。
  2. 声音的强度是按照“分贝”来描述,倍数增加的音量听起来是均匀增加的。
  3. 拍照片,描述明亮程度用的是“档”,曝光物理上大一倍,认为是亮了一个级别。
  4. 里氏地震级数,每增加一级,释放的物理能量大32倍。

 

类似这样的例子太多太多了。

 

另外有一个家喻户晓的笑话,实际上直戳这类描述体系的反直觉之处,绝大多数人根本没意识到,我们以为是均匀增加的量,其实不是线性增加的。

 

笑话是这样讲的:据说人所能感受到的疼痛分为了10级,1级是被蚊子叮了,10级呢,是孕妇分娩。有人就问了,那什么是11级疼痛呢?答“11级疼痛就是孕妇分娩的时候被蚊子叮了”。哈哈一笑之余,有人质疑过这个说法吗?

 

现在你懂了韦伯定律,就知道所谓“分娩的时候被蚊子叮”不可能是11级疼痛,由于分娩已经是10级剧痛,此时被蚊子叮所带来的感受变化量微乎其微,疼痛程度仍然是10级。那么什么是11级疼痛呢?一定是“N个孕妇分娩的痛苦以科技手段让同一个人同时承受”,才是11级。

 

 

第二节:中灰

 

对于中灰的定义,我不敢妄下,我只说我个人的解释:

 

“中灰就是人眼能分辨的所有灰阶的中间点。”

 

怎么理解?我一直以《粉刷匠的故事》,来解释中灰的意义:

 

假如你是一位粉刷匠,你拥有充足的白油漆和充足的黑油漆,那么现在要求你完成一个任务:

 

把黑白油漆混合成各种不同灰度的油漆,并且把它们排成一排,直到形成黑到白的均匀过渡。

 

在理想的情况下,会发生什么样的情况?你会不断地调出灰色的油漆,并且把它和已有的油漆相比较,如果它是一个新灰色,你就会把它插入队列,如果是重复的灰色(肉眼难以分辨,达到了你灰阶分辨能力的极限),你就会把它丢掉。

 

最终,功夫不负有心人,你面前的灰阶将会形成从黑到白的均匀过渡,此时的灰油漆种类将会是几百个甚至更多,那么最中间那一个,就是中灰的油漆:

这里粉刷匠为了管理这些好不容易调出来的灰油漆,把它们赋予了合理的编号,根据油漆在队列中的位置,粉刷匠定义纯黑油漆编号为0.0,纯白油漆编号为1.0,那么中灰油漆的编号自然落在了0.5上。与此同时我们还可以得到的推论就是:不管油漆的总数有多少,编号0.0-0.5之间的油漆种类数目,和编号0.5-1.0之间的数目是一样的,因为从定义上,中灰就是队伍的最中间那个颜色。我们继续定义比中灰暗叫暗区,比中灰亮叫亮区,那么(在低动态范围下,)人眼可分辨的暗区灰阶的数目和亮区灰阶的数目是一样多的。这样的一个连续的灰阶体系可谓完美,用来描述画面再好不过了。

 

 

第三节:物理反射率检测

 

面对这样一个完美的从黑到白过渡的油漆颜料体系,我们如果去检测一下中灰油漆的反射率,再把它和纯白油漆的反射率相比较。若我们定义白油漆的反射率是100%,黑油漆的反射率是0%,你会发现,中灰油漆的反射率不是直觉中的50%,而是一个在20%上下徘徊的数值。

 

生活中早有这种类似的东西,比如摄影师的灰卡,反射率是白卡的18%:

(据简单的搜索,灰卡的反射率是白卡的18%还涉及其他原因,18%实际上是17.68的近似值,而17.68是312.5的平方根,具体请阅读相机拍摄使用灰卡的方法

 

在本文中,我举灰卡的例子不是想告诉你们中灰色的物理反射率已有定论,事实上它没有也不可能有,在不同显示媒介和不同的光照的情况下,心目中中灰所对应的反射率是不太一样的。我举这个例子只是想拿一个大家看得见摸得着,并且符合国际标准的参照物,来说明:人心目中看起来中灰的色块,其物理亮度值大约在白色块的20%左右

 

根据韦伯定律,这件事是好理解的,下图是非常粗略的示意图:

此图原点是黑色,1,1点是白色,你可以这么理解此图:当整体环境较暗,微小的亮度增长也会在人的心目中是显著的明度提升,当物理亮度达到白色的20%左右的时候,人的心目中已经感受到中灰色的概念。而剩下的一半高光区的灰阶,需要用白色80%的物理能量才能照亮成白色。

 

这一节你只需要记住一个结论,虽然不太精确,但是绝对不会错得太离谱,这是我个人辅助理解Gamma校正的法宝:

 

视觉感受的中灰色是白色反射率的20%左右。(注:白色为低动态颜色1.0)

 

再换成更不精确但更好用的话就是:自然界的0.2,在心目中的地位是0.5。

 

 

第四节:“灰阶预算很紧张!”

 

我管这个故事叫《灰色蜡笔的故事》

 

粉刷匠改行了,他要去做蜡笔,这个蜡笔的要求很特殊,是灰阶蜡笔。蜡笔不像油漆可以调出连续的颜色,而是只能调出离散的,有代表性的几个灰阶。

 

现在如果生产一套畅销蜡笔,但是灰阶预算超紧张,只允许你放进去3支不同灰阶的蜡笔,你会选择哪几个有代表性的灰色进行生产呢?

 

我想最合理选择的就是黑、白、中灰了吧,用它们可以尽可能多的描述画面的灰阶过渡,而这三支笔,借用之前的编号体系,他们的灰阶编号分别为:0.0、0.5、1.0。反射率分别为:0%、20%、100%

 

 

现在放宽要求,这套蜡笔可以是4色一盒,那么编号0.0、0.33、0.66、1.0的四支蜡笔入选。反射率分别为:0%、9%、40%、100%

 

 

如果是5色一盒呢?则编号0.0、0.25、0.5、0.75、1.0的蜡笔入选。反射率分别为:0%、5%、20%、53%、100%

 

 

有人要问了,老韩你先等会儿吧,不同灰度蜡笔的物理反射率你是怎么知道的?

 

查这张曲线图啊,从纵坐标挑选蜡笔的颜色,横坐标上就是它相对于白色的反射率了,中灰是20%左右的情况下,其他的数据位置也都是可以推算的:

 

那么这张曲线图是不是准确,可就非常关键了。曲线图是靠什么定义的呢?我们来到下一节:

 

第五节:广义Gamma

 

兄弟们,我不卖关子了,上文这个0-1区间的曲线,就是所谓的Gamma曲线。我们若定义黑是0,白是1,那么在0-1区间,我们是可以用一个幂函数来描述客观自然数值和主观心理感知的对应关系的:

注:知友指出韦伯定律是对数函数,无法直接转化到幂函数,知友

提出,这里大概应该用 Stevens\' power law,来取代韦伯-费希纳定律的解释,Stevens' power law 描述的也是物理刺激强度与感受强度的关系,而其形式是一个幂函数,这个描述方法经常被认为取代了韦伯-费希纳定律,因为它描述了更广泛的感觉。我觉得这个解释很可能是正确的。)

 

 

Gamma取值不同的时候,幂函数图像是如下规律:

 

Gamma=1,斜45°直线,不校正,输出=输入;

 

Gamma大于1,曲线下压,输出值小于输入值;

 

Gamma小于1,曲线上拱,输出值大于输入值。

 

生产蜡笔的时候,我们输入一个主观概念:“我想要一支编号0.5的蜡笔”,输出了一支蜡笔,其反射率是20%左右。那这个Gamma是大于1的下压Gamma,它把0.5映射成了0.2。

 

欣赏蜡笔画的时候,输入眼睛的亮度正比于颜料在画纸上实际的物理反射率,“输出值”就是我们心目中主观感受的灰阶。此时的Gamma上拱,小于1,可以把自然界的0.2的反射率,映射成心目中的0.5灰阶。

 

看懂了吗?广义Gamma实际上描述的就是自然现实的物理量和主观视觉灰阶的映射关系。这个关系是非线性映射。

 

从这个观点看的话,广义Gamma无处不在,而且极具启发性:

 

我们最熟悉的铅笔素描,使用黑色铅笔涂抹暗部,白色是由白纸留白形成,那么其画面上的中灰部,铅笔覆盖率是多少?答案是80%,留下20%的纸面,这20%的反光,在我们心目中看起来是中灰色的概念。

 

此时灰阶和谁形成了Gamma关系?“心目中的灰阶”对应“铅笔涂抹的工作量”。也就是说,人们只凭目测,天生就可以把自然界的画面,映射成正确的颜料覆盖率,在这个过程中,全凭视觉的主观判断。视觉感受主导了一切。说白了,媒介上的灰阶分布,人是通过目测来调的

 

 

第六节:数字摄影和屏幕

 

第四节中,3色一套、5色一套的蜡笔我们如果想得明白,那么推广到我们生产一盒256色的灰阶蜡笔,它们的反射率和蜡笔编号的映射关系,我们也是能想明白的:

 

蜡笔反射率=蜡笔编号^Gamma

 

256色的蜡笔想得明白的话,这256个灰阶和电脑屏幕的像素有区别吗?没有任何区别。纸张是画面媒介,屏幕也是画面媒介,区别只是反射率变成了像素的光强。

 

屏幕光强=灰阶编号^Gamma

 

为了把事儿说明白,我们先把8位每通道图像的数值,换算到0-1区间。8位图上0是黑,255是白,中灰色是128。换算以后,黑是0,白是1,中灰是0.5。

 

要注意,8位每通道图像,灰阶预算极其有限,仅有256个,如同一盒256色的灰阶蜡笔。

 

当我们在用数字相机拍照的时候,相当于对自然界采样,并把数据编码到图像文件中。

 

假设光照适宜的场景中有一个中灰色的物体,反射率是白纸的0.2,我们采样到它的时候,应当把0.2的物理能量用0.454的Gamma放大到0.5的灰阶地位记录下来,这样一来,暗部区域就分配到128个灰阶了。我们充分地利用了存储空间。

 

如果在拍照的时候不进行Gamma校正,那么中灰物体会被映射为0.2记录下来,那么此时,暗部仅分配到50个灰阶,暗部采样严重不足,高光采样冗余。

 

来到屏幕上,也就是文件解码端,此时屏幕从计算机中读到一个0-1的渐变,也就是从黑到白的均匀过渡,图片如下:

其中左端的色彩值是0,中间的色彩值是128(0.5),右边是1.0的纯白。解码后,屏幕要以什么样的亮度显示这些像素呢?最左边像素关灯不显示,是黑色,中间以白色21.8%的亮度显示,右边像素全开,显示100%白色。这样的一个图片,在我们心目中看起来是均匀的灰度渐变。

 

此时屏幕的解码Gamma是2.2,这个Gamma,会把0.5映射成0.218。

 

从这个角度来看。其实眼睛跟“照相机”真的挺像,我们看见自然界0.2的东西,就把它映射成0.5的地位,记到脑子里了。

 

 

总结

 

总结段要说三个问题:

 

  1. 2.2怎么来的
  2. 为什么一直强调低动态图像
  3. 如果灰阶预算不紧张,会怎么样

 

Gamma=2.2怎么来的?是实践中目测调整出来并最终确定的,其实说良心话,只要是0.5中灰对应白色的20%左右,画面看起来都是靠谱的,所以当年的Gamma特别多种多样,在2.2上下浮动(1.8-2.5),1996年微软和惠普在特定的光照条件下测试人观看显示器的感受,他们认为,把8位图像中128号灰(0.5灰)这个抽象的、代表心目中中灰色的数值,对应以白像素21.8%的亮度显示出来,由黑到白的渐变过渡看起来会比较均匀。最终对应的Gamma就是2.2。那么他们定了这个标准,后世的硬件也就都往上面靠了,包括拍照的时候,编码Gamma也就取了1/2.2=0.454。这样能保证整个编码解码系统总Gamma是1,高保真,自然界中的色值能在屏幕上相对完好的再现。

 

凡是说Gamma 2.2来自于老式CRT显示器物理特性的解释,都是误解。这个误解一般会这么讲解Gamma的来龙去脉:当年老式的CRT显示器内置Gamma 2.35左右,解码的时候会把输入信号压暗,所以我们呢,为了保证总Gamma接近1,就要预先在编码的时候把输入文件的信号提亮,而且这样一来呢,刚好顺应了人眼对暗部感兴趣的特点,把暗部的信息多多记录了下来,充分利用了文件的空间,真是美妙的巧合啊。讲起来顺畅,听起来也很美妙,我也曾经这么给别人讲,但是我发现我没法说服我自己,人类就被一个老式硬件的物理特性决定了后世的工业标准?这逻辑不对。

 

为啥错,比如当年要是没有先发明CRT显示器呢?假设我们先发明了一个物理Gamma为1的显示器。当输入8位图像0.5的数值的时候,它还是要乖乖的把这个0.5映射成白像素的20%输出出来。否则看起来就不是中灰,8位每通道的显示器Gamma必须在2.2左右,跟显示器发展史没关系,完全是视觉效果决定的。一切都因为韦伯定律。

 

 

为什么一直强调低动态图像?这个其实涉及到“自然景象再现成画面”这样一个复杂的事情,自然界是高动态的,亮度可以非常亮,也可以有一些明亮的光源,所以我在描述中灰的物理量的时候,我不可能描述成场景中最亮的物体亮度的20%,这个最亮的概念会非常不好确定。同一个明亮的场景中,中灰纸张应该是白纸反射率的20%而不是灯泡能量的20%。我如果把高亮物体牵涉仅来,事情就乱了。但是我可以用绘画举例子,画布的动态范围是有限的,最亮不过是画布上的留白,屏幕的动态范围也是有限的,最亮不过是白像素。所以在低动态范围的语境下,我可以安全的定义,中灰蜡笔的反射率是白色蜡笔的20%左右,中灰像素的亮度是白像素亮度的20%左右,而不是现实场景中最亮物体的20%。这一点是很关键的。

 

 

另外,一切的前提必须是:灰阶预算很紧张,只有灰阶有限,我们才需要考虑中灰映射给谁的问题,如果灰阶足足的够用,硬盘不要钱了,网线足够粗,我们主流不再使用8位每通道图片记录亮度信息的话,Gamma是没必要的,我们直接把自然界的0.2记录在文件上,显示器读取到0.2,也直接显示就好了——32位每通道的hdr格式就是这样的。32位格式中,中灰就被记作0.218,所以在32位环境中拉一个0-1的渐变是这样的,很明显暗部被压缩了,高光区很多:

这张图怎么理解?它还是0-1的均匀渐变,中间那个颜色还是0.5,只不过32位图中的数值就是自然界的物理量,所以这个色带对应的其实是现实中的反射率。左边五分之一20%处是中灰色,中间的像素表现的是反射率为白色50%的物体看起来的灰度,这个灰度是0.5^0.454=73%灰。也就是8位下的186灰。具象的说,如果我有一支蜡笔反射率是50%,看起来就是中间这个灰度。

 

总之一句话:灰阶有限的前提下,因为人眼对自然的非线性感知特性,我们才需要Gamma校正。

 

具体到生活中的现象就是:因为我们硬盘太贵,网线太细,所以地球人目前主流使用8位每通道的sRGB色彩描述体系,它灰阶有限,中灰的地位必须在所有灰阶的中间,记录值为128,而不能是其物理值0.218,把物理量0.218换算成0.5灰阶编号的过程,就是编码端的Gamma校正,Gamma值为1/2.2=0.454。屏幕读取到128显示成21.8%的亮度的过程,就是解码端的Gamma校正,Gamma值为2.2。整个系统Gamma为1。若是有朝一日,32位每通道文件成为主流格式,Gamma校正就会消失。自然数据不经校正直接记录为文件数据,再不经校正直接显示。

 

所以

二位大大的解释是非常简洁有力的标准答案,我也是妥妥的给点赞,我作为一个喜欢刨根问底的硬件外行,CG爱好者,从另一个视角进行逻辑解读,分享一下个人对Gamma问题认知的过程,以飨读者。

 

 

感谢

等朋友关于这个话题的讨论,全文推翻重写,所以还是想反馈一下给各位。

 

 
高票答案已经把Gamma解释的很透彻了,试着从其他角度说说,权作补充。
1. 一个典型的完整图像处理系统主要包括摄像采集部件、存储传输部件和显示输出部件。这三个部分中都可以引入Gamma的概念。按照国际组织ITU的标准如sRGB,常见的摄像部件中Gamma处理过程称为Gamma预校正,推荐值为1/2.2=0.4545...,而显示部件中Gamma推荐值为2.2。两者相抵最终呈现给观察者的系统Gamma则等于1。但作为一名工程师,个人看法(纯属个人看法)是:其一,标准制定主要是面向生产商,解决市面产品(摄像机和显示器)的兼容性问题,显示部件未必一定得是2.2,只是市面上占多罢了;其二,只要你能保证整个系统的最终Gamma值为1,又何妨一定要限制摄像机是0.45、显示器一定是2.2呢?苹果的Macintosh的Gamma值不就没遵从这些值么,人家的系统做成封闭的,最后给你一个总Gamma=1也就行了呗。事实上业内也都承认苹果的系统在色彩管理上也是做的最好的。
结合这个图我小个结:不管图像处理流程多复杂,Gamma值的确定视该系统最终的用途而定:如果你通过摄像机采集、处理并最终是给用户通过显示器看的,中间各环节的Gamma值你自己定,满足最后总Gamma等于1就行(当然,不等1也可以,见下述),因为直接进入用户眼睛的就是线性光,没经过什么Gamma变换(这和光进入人眼后的对数型感知不是一回事哦);如果你只是想搞个传感器(如摄像机),模拟一下人眼感知,那好,就设个1/2.2吧,这个高票答案中解释了为甚么是2.2.
===========不感兴趣的可以return的分割线===============
2. 上面那段其实还隐藏了几个问题:
  • 总Gamma不等于1可不可以?

       当然可以,如果最后是人来做主观评估,系统的总Gamma值其实稍微大一点点更好,因为暗部略微拉低点,会起到画面对比度增强的效果,看起来没准你更喜欢。所以以下会看到系统总Gamma不等1的情况,按照

同学的说法,就是会用到没经过补偿至2.2的显示器,也就希望不必纠结于这个问题了。

 

  • 不是说三个组成部件中都有Gamma么,怎么只是提到了Scanner/Camera和Display,没说那个传输存储处理部件啊?

别急,下面会提到。只是我们平时遇到的情况多是不考虑传输存储部件(如电脑,下称中间部件)的情况,也就是输入中间部件的都是经过Gamma预校正的信号,如输入电脑的照片和电影视频,这些都是照相机或摄像机采集生成的。但在计算机图形学、平面设计、游戏设计等领域应该会用到中间部件的Gamma。看下图:

先解释四列:第一列是采集部件(扫描仪、摄像机、照相机等输入设备)的Gamma值;第二列是你看到的图片或视频的存储值(显示前放在显卡的帧buffer中);第三列是应用到存储buffer的查找表(实际就是显卡Gamma变换LUT表,可为1);第四列就是显示部件(你的显示器)的Gamma值(需要注意:上图中显示器2.5一律是未补偿Gamma值,没准你用的满足sRGB标准的显示器,那就该是2.2了)。

第一行就是在电脑上看视频看电影时你会经历的Gamma变换历程,第一列Gamma Correction当然是摄像机里已经完成的0.4545...变换,你的播放器和你的显卡都不会再做其他处理(中间环节省略),直接跳到显示器播吧(总Gamma就是1.25,如果显示器Gamma是2.2则总Gamma就是1了)。当然如果你在电脑上做个设计,但未用到帧缓存中的查找表或将其设为Gamma=1,则也归入此类。

第二行就是真正做平面设计人员们情况了。图片图形都是你自己生成的,所以采集端Gamma=1,帧缓存Gamma设为1/2.2(可理解为你的软件如Photoshop中设定的Gamma Correction),然后显示Gamma为2.5,最后总Gamma=1.14。

第三行SGI工作站,现在用的人少了吧,反正我没用过。

第四行苹果的Macintosh系统,它家的扫描仪Gamma=1/1.72,它家的QuickDraw软件存放生成的RGB值,用到帧缓存Gamma=1/1.45,然后送到它家2.5的显示器,出来总Gamma结果是1.0。这才是完全封闭的系统,每个环节都可控。

==============要去睡觉的分割线=============

好吧,最后我也得承认我是在都书袋子,以上各图来自Charles Poynton的《The rehabilitation of gamma》,加入了我自己的一些理解,如有谬误请纠正为盼。

1:人眼对暗部细节比较敏感。 2:图片文件的色阶很有限。图像的来龙去脉:自然界捕获的图像->图像存储和处理->显示器输出,两头的颜色数量都是非常丰富的,但是中间的存储和处理出于存储容量和渲染时带宽的限制,24位色图片每个通道只有2^8个色阶,总共只能显示2^24种颜色。

基于以上两点,我们需要在整个图像来龙去脉中尽可能保留暗部细节,亮部细节丢掉一些也无所谓。因此有了pow(color, 1/2.2)这个gamma encoding操作,使暗部细节也分到更多色阶。得到一张比较“亮”的图片存储起来。这张图片虽然暗部细节都保留下来了,但是不能直接看这张“亮”的图片,那只是一个中间产物而已。我们需要显示器做一个pow(color, 2.2)的gamma decoding操作把它压暗,因为显示器(特别是高端显示器)的颜色数是远大于2^24的,这个操作并不会在压暗的过程中丢失暗部细节。

总结一下,gamma校正存在的本质原因是:是受限于有限存储空间及渲染带宽,需要在整个图像的流转各级转换中尽可能保留暗部细节,以满足人眼对暗部敏感的需求。人最终看到显示器显示图像和最初从自然界捕获的图像大体是无差别的,只是暗部细节损失少,亮部细节损失多罢了。

之前的答案说了很多,资料也很丰富,但在原理上还没有说通透:

简而言之,gamma值就是对动态范围内亮度的非线性存储/还原算法。

1.   gamma值的存在,归根到底,是一个解决方案,用于化解“无限的自然存在,与有限的存储容量/传输带宽”之间的矛盾。

自然界中存在的亮度范围是巨大的:日光环境下100000勒克斯,阴天环境8000 lux,室内办公环境300 lux,路灯下5 lux,星光0.0003 lux……

很显然,亮度级别太多太多。如此庞大的动态范围,如果按照线性方案进行存储,那么存储/传输的代价很昂贵。

2.   人类对于外界刺激变化程度的感受,是指数形式的(或者说感受到的是外界物理量变化的对数)。例如,10倍的声音我们感受到10分贝的变化,100倍的声音对应20分贝感受变化,1000倍对应30分贝感受……

人们对于物体明亮程度的主观感受,也遵循指数规律。1盏灯→2盏灯产生的亮度变化感受,与2盏灯→4盏灯的变化感受是相同的,也就是说2倍物理亮度改变让我们感受到1“档”变化,4倍物理亮度改变产生2“档”感受改变,8倍亮度对应3“档”主观改变……

根据实验测定,人类对明亮程度的主观感受,线性对应于物理亮度的2.2次方(实际测试结果为1.8-3.5不等,与测试环境的明暗程度有关,也与受试人群有关。)

3.  综合1、2两点,非线性存储方案就是很自然的结论,gamma=2.2就成了影视业的业界标准,并进而成为电脑、IT界的事实标准。

(这种方案有点类似于IEEE浮点数的存储方案:单精度浮点数只用了4个字节,就表示出了10e-38到10e+38的巨大动态范围(此处不考虑0和负数),且在整个动态范围内其相对误差基本固定)

4.  gamma值的变换分为两个部分

·   实际亮度→内部存储(或信号传输):存储数值≒物理亮度的1/2.2次方。在限定条件下,这保证了低亮度的分辨精度,降低了高亮度的量化存储开销,从而在总体上获得了最佳效果(亦即小的存储/传输代价,大的动态范围,最多的线性主观感受级别)。这个环节对应于摄像、sRGB图片存储过程。

·   内部存储(或信号传输)→显示还原:显示物理亮度≒存储数值的2.2次方。这个环节对应于摄像、sRGB图片的显示(还原)过程。

---------------------------

原理性介绍完毕,下面是一些对gamma使用的细节性介绍:

①    在目前电脑体系中,一般图片使用sRGB方案,其灰度级别0、1、2…255,对应于线性的主观亮度感受(物理亮度则是非线性的)。

使用gamma=2.2是正确还原大多数图片的必要选择。(鉴于环境明暗的影响,实际上根据环境亮度而在1.8-2.5范围内调整gamma值有其道理)

②   对于完整的摄制(绘图)→存储/传输→显示还原,其整体gamma应接近于1,所谓所见即所得。

当整体gamma不为1时,就类似于音响加了均衡器,可能更适合用户口味但不保真。

③   本机制作的图片/视频还原时,在本机上会保持原样,与gamma值无关。

但考虑到交换/传输到其他机器上,则两个机器gamma值相同时才会有同样的还原结果。所以本机gamma值还是设为2.2为好。(不考虑交换的请随意,用户至上^_^)

④   对一个现有图片,在指定显示器上还原时,其总体明暗范围固定。

为观察图片细节,调整显示gamma值是为了让某些细节更清晰,代价是让另一部分不容易分辨细节。

·    当调大gamma时,表现为总体提亮,原暗部占据更多明暗范围、易于分辨细节,原亮部变得更亮(白茫茫,占据明暗范围减小)且细节分辨变得困难。

·    当减小gamma时,表现为总体压暗,原亮部占据更多明暗范围、易于分辨细节,原暗部变得更暗(黑乎乎,占据明暗范围减小)且细节分辨变得困难。

⑤   纯黑(亮度0)、纯白(亮度255)的交错网点进行模糊,其平均亮度为50%。在gamma=1的机器上,这与灰度128是接近的;在gamma=2.2的环境下,这与灰度186是接近的(这是gamma=2.2规则所决定的,也可勉强理解为硬性规定)。

⑥   电脑显示系统的亮度动态范围有限,所以黑屋子的背景是黑色,黑屋子里黑纸上的黑色钢笔字还是黑色;白墙是白色,白炽灯、闪光灯、正午太阳也还是白色。这些不在讨论范围之内。

(以上均以灰度作为介绍,RGB单通道的gamma值基本类似)

Gamma Correction的概念的确比较抽象,但在计算机图形学中非常重要。一般的解释,比方说已有的答案中,往往忽略两个背景知识:人类的视觉特性和古老的 CRT 显示器。在我看过的所有资料中,都没有人提到过,Gamma 的广泛应用很大程度上是因为一个神奇的巧合。

从字面上看,Gamma指的是指数运算中的指数。比方说 A 的2.2次方,Gamma 指的就是2.2这个数字。计算机图形学中颜色值,特别是 RGBA 值都是用0到1的浮点数表示。颜色的 Gamma 矫正本质上就是一系列介于0到1之间的浮点数进行指数运算,通常来说这个数字是2.2。

为什么要进行矫正?为什么是2.2?

从人类的视觉特性说起。人类的视觉系统进化出了一个特性,黑暗环境下的辨识能力要强于明亮环境,这可能有助于我们及时发现黑暗中隐藏的危险。如果有兴趣,可以在计算机上绘制一条从白到黑的渐变条,你会发现明显黑色部分的色阶要多于白色部分。这并不是你的显示器问题(当然也有可能真的是你的显示器太差……),而是因为我们对于暗色的分辨能力远超过亮色。那么在有限的计算机颜色(民用显示器和操作系统中黑色到白色256个色阶)中,亮色和暗色均匀分布的话,那亮色部分就会精度过剩而暗色部分就会精度不足。如何解决这个问题?进行 Gamma 矫正。

上图中的红色虚线就是图像的 Gamma 矫正曲线,一般都是2.2的倒数,0.454545..。观察矫正以后的曲线,原来0到0.5的区间被扩展到了0到~0.73,相应的大于0.5的区间被压缩到只有原来的一半左右。这样通过一次简单的计算,我们达到了不增加数据量的前提下提高可辨识精度(Perceptual precision)的目的。可能从来没有人告诉过你,存储在你硬盘上的图像,都是矫正过的,如下图,中间那个。

当然有人可能会问,矫正以后岂不是丧失了很多亮部的细节,也不合算呀。这个问题取决于存储的数据格式,一般的格式都有足够多的冗余精度,足有保存矫正前后的所有细节,但是对于某些特定的压缩格式,比方说游戏普遍使用的 DXT 压缩格式,精度只有6Bit,也就是64阶,Gamma矫正后很多细节永久丧失了(当然压缩算法也会丢失很多)。

 

现在我们知道了对图像进行 Gamma 矫正的本质上的原因——因为我们的眼睛。那么为什么是2.2的倒数?

因为老式的 CRT 显示器。

阴极管显示器有一个物理特性——输入值和输出值呈现指数关系,这个指数是2.2。也就是说,当你输入0.5的亮度,在屏幕上得到的不是0.5,而是0.5的2.2次方,约等于0.218。仍旧是这个图:

下面的曲线就是 CRT 显示器的 Gamma 曲线。

 

当我们在 CRT 显示器上显示一张 Gamma 矫正过的图像,也就是上面的那根曲线,就会获得所期望的线性图像——中间那跟灰色的直线。你看,对图像进行Gamma 矫正即可以获得我们想要的精度,又能在 CRT 显示器上正确显示,这岂不是一个美好的巧合?

事实上我们之所以选择2.2的倒数进行图像矫正,那是为了迎合 CRT 显示器的特性。如果显示器的 Gamma 值不是2.2,那么图像矫正 Gamma 值也需要相应变更,比方说早年的 Mac 操作系统都是使用1.8的 Gamma 值。现代的 LCD 显示器已经不再具有这个特性,但是生产厂商仍旧会加入模拟 Gamma 曲线的硬件功能,也就是说所有显示器都期待软件输出 Gamma 矫正过的图像。

总结一下,所谓 Gamma 矫正就是对颜色进行指数运算。对图像进行矫正是为了获得符合人眼特性的可辨识精度。矫正使用的Gamma 值取决于显示器,现代系统基本上都统一使用2.2。

Gamma 矫正的确是一个隐藏的比较深的问题,别说普通人,长久以来游戏界也一直没有重视。计算机图形学中的算法普遍需要输入值处于线性空间,而读入的图像却都是矫正过的——处于 Gamma 空间。最终得到的计算结果自然也是不正确的。当然游戏图像往往可以通过美术师的人为修改来得到符合期望的图像,但从数学上来说,这是错误的……而且整个行业错了几十年,直到这几年这个问题才被重视起来,产生了所谓了 Gamma Corrected Pipeline。

左侧是一张真实的照片,右侧上方是线性空间(正确)的运算结果,下方是 Gamma 空间(错误)的结果。这种错误的结果我们用了很久……

 

3D 图像的渲染本质上是对真实世界进行模拟,近几年(特别是2014年)兴起的 Physically Based Rendering 特别强调贴图材质灯光的统一性和物理真实的渲染效果,自然不能容忍在整个系统的底层存在不正确的 Gamma 矫正这样的大乌龙……

要达到这样的实时渲染效果,Gamma 一定要搞对……

 

希望我这个回答能让读者彻底搞清楚 Gamma Correction 的来龙去脉。如果仍旧有疑惑,请留言。

后学末进才疏学浅,试图用不那么抽象的方式聊聊我理解的颜色空间。

必然有误与疏漏,恳请各位大大指正,拜谢。

参考了

  以及参与本题目的所有大大~。

 

以及 【图形学】我理解的伽马校正(Gamma Correction) [Unity3d]总结Gamma Space与Linear Space Unity3D - 颜色空间 (Color Space)

一、颜色空间

  • 做图形相关工作的大多都见过颜色空间这么四个字,它里面包含Gamma颜色空间和线性颜色空间。

线性空间:颜色按线性渐变的空间

Gamma空间:暂时理解为颜色不按线性渐变的空间

——这不是废话嘛,问题来了:

  • 线性空间好理解,颜色按线性渐变。
    • 你可以理解为一个为一个纯黑墨水池子,每次往里加一滴(等量)纯白色颜料,颜色逐渐变浅,直到纯白。记录下每次的色值,你就得到了一个从黑到白的线性渐变。
    • 使用线性渐变的颜色空间,咱们就叫他线性空间。

 

  • 既然有线性空间,就一定有不是线性的空间——Gamma空间。

二、Gamma是啥

正式讲Gamma是啥之前,咱们先做一个有趣的对比试验:

(一)第一步

  1. 这是我在PHOTOSHOP中新建一个文件,如下图:
  2. (话说你要是不信我的图,你自己也可也去PS里建一个~)
  • 图1:500*150 / 分辨率75 / 颜色模式RGB 8位 / 背景白色
  • 然后从左(黑)到右(白),水平拉一条渐变,起点终点位于画布左右两端。

来让我们进行如下操作:

  • 找出图1中你认为的明暗分界线的大概位置。说的直白一点,你认为亮部和暗部大概从哪里分割比较合适。
  • 我估摸着大多数人选择的位置应该是下图红线(或差不多)的位置吧?

 

  • 在图1里,我们之所以选择了一个大概在中间的位置做明暗分界线,是因为我们认为红线左面(暗部)和红线右面(亮部)的信息一样多。
    • 因为最左面是纯黑,最右面是纯白,而且咱们对这个渐变过程的体验也挺自然。
    • 对于黑,白,渐变过程自然这三点咱们应该都没什么异议。
    • 所以自然暗部亮部信息一样多,否则就是渐变不自然嘛~

 

  • 现在,和你的大电脑击掌庆祝吧!巧了,它也是这么认为的。你们在图1的明暗分界线这一点上,达成了令人惊喜的共识。
  • 你问我怎么知道电脑也是这么认为的?当然是一系列缜密优雅又符合逻辑的数学运算————跟着我进行如下骚操作:
    • 打开你的大QQ,用它的截图工具的大箭头,瞄准图1最(“最!”敲黑板)左面,最黑的地方,观察箭头数值,是不是RGB(0,0,0),嗯,记在心里或本儿上。
    • 好,咱们再去最(敲黑板)右面,最白的地方,大箭头瞄准它,是不是RGB(255,255,255)?差那么1-2个数的,一定是你自己撸多了手抖吸不准,也别较这个真儿了,无所谓的,差不太多就得了。
    • 现在咱们去红线附近吸一吸~注意别傻乎乎的去吸红线的红色,要吸红线附近的灰色,咱们观察的是从黑到白的渐变,跟红没关系。你在红线低端或者顶端吸都行。
    • RGB数值是多少?是不是RGB(128,128,128)左右?
    • 重点来了!缜密优雅又符合逻辑的数学运算来了!现在我们知道从黑到白是从0-255的过程,那么我们开始计算——255+1(+1是为了0,0,0占去的那1位,也就是说黑到白经过了256个过程),再除以2,我们得到了这个渐变的中间点,咔嚓——结果正好是128!
    • 惊不惊喜,意不意外?————把这个128,128,128记在心里,他就是你和你家大电脑都认为的明暗分界线,也就是中间亮度。这个结果合情合理符合逻辑。

 

  • 这时,相信你一定有一个疑问,为什么是256?这就要说到这张图片的格式了——RGB8位,这个格式是电脑用来存储图片的,你可能听说过的sRGB也是8位的。
    • 8位代表了什么?8代表2进制的2的8次幂,就是256。也就是说它代表三原色(红绿蓝RGB)的色阶最多只有256(从0到255)种,就是256种红,256种绿,256种蓝,用这么多的颜色我们能调成256 X 256 X 256 = 16777216种颜色。怎么样,够你折腾了吧?说实话,并不是所有人都能分辨出256种不同的红,反正我是不能~

 

  • 那为什么要有8位图?因为8位图的色彩够你折腾了啊!在这么多色彩给你折腾的前提下,占用的存储空间也比较小啊!
    • 再观察图1,注意图一边框下部的:文档:219.7K,看到木有,还不到1/4MB啊!一张500*150大小的图还不到1/4MB啊!你拿8位图网络传输、做个贴图渲染什么的,存储空间成本和效率成本都比较好啊。
    • 所以!(敲黑板),拿页游,手游举例,等一系列对图像品质要求不高的平台,我们使用的贴图都是8位的,你听说过的sRGB也是8位的,没听说过就无视。因为8位占空间小,色彩表现能力(数量)又符合平台需求,渲染效率更符合平台能力(比如适合网络传输,适合手机GPU渲染等)。

 

  • 好了,说了这么多,你得到了两个新姿势!
    • a. 从黑到白的明暗分界线的色阶是RGB(128,128,128)。
    • b. RGB8位是什么,有什么用。
    • c. 我有姿势我自豪。

 

(二)第二步

  • 既然是对比试验,就一定要有对比对象,下面我们来进行第二步:
  • 下面是我在PHOTOSHOP中新建的另一个文件。
  • 如下图:(建议你照着我的,去PS里再建一个~一会可能用得到)。
  • 图2:500*150 / 分辨率75 / 颜色模式RGB 32位 / 背景白色。
  • 然后从左(黑)到右(白),水平拉一条渐变,起点终点位于画布左右两端。

咱们都知道了一个从黑到白的渐变里,明暗分界线的色阶是RGB128,COMEON,咱们在图2里找到这个点!

  • 掏出QQ截图的大箭头,瞄准图2,在上面移动箭头,找RGB(128,128,128)。

 

    • ……傻了吧?无语了吧?纠结了吧?为什么不在中间了?而是出现在了约等于渐变过程0.2的位置?
    • 为什么明暗分界线跑到了0.2的位置,少了的30%的暗部去哪了,相应的多了30%的亮部又是什么鬼?而且这个渐变过程看起来好像不自然啊,白的那么多,黑的太少了!
    • 好的,你提出了三个问题,暗部减少,亮部增多,渐变不自然。

 

(三)下面我们依次回答这三个问题:

  • 1. 暗部去哪了:
    • 暗部没减少,反倒增多了。
    • 因为图片格式变成了32位,它有了更多的色阶来表现颜色。
    • 你不应该再用QQ吸管,而是应该去PS里建一个32位RGB图片观察色板。
    • 它不再是RGB0-255,而是变成了0.0000-1.0000。
    • 代表了RGB三原色的更多色阶。
    • 你之前划分的暗部仍然在红线的左侧,那128个暗部色值都没有消失。
    • 相反,32位图提供了更多的色阶来表现暗部,数量也远大于128。具体数量不需要关心,也不是2的32次方,感兴趣的可以自行查阅32位RGB,不在本文展开。
    • 也就是说32位格式下,使用了0.2的空间,表现了8位格式下占一半的暗部,不仅如此,还附送了多得多的暗部细节,因为色阶变多了嘛,虽然作为人类,我们可能感受不到那么多色阶变化..。

 

  • 2. 亮部增多了:
    • 没错,确实多出来许多的亮部信息。
    • 32位格式下,多出来的亮部信息,包含8位原本的亮部信息,以及大量你可能难以区分的亮部信息。
    • 至于原因,下文看完就懂了。

 

  • 3. 渐变不自然
    • “黑少白多,渐变不自然”————那是你以为。
    • 这才是自然界中真实的渐变,因为这才是线性的,每次滴入等量白色颜料的从黑到白的渐变。
    • 之所以你会觉得渐变不自然,是因为人类的眼睛对暗部的变化更为敏感(至于理论方面的依据,请自行搜索,本文只说结论)。

(图中的英文意思是:基本相同。)

    • 综上所述,你之所以会认为一个线性的渐变过程“不自然”,是因为你对亮部的细节变化不敏感,或者难以察觉。因此得出了“黑少白多,渐变不自然”的结论。
    • 也就是说,你觉得32位下的线性渐变,亮部区域出现了过多的冗余信息。

 

(四)通过32位的线性渐变,我们得出了一个什么结论:

  • 原本我们在8位图中找到的明暗分界线RGB(128,128,128)在自然界的线性渐变中,大致处于前20%的位置,即0.2的位置。
  • 之前的8位图1欺骗了我们,它如实的把你认为的0.5老老实实的记做了0.5,而不是实际的0.2。它出了问题。
  • 跟着我唱:“你说黑不是黑,你说的白是什么白~~”。

 

(五)8位图为什么要骗我

  • 8位图君:
    • 我也不想啊,我要是把你认为的明暗分界线转(0.5)换成实际线性渐变记成0.2,色阶不够用啊。
    • 你们人类对于暗部敏感,我要是把你认为的0.5,记成0.2,那暗部色阶就只有256*0.2=50个左右的色阶来存储暗部,50个左右,明显不够用啊。
    • 然后余下的色阶却要用来表现你们人类可能感受不到的亮部,太浪费啊。色阶有限啊。
    • 所以我只能把你认为的明暗分界线就记做0.5,然后去掉一部分你们感受不明显的亮部色阶,以此换来跟多的暗部色阶存储空间,来适应你们人类的感受啊。

 

(六)8位图怎么把那个实际的0.2,转换成0.5的?

  • 当然不是直接的把0.2记成0.5就行了。
  • 0.2-0.5的转换过程本质上是一个全局提亮的过程,这个过程被称作Gamma校正。

三、迟来的正文

(一)Gamma校正

  • Gamma校正被使用在8位RGB图中。
  • 用来解决在有限的存储空间中保存尽可能多的人类感受敏感的色彩内容。

(二)Gamma怎么校正

  • Gamma校正的方式就是采样时,和输出到显示器给人类看时,对亮度进行的调整.
  • 采样时 Gamma=1/2.2 调亮Gamma
  • 显示时 Gamma=2.2 调暗Gamma
  • 下图:配合后文说明看下图 , 彩色曲线为Gamma曲线

 

  • 实际亮度(X轴)=>内部存储(Y轴) 存储数值 = 物理亮度的1/2.2次方
    • (即对应使用1/2.2位置的Gamma曲线)
    • 假设实际亮度X轴为0.2,存储数值将为0.2的1/2.2次方,即Y轴0.5

 

  • 内部存储(X轴)=>显示还原(Y轴) 显示的物理亮度 = 存储数值的2.2次方
    • (即对应使用2.2位置的Gamma曲线)
    • 假设内部存储X轴为0.5,显示物理亮度将为0.5的2.2次方,即Y轴0.2

 

(三)Gamma校正与8位图

  • 看完上面的说明,有点抽象了吧?没关系,咱们直接说结果。
  • 8位图使用的颜色就经过Gamma校正过的颜色。
  • 经过Gamma校正后,得到了更多的暗部存储空间,牺牲掉了一些不重要的亮部存储空间。
  • 它把你认为的0.2通过Gamma校正成了0.5,因为Gamma校正本身是一个非线性的调整过程(观察Gamma曲线图:Gamma为1,即是中间那条直线,表示未校正,那么Gamma为1时,渐变是线性的。其他的不是直线,不是直线你就当他是非线性,好理解吧?)。
  • 那么问题来了:显示器显示8位图片时,我们已知现在主流显示器的色彩要大于8位,多数都是32位真彩色,那么请问,显示器接受到8位图片存储的0.5时,显示的是32位颜色中(以图2位例)0.5位置的颜色,还是0.2位置的颜色。
  • 没错,显示器显示的时候也经过了一次Gamma校正,它把0.5又变成了0.2.
  • 如果不经过这一步,直接输出0.5,因为显示器是32位的,那么你在屏幕上得到的将是位于图2中间位置的那个颜色,你会说这个显示器有问题,颜色不准确,亮瞎了。
  • 综上所述,我们用了一大圈,总算明白了8位图为什么是非线性的。

四、Gamma色彩空间与线性色彩空间与渲染

  • 色彩空间简单的理解就是我们在创作一张图片时使用的颜色表。
  • 线性色彩空间就是没经过Gamma校正的颜色表 - 如图2。

 

  • 非线性的色彩空间就是经过Gamma校正的颜色表 - 如图1。

 

(一)渲染时使用的颜色空间

  • 在下刚学Unity,所以只能拿Unity举例:
  • 在Unity渲染中,存在两个颜色空间
  1. Gamma(非线性)颜色空间
  2. Linear(线性)颜色空间
  3. 现在再来看这两个颜色空间应该不陌生了吧,至少我们知道他们表达的是什么意思。
  4. Gamma颜色空间里使用的是一个进过校正(阉割)过的颜色表。
  5. Linear颜色空间里使用的是一个线性的完整的颜色表。

(二)渲染

  • 渲染是一个很复杂的过程,涉及步骤有许多,不在此展开讨论。
  • 但无论多复杂的过程,多复杂的灯光、材质等等乱七八糟的东西,它始终离不开图片,颜色。
  • 图片是通过颜色空间中的颜色创作出来的,那它就一定存在着一个问题,是否经过Gamma校正。

(三)Linear颜色空间

  • 在Unity中,如果使用Linear颜色空间,除非对指定图片选择了ByPass sRGB(忽略sRGB,你理解为忽略Gamma校正),否则所有的图片都会默认变成sRGB格式。
  • 这样做的目的是把你在Gamma颜色空间里创作的图片里面的颜色给校正到正确的32位颜色,再参与GPU渲染计算。
  • ByPass sRGB的意思就是直接使用这个0.5,不用再校正了,除非你是在线性颜色空间里创作的图片,否则不建议这么干。
  • 然后,GPU再把结果Gamma校正一次,0.2-0.5,这样做的目的是:显示器不管你到底干了什么,他老人家是一定要在最后Gamma校正一次的(0.5-0.2)。
  • 显示器按照接受到的值进行Gamma校正(0.5校正到0.2)给你看。
  • 在这个空间里进行渲染,因为使用的是线性的颜色空间,因此你会得到非常真实的表现效果。
  • 但是,因为色彩丰富的同时,带来的各项成本,如硬件渲染能力的需求也会增加。

(四)Gamma颜色空间

  • 在这个颜色空间内渲染,GPU不会再Gamma校正,而是直接使用存储的值参与渲染计算,因为大家使用的都是阉割版的颜色嘛。
  • 但是在这个空间里进行的渲染,因为使用的是阉割过的Gamma颜色空间,因此你会得到不符合真实表现的效果。
  • 在最终输出到显示器的时候,仍然会经过Gamma校正,将渲染后的0.5,表现成0.2给你看。
  • 因为使用了较少的颜色(相对于线性颜色空间),因此会得到比较好的渲染效率以及较低的渲染能力需求。但是图像会存在失真(偏暗,因为亮部细节表现不够)等一系列问题。
  • 下图这种现象的成因,就是本文讨论的内容。
  • Gamma颜色空间的亮部信息缺失,造成了数值上升时亮度变化过快,画面迅速变白。

了解很少,只能简述供参考。

色彩管理中提到的「Gamma 校正」,一般是指在色值(或信号数值)的编码 / 解码过程中,对数值进行的非线性处理——简而言之,对输入数值进行一次幂运算(可能会再乘以某个系数),然后得到输出数值。上述幂运算中使用到的幂值,通常记作 gamma (γ)。

一个最简单的例子: V_{out} = V_{in}^{2.2}

这个关系式中,数值「2.2」就是一个解码 gamma 值,常见于辉度(luminance)校正。
上头的答案都很抽象与专业,我回答一下通俗的。 伽马值,简单来说就是灰度。这是早期显示器与人眼的光学研究的一种适应参数。一般游戏里面你弄到眼睛看得舒服就好了。 你可以像调整亮度对比度这些放一起调整就好了。
说人话的简要原理解释如下: 假设人的亮度识别范围是1度-9度,如果一张图上的点亮度都在1到3度,那么这个图会太暗,我们可以把原亮度都平方一下,那就变1-9度的亮度,看起来就比原来亮多了,舒服多了。 同时原来的2变成4,2.5变成6.25,原来0.5度的亮度差变成2.25度的亮度差,意味着我们可以比原来更清楚的看到更多细节。 实际的算法和人眼的识别范围,包括显示器特性等,可才看高票答案。

这里有一个视频介绍gamma校正的,通俗易懂,可结合大神们的答案食用

【分钟物理】电脑颜色是错的[中英字幕]_趣味科普人文_科技_bilibili_哔哩哔哩

楼上一些答案已经被回答者自己臆想,加了很多自己的想法,不敢苟同。如有兴趣可自行研究参考文献(图片中已有标注):

参考文献:

维基百科 Gamma correction(英文版)

Poynton\'s Gamma FAQ and Color FAQ

网址

Cambridge in colour                            

网址

Peachpit

Color Correction in Adobe After Effects CS3 可关注微信公众号:小7的背包

反对知乎关于个人隐私设置,本人不再在知乎做任何回答

之前我写过一个关于gamma校正的笔记,并不是很专业,但自认为还是讲得比较明白。

输入处于灰阶中心位置。但未校正前,输出大于感官中心值,在感官中心偏右;校正后,输出才处于感官中心位置,能和输入线性对应。

有个问题需要指出: “我们是可以用一个幂函数来描述客观自然数值和主观心理感知的对应关系的(等比数列通项公式就是幂函数)”,等比数列通项公式是一个指数函数的规律(底数是常熟,指数包含了自变量),而不是幂函数规律,所以,假设Gamma幂函数曲线是对的,但是从韦伯定律(等比通项规律)来引申出伽马函数曲线是很牵强的。意思也就是说,假设Gamma曲线是对的,关于Gamma曲线所基于的现实原理仍未找到。
感谢各位大神的分析,我只想说一句:灰阶是从0-255,共256个灰阶,中间灰阶是127!
gamma只是一个函数变量。 应该回归信号处理的本质。 我抛个砖头,专家补充。
感谢作者,让我们这些外行也看得懂。我转载到了 CSDN,有注明出处及作者。
正好上学期摄像课有这个作业 What is GAMMA? Gamma is a numerical value that indicates the relationship between the input and the output signals of a camera/monitor, as illustrated in the graph below. Generally, the straighter the gamma curve becomes (γ=1), the more natural the image appears to the human eye. Because monitors have a gamma curve with a value of 2.2, the camera is usually set up with a reverse 0.45 gamma so the resultant curve is close to a straight line. The lower area of the curve affects dark colors while the higher area determines the colors close to white. The middle area represents colors in-between. The GAMMA function mainly corrects the color of middle areas of the curve.
Gamma值是灰阶亮度值与灰阶等级之间的数学关系。灰阶从暗到亮分为256级的话,把亮度也分为256级,假设最暗的亮度为1,最亮的亮度为201,gamma值为2.2,那么第5阶的亮度=(201-1)*(5 / 256)^2.2 + 1,“^2.2”是2.2次方的意思【如果这点数学知识还回老师,就算了,来找我吧】

其实很简单,就是指数,幂运算的上标。不要搞得太复杂,神秘。举个例子对于gamma 值1.8而言就是把原有图像的每个像素颜色进行幂运算,上标1.8.类似的还有log。。。

如果你对Color grading 很感兴趣的话,应该从对 color space 的了解入手,否则,去谈gamma 啊,log 啊等等都是缘木求鱼。

色彩校正中的 gamma 值是什么? - 知乎
https://www.zhihu.com/question/27467127
色彩校正中的 gamma 值是什么? - 知乎
https://www.zhihu.com/question/27467127
色彩校正中的 gamma 值是什么? - 知乎
https://www.zhihu.com/question/27467127
色彩校正中的 gamma 值是什么? - 知乎
https://www.zhihu.com/question/27467127
色彩校正中的 gamma 值是什么? - 知乎
https://www.zhihu.com/question/27467127

分类:

技术点:

相关文章:

  • 2021-12-14
  • 2021-12-26
  • 2021-10-18
  • 2021-11-29
  • 2021-06-14
  • 2021-06-22
  • 2021-12-26
猜你喜欢
  • 2021-11-19
  • 2021-12-26
  • 2021-09-22
  • 2021-12-26
  • 2021-12-26
相关资源
相似解决方案