gamma校正什么意思_串联滞后校正对系统性能的影响

gamma校正什么意思_串联滞后校正对系统性能的影响【Gamma的由来】首先,要区分照度和亮度,照度是一个客观的量,亮度是一个主观的量,不同的人看相同照度的物体所感受到的亮度是不一样的。对于照度线性变化的物体,人眼感受到的亮度不是线性的。人眼对于低照度的物体更敏感,这意味着对于照度为2、3、4的三个物体,人眼能够区分,而对于照度为222、223、224的三个物体,人眼不能区分。其次,我们存储颜色的空间是有限的,常用的RGBA32格式,每个颜色通道只有8位,最多能表示256种照度,而现实世界中的照度远超256。基于人眼对照度的感知特点,我们不能线性的去

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

【Gamma的由来】

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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

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

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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

存储的值 = 物体的照度值^(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的由来。

gamma校正什么意思_串联滞后校正对系统性能的影响

 那么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得到显示器的照度。

gamma校正什么意思_串联滞后校正对系统性能的影响

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

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

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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

【sRGB空间】

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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

gamma校正什么意思_串联滞后校正对系统性能的影响

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位图像

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190712.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月15日 下午2:22
下一篇 2026年2月15日 下午3:01


相关推荐

  • c++中this指针的用法详解

    c++中this指针的用法详解为什么引入this指针?   最简单的应用场景就是:当我们在类中定义了一个变量,同时在类成员函数中定义了同一变量时,也就是说变量名重复时,但是我们想使用类中定义的变量,这个时候我们该怎么办呢?这个时候就是this指针大显身手的时候了。为此我们引入this指针的概念。1.this指针的用处:  一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this…

    2022年5月13日
    53
  • DES加解密算法原理详解与实现

    DES加解密算法原理详解与实现DES 密码编写 要编写 DES 密码 先熟悉 DES 原理 其基本流程就是先将明文分成 64bit 的分组 然后将 64bit 二进制码输入到密码器中 密码器对输入的 64 位码首先进行初始置换 然后在 64bit 主密钥产生的 16 个子密钥控制下进行 16 轮乘积变换 接着再进行逆置换就得到 64 位已加密的密文 DES 的流程图如下 其中 DES 算法明文分组长为 64bit 加密后得到 64bit 密文 输入初始种子密钥为 64bit 第 8 16 24 32 40 48 56 64 为奇偶校验位 实际的密钥长为 56bit DES 加密过程由三个阶段

    2026年3月19日
    3
  • ubuntu建立和删除软连接

    ubuntu建立和删除软连接建立软连接 ln s 原目录映射目录删除软连接的方法 sudorm rf 映射目录

    2026年3月17日
    2
  • ExtJS学习———–Ext.String,ExtJS对javascript中的String的扩展[通俗易懂]

    ExtJS学习———–Ext.String,ExtJS对javascript中的String的扩展

    2022年2月1日
    46
  • java中的向上取整和向下取整

    java中的向上取整和向下取整向上取整:比自己大的最小整数。向下取整:比自己小的最大整数。publicclassRoundingUp{publicstaticvoidmain(String[]args){System.out.println(Math.ceil(1.5));//2.0System.out.println(Math.ceil(-1.5));//…

    2022年6月21日
    67
  • 字节跳动正式发布豆包大模型1.8

    字节跳动正式发布豆包大模型1.8

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号