关于gamma校正

gamma无处不在,是很基本重要又容易忽视的概念

gamma用在哪?

经常用ps,渲染,照相机摄影机,显示器都会遇到gamma这个概念,渲染的图片过暗过亮,都有可能是gamma值不对出的问题

简单的说gamma是非线性的亮度采集与还原

笔记整理自韩世麟的科普和网上资料,我在文章末尾附上链接

为什么有gamma校正?

人眼对于明和暗的敏感程度是不一样的,人眼以为的黑至白的渐变( A),实际上并不物理,物理亮度均匀增加,看起来并不是均匀的(B),人眼对越亮的东西,感受就会不那么敏感。举例:一间暗屋子里,一根蜡烛,多点一根,可以感受到明显的亮度变化,一百根蜡烛再多点一根,就几乎察觉不到变化了。

人眼的感受和物理亮度的对应关系(gamma= 1/2.2)

题外话:人的很多感官都不是线性的,听觉,冷热的感觉,开始觉得强烈,随着强度增强慢慢变得迟钝,感情方面也是这样呢,如果能用物理数据表示爱的强烈程度,再用组数据表示我们对爱的感受,说不定也会有爱的gamma(滑稽

现实中超亮与超暗的物体之间的差异如此巨大,想要把图像数据存储下来,根据人眼特性,适当压缩是很自然的做法。(可以这么理解gamma,但gamma起源可以追溯到显像管刚发明的时候CRT时代。包括后来的sRGB标准,其实并没有考虑人眼的主观感受)

物理上的中灰大致对应于人眼中灰的21.8%(0.218)(0是黑,1是白)

这是一个解决方案,用于化解“无限的自然存在,与有限的存储容量/传输带宽”之间的矛盾。

自然界中存在的亮度范围是巨大的:日光环境下100000勒克斯,阴天环境8000 lux,室内办公环境300 lux,路灯下5 lux,星光0.0003 lux……很显然,亮度级别太多太多。如此庞大的动态范围,如果按照线性方案进行存储,那么存储/传输的代价很昂贵。

知乎《色彩校正中的gamma值是什么?》

(图片来自https://www.bilibili.com/video/BV15t411Y7cf?t=403)

对于8位每通道的图片来说,每通道只有256个灰阶,如果不算gamma,物理中灰,会落在56左右,暗部的跨阶会很大,会有明显的段落感,就是说暗部的细节会明显不够,而亮部就显得有些浪费了。如果做gamma矫正,把0.218(美术中灰)提到0.5,亮部暗部就各分配到128,这样这张图片,才能更好的保存我们人眼感兴趣的信息。

gamma的转换

实际亮度/物理数据→内部存储/美术数据(或信号传输):

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

所以JPG PNG这些图片,大多数都是8位/通道的,每个像素每通道256个颜色,都是经过gamma矫正的,如果直接贴进物理渲染器,可能会有问题,要注意设置。

内部存储(或信号传输)→显示还原:

显示物理亮度=存储数值的2.2次方。这个环节对应于摄像、sRGB图片的显示(还原)过程。 显示器一般默认gamma就是2.2

photoshop中的问题

因为ps通常是在8位通道的非线性空间下工作的,在此基础上进行的数值计算与线性空间相比,结果会有差别,很多人没有注意到这个问题

举个栗子:

左边两种柔化笔刷相交处明显要偏黑,在32位模式下则看起来很自然

因为两种笔刷混合,其实是每个像素alpha信息的计算,非线性的像素数值,进行线性的方程计算,结果会不太理想

另外有高频信息的素材缩放/高斯模糊以后也会有同样的问题,结果会比应有的暗

如果介意这些问题,推荐把模式切换成32位的,做完以后再切回8位保存

blender中的线性渲染设置

(图片整理自,渲染器是vray,大同小异https://www.bilibili.com/video/BV15t411Y7cf?t=403)

如果没有使用线性流程,光线会衰减过快(因为物理的光线在输出时被gamma了),暗部有明显色阶感,调亮又很容易过曝,整体偏暗偏灰白,是不正确的做法,正确的做法是使用线性工作流,得到真实物理的结果,然后再后期调整效果

在把8位/通道贴图输入的时候,使用gamma=2.2的设置,把图片的gamma还原回1,这个过程也叫做de—gamma,把线性的数据代入线性的计算,得到线性物理的结果,是正确的线性工作流做法

Rendering and compositing is best done in scene linear color space, which corresponds more closely to nature, and makes computations more physically accurate.

摘自Blender手册《Color Management 》章节

输入设置

上图为blender手册中关于颜色空间设定的说明,对于保存为png等非线格式的贴图,导入时,使用colorspace为sRGB的设置,相当于做了次de-gamma,把素材带入线性环境计算。

The color space of the image file on a drive. This depends on the file format, for example, PNG or JPEG images are often stored in sRGB, while OpenEXR images are stored in a linear color space. Some images such as normal, bump or stencil maps do not strictly contain ‘colors’, and on such values, no color space conversion should ever be applied. For such images, the color space should be set to Non-Color.

摘自Blender手册《Color Management 》章节

同时,对于像normal法线贴图,本身就不应该参与色彩空间转换,所以设置成Non-Color(好像Non-Color,Raw,linear在视觉效果上没差别?

左侧,blender自带shader的图像纹理节点,使用sRGB设置,normal用Raw,右侧Luxcore渲染器的图像节点,gamma设置为2.2。

视图显示设置

渲染属性>色彩管理

这两种做法看起来结果一样(细微的不一样是因为Luxcore渲染器的Viewport denoise,每次都会有细微差别),文档里推荐是右边的做法,底部的gamma值调整主要是为了艺术效果。

如果你想看原汁原味的线性结果,那就显示设备设置成无,gamma设置成1,看起来会比较暗,因为显示器里自带gamma=2.2。

笔记整理自:

韩世麟:Gamma校正与线性工作流入门讲解https://www.bilibili.com/video/BV15t411Y7cf?from=search&seid=8355580254114734607
(非常好的教程,渲染入门必看,简明扼要的讲了很容易忽视出错的问题)

色彩校正中的 gamma 值是什么? https://www.zhihu.com/question/27467127/answer/123239180?utm_source=qq&utm_medium=social&utm_oi=973537088109535232

blender手册 https://docs.blender.org/manual/en/latest/render/color_management.html#image-files

封面的动森小飞机Fanart:
A站: https://www.artstation.com/artwork/Oy1vXg
Sketchfab:https://skfb.ly/6SCGV

发表评论

电子邮件地址不会被公开。 必填项已用*标注


*

关闭菜单