对Gamma校正的理解

【Gamma的由来】

首先,要区分照度和亮度,照度是一个客观的量,亮度是一个主观的量,不同的人看相同照度的物体所感受到的亮度是不一样的。对于照度线性变化的物体,人眼感受到的亮度不是线性的。人眼对于低照度的物体更敏感,这意味着对于照度为2、3、4的三个物体,人眼能够区分,而对于照度为222、223、224的三个物体,人眼不能区分。

研究表明,人眼感受到的亮度与线性增长的物体照度之间的关系近似为幂指数关系,如下:

人眼感受到的亮度 = 物体照度^n  (公式一)

其次,我们存储颜色的空间是有限的(也即灰度阶级有限),常用的RGBA32格式,每个颜色通道只有8位,最多能表示256种照度,而现实世界中的照度远超256。基于人眼对照度的感知特点,我们不能线性的去表示照度,需要表示出更多的低照度,以便人眼能分辨出更多的物体细节。

反过来的意思是:当我们用摄像机拍照时,很多低照度的物体的照度值被存储下来,根据公式一可以得到:

存储的值 = 物体的照度值^(1/n)   (公式二)

这个n就是gamma值,其值到底为多少呢?

在8位图上,能表示的照度有256种,也即灰度有256阶,换算到0~1区间,0是黑,255是白,128为中间灰度,这个中间灰度要让人眼感觉为0.5,这样人眼看起来的灰度是均匀渐变的,如下图所示。

人眼感觉为0.5时对应的物理照度=0.218*人眼感觉为1时对应的物理照度。pow(0.5,2.2) = 0.218。这个就是Gamma = 2.2的由来。

 那么0.218是怎么来的?人眼感受的亮度是主观的,不同的人感受到的不同,这个值得由很多人测试而来。1996年微软和惠普在特定的光照条件下测试人观看显示器的感受,他们认为,把8位图像中128号灰(0.5灰)这个抽象的、代表心目中中灰色的数值,对应以白像素21.8%的亮度显示出来,由黑到白的渐变过渡看起来会比较均匀。因此gamma被确定为2.2最合适,尽管gamma可以在2.2上下浮动。

最后,屏幕的照度与输入的电压不是线性关系,两者近似为2.2次幂的关系最为合适。例如输入的电压为0.5(输入的电压近似等于存储的值),屏幕的照度为pow(0.5,2.2) = 0.218,恰好0.218时人眼感觉的亮度为0.5。这就是反过来的公式二:

屏幕的照度 = 存储的值^2.2  (公式三)

因此,早期的阴极摄像管(CRT)显示器中,会使得屏幕的照度与输入的电压为2.2次幂的关系。其中,2.2为CRT显示器的gamma值,又被称为display gamma。不同的显示器的屏幕照度与输入电压的关系不同,gamma值也不同。不过厂商一般会尽量将生产显示器的gamma值向2.2靠近,现代的显示器的gamma值甚至可以调整,而不是像以前一样出厂就固定。

【什么是Gamma校正】

综上所述,从摄像机拍摄真实场景到在显示器上显示图像,经历了如下图所示的过程:真实场景的照度经过encoding gamma得到存储的值,存储的值经过display gamma得到显示器的照度。

整个系统的 view gamma = encoding gamma * display gamma

如果view gamma = 1,则计算可得真实场景的照度 = 显示器的照度,这正是我们所期望的,这样显示器才能真实的表现出真实场景的照度。

那么是不是只要view gamma =1 ,encoding gamma 的值任意都可以呢?不行,因为这样保存下来的值会缺失很多照度信息,如下图所示,使用不同的encoding gamma会导致我们在屏幕上看到的画面与人眼对着真实场景看到的画面不一致。 

如果图像是通过相机生成的,必然做了encode gamma,如果图片是由计算机生成的,那么在保存为图片文件时,需要手动做encode gamma,这就是gamma校正

如果不进行gamma校正,那么经过display gamma后,也即decode gamma后,屏幕的照度会比预想的低,导致整个画面看起来比较暗。

【sRGB空间】

在unity中的纹理有sRGB的选项,默认是勾选的,表示纹理是在sRGB空间

 sRGB空间,也叫sRGB色域,是一个通用的标准色域,是由微软、惠普主导制定出来的标准色彩空间,意在让显示器、数位相机、扫描仪、投影仪等各种计算机外部设备与应用软件对于色彩有一个共通的语言。显示设备能够覆盖的sRGB范围越大,显示的颜色就更加丰富饱满。

sRGB空间对应的就是gamma为0.45的空间,也即采用这个空间的图片都做过gamma校正。

unity中有线性空间linear space和伽马空间gamma space,选择不同的空间表明我们的输入和输出是在不同的空间中。而在Shader中颜色插值、光照的计算等都是在线性空间中进行的。

unity中默认是伽马空间,需要将在sRGB(gamma0.45)中的纹理变为在线性空间中的纹理(gamma 1.0),计算出来结果后,需要再做gamma校正,变回sRGB空间,再送到屏幕上。

如果选择了线性空间,如果纹理是sRGB,那么同样需要变为线性空间,如果纹理是linear,那么不需要变为线性空间。我们可以通过上图所示的来设置纹理是哪个空间下的。

【gamma的影响】

因为我们在的计算都是在线性空间下进行了,而我们电脑上保存的文件都是在sRGB空间下的,所以我们不能直接用图片存储的值来进行计算,在用值计算前,必须先做gamma校正,否则我们计算的结果呈现到屏幕时会出现黑边等。下面的视频很好的解释了这一现象

Computer Color is Broken - YouTube

【真彩色与位深度】

我们常见的RGB图片,包括上文说的RGBA格式图片,每个通道用8位表示,其位深度为8,所能表示的颜色为256种。如果用16位表示一个通道,那么可以表示的颜色有65536种。如果用32位表示一个通道,即位深度为32,那么可以表示的颜色有16777216种,远超人眼所能分辨的颜色。

位深度为32的图像即为真彩色图像。

真彩色图像没有灰度等级的限制,能够完整的记录真实物体的照度,只要view gamma为1,encode gamma可以任意了。

【参考】

色彩校正中的Gamma(人眼亮度感应的非线性)_所心即所想的博客-CSDN博客_人眼亮度感知曲线

 对 Gamma 校正的个人理解 - 知乎 (zhihu.com)

如何理解Gamma校正? - 掘金 (juejin.cn)

 Gamma correction - Wikipedia

Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)

8位, 16位,24位,32位图片显示原理及对比_csdn66_2016的博客-CSDN博客_32位图像

  • 5
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值