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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • SplitContainer(拆分条控件)

    SplitContainer(拆分条控件)1.可以将Windows窗体SplitContainer控件看作是一个复合体,它是由一个可移动的拆分条分隔的两个面板。当鼠标指针悬停在该拆分条上时,指针将相应地改变形状以显示该拆分条是可移动的。使用SplitContainer控件,可以创建复合的用户界面(通常,在一个面板中的选择决定了在另一个面板中显示哪些对象)。这种排列对于显示和浏览信息非常有用。拥有两个面板使您可以聚合不同区

  • 二叉树层序遍历 java

    二叉树层序遍历 java层序遍历1.把根结点放到队列中2.循环直到?1.从队列取出队首元素2.孩子入队列​publicstaticvoidlevelOrder1(TreeNoderoot){if(root==null){return;}Queue<TreeNode>queue…

  • 防止站点数据被採集——成佩涛黑客「建议收藏」

    防止站点数据被採集——成佩涛黑客

  • .NET(c#) 移动APP开发平台 – Smobiler(2) – 平台介绍

    .NET(c#) 移动APP开发平台 – Smobiler(2) – 平台介绍  看到大家很多人在后台问我一些问题,所以准备写一个系列了,下面给个目录目录:   .NET(c#)移动APP开发平台-Smobiler(1) 环境的搭建及上手第一个应用类似开发WinForm的方式,使用C#开发Android和IOS的移动应用?听起来感觉不可思议,但是实际上确实很强大,那么Smobiler平台到底是如何实现的呢,这里给大家介绍一下。客户端  Smobi…

  • Android 代码混淆

    Android 代码混淆Android代码混淆简介在我们日常开发中,对已经开发完成的源代码,需做一些代码混淆工作,以对代码起到一种保护和降低安装包体积的作用。开启混淆在app的build.gradle文件中如下代码:android{……buildTypes{release{//开启代码混淆minifyEnabledtrue//开启资源混淆,移除未使用的资源shri

  • java中的三元表达式_逻辑运算符两侧的数据类型

    java中的三元表达式_逻辑运算符两侧的数据类型一、分析当你使用三元运算符,两边的操作数的类型不一致的时候,这就涉及到三元操作符的转换规则:1.若果两个操作数不可转换,则不做转换,返回值为Object类型。2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换。int类型转换为long类型,long类型转换成float类型。3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型为T,那

    2022年10月21日

发表回复

您的电子邮箱地址不会被公开。

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