简单理解伽马校正

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

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

output≈input2.2 output \approx input^{2.2} output≈input2.2

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

0.218≈0.52.2 0.218 \approx 0.5^{2.2} 0.218≈0.52.2

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

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

input→input1/2.2 input \rightarrow input^{1 / 2.2} input→input1/2.2

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

input→input1/2.2output≈(input1/2.2)2.2=input \begin{aligned} & input \rightarrow input^{1 / 2.2} \\ & output \approx (input^{1 / 2.2})^{2.2} = input \end{aligned} ​input→input1/2.2output≈(input1/2.2)2.2=input​

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

0.5→0.51/2.2≈0.73 0.5 \rightarrow 0.5^{1 / 2.2} \approx 0.73 0.5→0.51/2.2≈0.73

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

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

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

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

value_1=0.240∗255=61.2⟶clamp61value_2=0.243∗255=61.965⟶clamp61 \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.240∗255=61.2value_2=0.243∗255=61.965​⟶clamp​61⟶clamp​61​

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

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

value_1=0.2401/2.2∗255≈133.3⟶clamp133value_2=0.2431/2.2∗255≈134.1⟶clamp134 \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.2∗255≈133.3value_2=0.2431/2.2∗255≈134.1​⟶clamp​133⟶clamp​134​

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

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

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

更多资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个游戏程序员的代码书写观(二)

    对于稍有工作经验的程序员而言,或多或少都会关注到一个老生常谈的问题:代码风格(ProgrammingStyle),而这个话题可能也是程序员间争论最多的话题之一,...

    用户2615200
  • iTween那些事儿(二)

      上次我们简单浏览了一番iTween的使用和原理,这次我们换个角度,转而看看iTween目前存在的一些缺陷以及一点点可能的改进之处,当然,这些所谓的缺陷或者改...

    用户2615200
  • “连连看”小析

    近段日子与几位同事聊到了“连连看”这个小游戏,感觉还颇有些趣味,虽然其本身规则并不繁琐,但玩起来确实很能让人投入。出于自己的一点追究癖,自己这几天还认真考虑了...

    用户2615200
  • 简单理解vuex原理

    vuex在用 vue一年之后就不怎么用了,搭建项目会预留,但是几乎不用了。之前也说过vuex使用场景,vue是单项数据流,所以多组件直接共享状态的时候可以使用,...

    wade
  • 280万样本!谷歌开放史上最大分割掩码数据集,开启新一轮挑战赛

    这次,他们在注释集中加入分割掩码(segmentation masks),样本规模达到280万,横跨350个类别。

    量子位
  • 如何优雅处理前端异常?(史上最全前端异常处理方案)

    前端一直是距离用户最近的一层,随着产品的日益完善,我们会更加注重用户体验,而前端异常却如鲠在喉,甚是烦人。

    前端迷
  • 12种思维导图工具助你成为结构化思维专家

    我们从一个简单的练习开始吧。“如果我们任命你为店长,去管理经营状况最糟糕的一个店面。那么,在经营这家店时,你会考虑哪些方面?你要做什么去改变当前糟糕的局面呢?”

    华章科技
  • 一道关于组合的js算法题目

    有一个数组,如果有3个值:[3,2,6]。交叉组合后返回:3-2,3-6,2-6,3-2-6

    挥刀北上
  • 12种思维导图工具,助你成为结构化思维专家

    “如果我们任命你为店长,去管理经营状况最糟糕的一个店面。那么,在经营这家店时,你会考虑哪些方面?你要做什么去改变当前糟糕的局面呢?” 花几分钟好好考虑一下这个...

    钱塘数据
  • 12种思维导图工具,助你成为结构化思维专家

    “如果我们任命你为店长,去管理经营状况最糟糕的一个店面。那么,在经营这家店时,你会考虑哪些方面?你要做什么去改变当前糟糕的局面呢?” 花几分钟好好考虑一下这个问...

    钱塘数据

扫码关注云+社区

领取腾讯云代金券