简单理解伽马校正

简单理解伽马校正伽马校正相关的资料说明很多,但其中不少内容都写的比较繁杂,令人难以理解,本文尝试简单解释一下伽马校正的相关内容~早期的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,所以这两个输入的实际显示效果便区分开了(细节差异保留了).

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

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

更多资料

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

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

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

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

(0)


相关推荐

  • 嵌入在网站上Flash播放机(2)

    嵌入在网站上Flash播放机(2)

  • mysql—mysql中如何存储日期数据

    mysql—mysql中如何存储日期数据

    2020年11月12日
  • sql 分页

    sql 分页//查询所有publicList<products>getAll(intpageNo,intcount){System.out.println(pageNo+";&qu

  • linux服务器配置jdk环境变量

    因为Java项目部署需要Java运行环境jdk,要在Linux服务器上部署Java项目,就必须线安装好jdk并配置好环境变量;本篇文章记录了如何安装jdk以及配置环境变量。1.下载jdk2.使用sftp工具将下载的jdk文件上传到Linux服务器上3.将jdk文件移动到/usr/local/java路径下mvjdk-8u171-linux-x64.tar.gz…

  • setContentView流程

    setContentView流程1、activity、window、DecorView、ViewRoot之间的预备知识activityactivity是Android的四大组件之一,负责控制activity的生命周期和处理事件,负责视图的添加与显示,以及通过一些回调方法与window和View进行交互。一个activity包含一个window,window才是真正的窗口WindowWindow是一个抽象类,它真正的实现类是PhoneWindow。Window通过WindowManager加载一个DecorView到Window中,

  • vs2013注册_vs2008是什么软件

    vs2013注册_vs2008是什么软件
    VS2008注册方法:
      VS2008注册方法非常简单,在开始>设置>控制面版>添加或删除程序>卸载vs.net2008(名字不太记得了)>出现卸载界面>点击Next>输入上面CD-key->出现成功画面即可完美将试用版升级成为正式版。
    VS2008正式版序列号CDKEY:PYHYP-WXB3B-B2CCM-V9DX9-VDY8T

发表回复

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

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