大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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} output≈input2.2
所以当你输入 0.5 时,输出即为:
0.218 ≈ 0. 5 2.2 0.218 \approx 0.5^{2.2} 0.218≈0.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} input→input1/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} input→input1/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.5→0.51/2.2≈0.73
看到这里你可能会有个疑问:既然伽马校正起源于早期 CRT 显示器的非线性输出问题,而我们现在基本已经淘汰掉这些显示器,并且当今的显示器已经可以做到线性输出了(输入0.5,输出也是0.5),那么我们是不是可以直接废弃伽马校正了呢?
答案可能有些出人意料 : 我们仍然需要进行伽马校正!
原因有些巧合 : 伽马校正除了可以解决早期 CRT 显示器的非线性输出问题, 同时还可以帮助我们”改善”输出的图像质量 :
人眼对于较暗(接近0)的亮度值比较敏感,对于较亮(接近1)的亮度值则不太敏感,假设我们现在使用一个字节(能够表达整数范围[0,255])来存储亮度值(之前都忽略了亮度值(输入值)的表示问题,这里需要考虑),并且我们要存储 0.240 和 0.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.240∗255=61.2value_2=0.243∗255=61.965⟶clamp61⟶clamp61
可以看到 0.240 和 0.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.2∗255≈133.3value_2=0.2431/2.2∗255≈134.1⟶clamp133⟶clamp134
0.240 和 0.243 的存储数值变为了 133 和 134,所以这两个输入的实际显示效果便区分开了(细节差异保留了).
实际上,伽马校正增大了较暗数值的表示精度,而减小了较亮数值的表示精度,人眼又恰好对较暗数值比较敏感,对较亮数值不太敏感,于是从视觉角度讲,输出的图像质量就被伽马校正”改善”了.
基于这个原因,我们仍然需要进行伽马校正,而既然我们进行了伽马校正,当今的显示器也便保留了非线性输出(伽马展开)的功能,颇有些因果倒置的意思.
更多资料
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/189680.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...