简单理解伽马校正

简单理解伽马校正伽马校正相关的资料说明很多,但其中不少内容都写的比较繁杂,令人难以理解,本文尝试简单解释一下伽马校正的相关内容~早期的CRT显示器存在非线性输出的问题,简单来说,你给CRT显示器输入(input)一个0.5(**注意,输入范围为[0,1]),CRT显示器的输出(output)并不是0.5,而是约等于0.218,输入与输出间存在一个指数大概为2.2的幂次关系:outp…

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

Jetbrains全系列IDE稳定放心使用

伽马校正相关的资料说明很多,但其中不少内容都写的比较繁杂,令人难以理解, 本文尝试简单解释一下伽马校正的相关内容~

早期的 CRT 显示器存在非线性输出的问题,简单来说,你给 CRT 显示器输入(input)一个 0.5(注意,输入范围为[0,1]), CRT 显示器的输出(output)并不是 0.5,而是约等于 0.218,输入与输出间存在一个指数大概为 2.2 的幂次关系:

o u t p u t ≈ i n p u t 2.2 output \approx input^{2.2} outputinput2.2

所以当你输入 0.5 时,输出即为:

0.218 ≈ 0. 5 2.2 0.218 \approx 0.5^{2.2} 0.2180.52.2

其中 2.2 这个指数即为伽马(gamma)值,而显示器的这种非线性输出过程则称为伽马展开(gamma expansion).

为了能够得到正确的输出,我们必须对输入进行补偿,方法就是对输入进行一次指数为 1 / 2.2 的幂次运算,这个补偿的过程便是伽马校正(gamma correction), :

i n p u t → i n p u t 1 / 2.2 input \rightarrow input^{1 / 2.2} inputinput1/2.2

经过伽马校正后,显示器便能够正确显示我们的输入了 :

i n p u t → i n p u t 1 / 2.2 o u t p u t ≈ ( i n p u t 1 / 2.2 ) 2.2 = i n p u t \begin{aligned} & input \rightarrow input^{1 / 2.2} \\ & output \approx (input^{1 / 2.2})^{2.2} = input \end{aligned} inputinput1/2.2output(input1/2.2)2.2=input

所以为了让显示器正确输出 0.5, 我们需要对 0.5 进行伽马校正,实际给显示器的输入约为 0.73 :

0.5 → 0. 5 1 / 2.2 ≈ 0.73 0.5 \rightarrow 0.5^{1 / 2.2} \approx 0.73 0.50.51/2.20.73

看到这里你可能会有个疑问:既然伽马校正起源于早期 CRT 显示器的非线性输出问题,而我们现在基本已经淘汰掉这些显示器,并且当今的显示器已经可以做到线性输出了(输入0.5,输出也是0.5),那么我们是不是可以直接废弃伽马校正了呢?

答案可能有些出人意料 : 我们仍然需要进行伽马校正!

原因有些巧合 : 伽马校正除了可以解决早期 CRT 显示器的非线性输出问题, 同时还可以帮助我们”改善”输出的图像质量 :

人眼对于较暗(接近0)的亮度值比较敏感,对于较亮(接近1)的亮度值则不太敏感,假设我们现在使用一个字节(能够表达整数范围[0,255])来存储亮度值(之前都忽略了亮度值(输入值)的表示问题,这里需要考虑),并且我们要存储 0.2400.243 这两个亮度值,如果不进行伽马校正,则有:

v a l u e _ 1 = 0.240 ∗ 255 = 61.2 ⟶ c l a m p 61 v a l u e _ 2 = 0.243 ∗ 255 = 61.965 ⟶ c l a m p 61 \begin{aligned} & value\_1 = 0.240 * 255 = 61.2 & \stackrel{clamp}{\longrightarrow} 61 \\ & value\_2 = 0.243 * 255 = 61.965 & \stackrel{clamp}{\longrightarrow} 61 \end{aligned} value_1=0.240255=61.2value_2=0.243255=61.965clamp61clamp61

可以看到 0.2400.243 的存储数值都是 61,所以这两个输入的实际显示效果其实是一样的(细节差异丢失了).

但如果我们进行一次伽马校正,则有:

v a l u e _ 1 = 0.24 0 1 / 2.2 ∗ 255 ≈ 133.3 ⟶ c l a m p 133 v a l u e _ 2 = 0.24 3 1 / 2.2 ∗ 255 ≈ 134.1 ⟶ c l a m p 134 \begin{aligned} & value\_1 = 0.240 ^ {1 / 2.2} * 255 \approx 133.3 & \stackrel{clamp}{\longrightarrow} 133 \\ & value\_2 = 0.243 ^ {1 / 2.2} * 255 \approx 134.1 & \stackrel{clamp}{\longrightarrow} 134 \end{aligned} value_1=0.2401/2.2255133.3value_2=0.2431/2.2255134.1clamp133clamp134

0.2400.243 的存储数值变为了 133134,所以这两个输入的实际显示效果便区分开了(细节差异保留了).

实际上,伽马校正增大了较暗数值的表示精度,而减小了较亮数值的表示精度,人眼又恰好对较暗数值比较敏感,对较亮数值不太敏感,于是从视觉角度讲,输出的图像质量就被伽马校正”改善”了.

基于这个原因,我们仍然需要进行伽马校正,而既然我们进行了伽马校正,当今的显示器也便保留了非线性输出(伽马展开)的功能,颇有些因果倒置的意思.

更多资料

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PMF 培训[通俗易懂]

    PMF 培训[通俗易懂]IBM有一些很有名的培训,也很有效,真的是有立竿见影的效果.过去很长时间之后,可能不记得培训的那些细节,但是培训中传达的工作方式,能给你很大的影响.进公司后3个月的时候接受了第一个,有关customerfacing的,其实是为你提供了一个商务沟通的基本模式,现在培训的内容忘记了,但是这个模式还记得:调查-承诺-执行-反馈.一个有效的商务沟通,哪怕是和客户的一个电话,都需要艺…

    2022年6月22日
    36
  • 用户态和内核态的简单理解「建议收藏」

    用户态和内核态的简单理解「建议收藏」文章目录linux基础系统调用和库函数的区别什么是用户态和内核态用户态和内核态的相互转换linux基础linux的kernel内核外是系统调用,系统调用外是shell、库函数系统调用和库函数的区别内核:屏蔽了调用各硬件资源的细节系统调用:内核提供给用户调用的接口,但系统调用的可移植性差移植性差的原因:windows、linux内核的系统调用是不同的,比如:同一个功能提供给用户的函数名、参数都不相同,会出现从一个系统移植到另一个系统无法正常运行。库函数:为了解决系统调用移植新差的问题,同时封

    2022年9月18日
    3
  • Server.MapPath 的用法说明

    Server.MapPath 的用法说明用法:1.Server.MapPath(“/”)应用程序根目录所在的位置如C:\Inetpub\wwwroot\2.Server.MapPath(“./”)表示所在页面的当前目录3.Server.MapPath(“../”)表示上一级目录4.Server.MapPath(“~/”)表示当前应用级程序的目录,如果是根目录,就是根目录,如果是虚拟目录,就

    2022年7月12日
    19
  • ip地址是什么意思_手机ip显示归属地还是显示本地

    ip地址是什么意思_手机ip显示归属地还是显示本地如何通过IP找到地址?在我们印象中,我们都知道可以通过IP地址找到某个人。但当我们细想一下,我们会发现其实IP地址与地理位置并不是直接相关的。那我们到底是如何通过IP地址找到地址的呢?答案是:通过自治系统(AutonomousSystem)。互联网是由不同网络组成的网络,自治系统是组成Internet的大型网络,连接到Internet的每台计算机或设备都连接到一个AS。而每一个自治系统都会有一个编码,我们称之为ASN。…

    2022年9月14日
    2
  • 头文件里面的ifndef /define/endif的作用

    c,c++里面,头文件里面的ifndef/define/endif的作用今天和宿舍同学讨论一个小程序,发现有点地方不大懂······是

    2021年12月25日
    50
  • java中dao层和service的关系(web基础知识有哪些)

    参考来源:http://www.xuebuyuan.com/2153333.html 1.Action/Service/DAO简介:Action是管理业务(Service)调度和管理跳转的。Service是管理具体的功能的。Action只负责管理,而Service负责实施。DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查

    2022年4月12日
    93

发表回复

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

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