伽马校正的前世今生

news2024/10/5 23:27:52

        关于伽马校正的前因后果,在网上有不同版本的说法,由于年代久远的因素,导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头,而不是摸一下伽马的尾巴。

一,鱼龙混杂的论调

1,CRT 显示器的物理属性非线性引起

        这一切要从CRT的特性说起, CRT显示器是靠电压来驱动一个能够发射电子束的电子枪来击打荧光屏上的三种荧光粉,使其发出RGB三种颜色的光,通过调节电压的方向可以改变电子束击打在屏幕上的位置,实现扫描,并根据输入信号的大小来调节电压的大小从而改变荧光粉发出光的明暗。但是,电压的大小与荧光粉发出光的明暗之间并不是一个简单的线型关系,在大部分区间,两者之间是一个幂函数关系。通常这里的伽马值取2.2。

          

 2,人眼对自然亮度感知是非线性的引起

        通常人眼对于亮度的感知是不均匀的。在一个黑暗的房间里面点亮一根蜡烛后,可以感受到明显的光明,而继续点亮第二根蜡烛却没有第一根蜡烛的作用明显。原因在于每增加单位亮度感知,需要增加单位亮度的伽马次方的激励。对于这种感知的测试实验有两个著名的人物,分别是韦伯和史蒂芬斯。下面是人眼的感知曲线图。

3,非线性存储节省内存空间引起

        依据于人眼对于暗部信息的敏感度更强,当摄像机拍摄视频后在数字量化编码的过程中,如果均匀分配量化区间,那么会导致暗部的信息丢失,而亮部信息的冗余。这样的丢失和冗余是因为人的眼睛造成的。那么为了消除这样的问题,在OETF阶段做一次伽马编码,通常这里的伽马值取0.45。

 二、抓住伽马的头

        通过多方查找资料,我认为伽马的起源还是来自于CRT显示器的传说,原因有如下几点:

1,CRT显像管具有调制特性 

        

         这里的电压和电流之间的关系已经撇开了人眼的观察,是一个纯粹的物理量,也就是说电压值跟物理亮度之间是幂的关系。

2,CRT显示器出现的年代更早   

        世界上最早发明阴极显像管是1895年,而最早发明数码摄像机是1985年,两者相差大概一百年的时间。对于为了优化存储空间而进行的伽马编码压缩,只有在数字电子产品出现之后才有意义,对于模拟时代的产品来说,使用的模拟电路实现伽马压缩不存在内存空间优化的事情。因此第3种论调不攻自破。

3,为了匹配人眼的感知毫无意义

        人的眼睛天生就是看东西的,这种看体现在真实的感官之上。那么摄像机拍摄视频,显示器显示视频,需要做到的就是要自然的表现自然的东西,意思就是原始世界是一朵红色的花,显示器上也展示一朵红色的花,这时候人眼看起来就毫无违和感,所以伽马校正的起源跟人眼没有关系。因此第2种观点也站不住脚。

三,伽马概念的推广

        1,CRT显示器的伽马值是2.2(准确的说是行业里面大多数厂家趋于这个数值),那么就逼迫摄像机厂家的伽马值是1/2.2=0.45,这样二者级联之后的伽马值就是1,也就是线性的船体函数。

        2,在CRT显示器淘汰之后,在LCD里面人为的添加了一个LUT伽马映射表去模拟CRT显示器的特性,这是为了兼容历史的基因,这个CRT的基因衍生了许多的摄影素材,摄影设备。

        3,为了满足不同场合的显示需求,经常需要微调伽马的数值,这是因为不同的环境会影响显示的效果。电影院的系统伽马值可能需要1.5,而普通室内的系统伽马值可能只需要1.2左右。下图是BT709对于伽马压缩的规定,并不是严格的0.45.

        

        本文的最后附上韩世麟讲解的视频,虽然对于伽马的起源说法是错的,但是从另一个角度看问题,确实也能学到挺多知识。

       1: Gamma校正与线性工作流入门讲解_哔哩哔哩_bilibili

       2:《美术中灰色的物理光强——演示人眼亮度感知的非线性》

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/483642.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统集成项目管理工程师下午真题 计算题 及考点 汇总(更新中。。。)

文章目录 2022下半年广东卷 2022下半年广东卷 1、质量保证、质量控制。质量管理方面存在的问题,并给出正确的做法。判断下列选项的正误。 2、下表是一个软件项目在编码阶段各活动的计划和实际完成情况(工作量,单位:人天&#xf…

Linux环境下的redis

一:安装与启动 1.下载redis安装包 2.解压:tar –xvf 文件名.tar.gz 3.安装 进入redis目录(cd redis-x.x.x/)后,执行make install 命令 4.启动 进入src目录,执行redis-server 此时该界面无法再使用,需要…

Eureka 服务注册源码探秘——图解、源码级解析

🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年5月2日 🍊 点…

NPOI导出word文档中插入公式总结

1. XWPFOMath类 XWPFDocument doc new XWPFDocument(); //创建新行 XWPFParagraph p doc.CreateParagraph(); //创建空的公式 XWPFOMath math p.CreateOMath();通过XWPFParagraph的扩展方法创建 方法名备注CreateAcc();创建XWPFAcc类,实现字符在文字上面的类Cr…

【前端】2.HTML基础知识

文章目录 1. 基本概念1.1 HTML是什么1.2 HTML的作用1.3. 学习导引1.4 开发工具 2. HTML 基础语法2.1 demo2.1.1 HTML 详述2.1.2 HTML标签2.1.3 HTML网页结构2.1.4HTML版本 2.2 常用元素2.3 属性2.4 文本相关语法2.5 链接相关语法2.6 头部相关语法 3. 总结3.1 HTML 基础语法总结…

什么是VLAN?为什么要划分VLAN?

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。每个VLAN是一个广播域,VLAN内的主机间可以直接通信,而VLAN间则不能直接互通。这样,广播报文就被限制在一个VLAN内。 一、为…

如何简单快速搭建自己的云对象存储服务(OSS)

简单来说,其实我们只需要有一台服务器,利用服务器的各种资源,搭配其它厂商开发的软件,就能很轻易拥有自己的云对象存储服务。不需要在阿里云上花钱买什么服务,甚至还能自己给别人提供服务,真的是太爽了。 云…

五一创作【Android构建篇】MakeFile语法

前言 对于一个看不懂Makefile构建文件规则的人来说,这个Makefile语法和shell语法是真不一样,但是又引用了部分shell语法,可以说是shell语法的子类,Makefile语法继承了它。 和shell语法不一样,这个更难一点&#xff0…

云原生架构的发展历史

目录 1 单机小型机时代2 垂直拆分3 集群化负载均衡架构4 服务化改造架构5 服务治理6 微服务时代7 服务网格新时期 (service mesh)7.1 背景7.2 SideCar7.3 Linkerd7.4 istio7.5 什么是服务网格7.6 什么是Service Mesh7.7 CNCF云原生组织发展和介绍7.8 国内…

C++11--线程库的认识

目录 thread 线程的构造方式 相关成员函数 join与detach 线程传参 互斥量mutex mutex Locks 原子性操作库 条件变量 thread 线程的构造方式 它是不支持拷贝构造,赋值的,但是可以支持移动构造,移动赋值。还可以直接创建无参的对象。 …

存储器(一)

目录 一、存储器的分类 1.按介质分类 1.1半导体存储器 1.2磁表面存储器 1.3光盘存储器 2.按存取方式分类 2.1随机存储器(RAM) 2.2只读存储器(ROM) 2.3串行访问存储器 3.按在计算机中的作用分类 ​编辑 二、存储器的层次结构 1.存储器的主要性能指标: 2.存储系统体系…

模式识别是什么意思

模式识别是一种通过分析数据特征、模型、算法等手段,从数据中寻找规律、发现隐藏的模式或结构的技术。通常是从某些对象、场景、过程等方面入手,对数据进行处理,以便于对这些对象、场景、过程进行分类、检测、识别、分割、分析等目的。 模式…

HJ20 密码验证合格程序

写在前面: 题目链接:牛客网 华为机试题 HJ20 密码验证合格程序 题目难度:中等 编程语言:C 一、题目描述 描述 密码要求: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 (注:其他符号不…

死信队列

死信队列 死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,producer 将消息投递到 broker 或者直接到queue 里了,consumer 从 queue 取出消息…

[Pandas] 构建DataFrame数据框

DataFrame是二维数据结构,数据以行和列的形式排列 构建DataFrame最基本的定义格式如下 df pd.DataFrame(dataNone, indexNone, columnsNone) 参数说明 data: 具体数据 index: 行索引,如果没有指定,会自动生成RangeIndex(0,1,2,...,n) colu…

mongoose使用详细 -- 如何通过mongoose搭建服务器

前言 授人以鱼不如授人以渔,这篇文章详细介绍了,对于一个从来没有听说过mongoose的小菜鸟如何快速了解和上手mongoose 其他一些开源库可以借助类似的方法进行学习 提前需要准备的工具 1.官网文档 Mongoose :: Documentation 官网提供了很多例子讲解&am…

[Pandas] 查看DataFrame的常用属性

导入数据 import pandas as pddf pd.DataFrame([[L123,A,0,123],[L456,A,1,456],[L437,C,0,789],[L112,B,1,741],[L211,A,0,852],[L985,B,1,963]],columns[Material,Level,Passing,LT]) df 1.dtypes: 查看DataFrame中各列的数据类型 df.dtypes会返回每个字段的数据类型及Da…

C++练级之初级:第六篇

类和对象入门级:第六篇 1.类的引入2.类的定义2.1类的访问限定符2.2类的封装2.3类的实例化 3.如何计算类或者对象的大小4.this指针 总结 我们知道,C在C语言的基础上引入了对象的概念,那么从本篇开始进入类和对象; 1.类的引入 &…

【JavaEE】_1.多线程(1)

目录 1.操作系统 2. 进程 3. CPU分配——进程调度 3.1 操作系统对进程的管理 3.2 PCB的属性 3.2.1 基础属性 3.2.2 实现进程调度的属性 4. 内存分配——内存管理 4.1 虚拟地址空间 4.2 进程间通信 5. 线程 5.1 线程的概念 5.2 创建与使用多线程 5.2.1 方式1&a…

【数据结构】八大排序(一)

😛作者:日出等日落 📘 专栏:数据结构 珍惜自己的时间,利用好每一份每一秒。做事不放过没一个细节,小心谨慎,细致,能够做到这些,还有什么是不可能的呢? 目录 ​编辑 ✔…