伽马校正笔记(Gamma Correction)

article/2025/7/27 19:18:34

        在数字图像系统中,伽马(Gamma)是一个重要的但很少被正确理解的特性。它定义了一个像素的数值和对应的实际亮度之间的关系。

人眼感知的亮度和相机“看到”的亮度区别

        对于数码相机来说,当检测的光子数增加一倍时,sensor输出出的信号值也增加一倍,即两者呈线性关系。但是人的眼睛在光子数增加一倍时,所感知到的亮度并不是线性关系的。

        我们生活的世界中,环境的亮度变化范围是非常大的。在黑暗的环境和明亮的环境中,我们都要能够看得清周围的物体,否则会无法识别出危险。

        人眼的感光能力会随着光的强弱而调节。比如昏暗的房间中,点燃打火机,我们会觉得火光是明亮的,但如果是在中午的强光环境中,打火机的火苗会不太容易看清楚。人眼对亮度变化的反应,是随着亮度的增加而变弱的。实验表明,人眼对亮度的感知近似于一个Log函数。

图1 人眼和相机对亮度的相应对比

        上图中,横轴表示实际的亮度,纵轴表示sensor检测到的亮度或人眼感知的亮度。蓝色的曲线表示人眼亮度的感知曲线,紫色的线是相机的响应。随着实际光照的增加,人眼对亮度变化的感知会变弱。而相机的响应一直保持线性关系。

为何使用伽马校正

        历史上,伽马校正起源于早期 CRT 显示器的非线性输出问题。假设给CRT的输入值是0.5,CRT输出的值约为0.218(\approx 0.5^{2.2})。因此,为了让CRT上显示的图像能够正常,会进行一个校正操作,原理也很简单,在存储图像数据时,对输入数据进行一次1/2.2次方的运算即可。假设原始数据的值为x,图像中的值就是x^{\frac{1}{2.2}},经过CRT后,得到的值是(x^{\frac{1}{2.2}})^{2.2} = x

        关于Gamma校正的比较全的介绍,这里有一个很好的网站,里面讲清楚了为何产生伽马校正,以及CRT过时之后,为什么还使用gamma校正。   What and Why is Gamma Correction of Photo Images? (with calculator)What and Why is Gamma Correction of Photo Images?icon-default.png?t=M85Bhttps://www.scantips.com/lights/gamma2.html        这里简单总结两个为何还要使用伽马校正的原因(个人理解):

        1. 存在大量的Encode Gamma的视频、图像。如sRGB,需要保证兼容性。

        2. 伽马校正增大了较暗数值的精度,减小了较亮数值的精度(人眼又恰好对较暗数值比较敏感,对较亮数值不太敏感,于是从视觉角度讲,输出的图像质量就被伽马校正"改善"了).将更多的信息储存空间分配给人眼敏感的区域,因而可以使用相对更加低的bit depth来记录。

图2  线性编码和Gamma编码对比 

Gamma Encoding & Correction

        当一幅数码图像被存储时,它进行了伽马编码(gamma encoded),因此在一个图像文件中,像素的值是另一个值的两倍大小时,和人眼所感知的两倍亮度的值是接近的。

        Gamma通过V_{out} = V_{in}^{gamma}定义,因此我们谈到gamma值的时候,其实说的就是这个指数的值。当输入的值的范围限定在[0,1]区间内时,gamma取2.2(gamma > 1)和1/2.2(gamma < 1)时,函数图像如下所示:

图3 不同Gamma值的曲线 

       以一副图像数据为例,原始的相机图像在保存为JEPG或TIFF文件时,原始的场景亮度x作为输入,输出值是 x^{\frac{1}{2.2}}。对于上图来说,相当于白色直线上的某个点,变换到到绿色曲线上对应横坐标的点。这个过程叫做图像文件的gamma encoding。

         当显示器要显示JPEG图像时,输入值是文件里存储的值x^{\frac{1}{2.2}},输出值是(x^{\frac{1}{2.2}})^{2.2} = x。这个过程相当于是将原来绿色曲线上的某个点通过橙色曲线“拉回”到了白色曲线上,因此显示器显示的就是原始的场景亮度值x。这个过程可以理解为应用gamma correction。

图像文件GAMMA(image file gamma)

        最精确的图像gamma通常是由嵌入在文件中的颜色配置文件(color profile)所指定。绝大多数图像文件使用的是1/2.2的encoding gamma(比如sRGB),但RAW格式的文件是例外,它使用的是linear gamma(gamma = 1.0)。

        如果在图像文件中没有color profile,那么通常会假设其gamma值是标准的gamma值即1/2.2。典型的没有color profile的图像类型是PNG和GIF文件。

显示设备GAMMA(display gamma)

        工业标准中,显示设备的标准gamma值是2.2。一些老旧的设备如macintosh使用的gamma值为1.8。

        Display gamma值会补偿image file gamma,补偿后的最终结果是系统gamma。下面的几幅图中,蓝色线表示标准的gamma encoded图像文件,红色线表示不同的display gamma,紫色线表示显示出来的最终结果(system gamma)。

图4 不同Display gamma的影响对比 

         这几张图解读起来也很简单。我们假设环境中某个点亮度值为X,如果最终紫色的线中对应点的值大于X,图像看起来就会变亮,否则看起来会变暗(反应到图像上就是Y=X这条中间的线,对应图2中的白色线)。我们记display gamma值为变量D,那么最终紫色线的值Y和X的关系为: Y = (X^{\frac{1}{2.2}})^D = X^{\frac{D}{2.2}}

        第一幅图的D = 1,因此Y = X^{\frac{1}{2.2}},这个值从图3的关系可以看到,Y > X,因此最终结果是图像变亮了。

        第二幅图的D = 1.8,因此Y = X^{\frac{1.8}{2.2}},1.8/2.2约为0.82,其值接近于1,因此函数图像上紫色的线会贴近Y=X,由于其指数小于1,因此在Y=X上方,整体来看Y > X,最终结果是比实际亮度稍亮一点。

        第三幅图的D=2.2,因此Y = X^{\frac{2.2}{2.2}} = X,Y = X,因此最终结果和实际亮度一致。

        第四幅图的D=4.0,因此Y = X^{\frac{4.0}{2.2}},4.4/2.2约为1.82,函数图像上看,紫色线会远离Y=X,由于其指数大于1,因此在Y=X下方,整体来看Y < X,最终结果是比实际亮度要暗。


http://chatgpt.dhexx.cn/article/U18aMO3w.shtml

相关文章

伽马校正-

伽马校正 问题描述&#xff1a;读取图像&#xff0c;然后对图像进行伽玛校正。 伽马校正 这里是一篇写伽马校正比较好的文章&#xff0c;我觉得可以作为背景知识补充。 伽马校正用来对照相机等电子设备传感器的非线性光电转换特性进行校正。如果图像原样显示在显示器等上&…

图形 2.6 伽马校正

一、Gamma校正 1、颜色空间 图中可以看到&#xff0c;sRGB和Rec.709的色域虚线一样&#xff0c;三原色的位置是相同的&#xff0c;那么它们之间的区别就是&#xff1a;传递函数不同 2.传递函数 定义 知道了颜色的颜色值之后&#xff0c;想要在电子设备上显示&#xff0c;就…

伽马校正(Gamma Correction)与sRGB

文章目录 CRT显示器与人眼视觉非线性显示与渲染伽马校正sRGB 纹理正确的点光衰减补充参考资料 CRT显示器与人眼视觉 过去, 大多数监视器是阴极射线管显示器(CRT). 这些监视器有一个物理特性就是两倍的输入电压产生的不是两倍的亮度. 输入电压产生约为输入电压的 2.2 次幂的亮度…

图形学基础——伽马校正

百人计划学习视频连接&#xff1a;【技术美术百人计划】图形 2.6 伽马校正 颜色空间 具体内容在之前的文章有讲&#xff1a;色彩空间介绍 sRGB&#xff1a;微软在1996年发布的通用颜色标准DCI-P3&#xff1a;数字电影播放的颜色标准Rec-709、PAL&#xff1a;电视行业的颜色标…

伽马校正

注&#xff1a;本文为博主参考书籍和他人文章并加上自己的理解所编&#xff0c;作为学习笔记使用并将其分享出去供大家学习。若涉及到引用您的文章内容请评论区告知&#xff01;如有错误欢迎指正&#xff01; 一、伽马校正简介 射伽马校正是图像预处理阶段经常使用的一个非…

可执行文件的装载,进程和线程,运行时库的入口函数(第六章)

目录 第1步.创建一个独立的虚拟内存空间 第2步.读取可执行文件头&#xff0c;建立虚拟空间和可执行文件之间的映射关系 第3步.将cpu的指令寄存器设置成可执行文件的入口地址&#xff0c;启动运行。 程序开始执行&#xff0c;发生页错误。 随着程序的执行&#xff0c;不停…

疯狂python讲义学习笔记——前十章完结

#第一章&#xff1a;绪论 #单行注释多行注释""" 多行注释 """#dir列出指定类或模块的属性与方法&#xff0c;help查看某个函数或方法的帮助文档 print(dir(str)) print(help(str.title))#第二章&#xff1a;数据类型 a5 print(type(a))#<clas…

嵌入式代码学习心得记录

一、C语言学习心得记录 函数递归 编写顺序 终结条件输入下一级递归参数,调用下一级递归函数.当前递归函数的操作代码,在下一级递归函数执行完成后执行的操作代码. #include <stdio.h> #include <string.h>void revert(char *s, int len) {// 终结条件if(len <…

python 字节流分段_一文掌握CTF中Python全部考点

声明&#xff1a;Tide安全团队原创文章&#xff0c;转载请声明出处&#xff01;文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用&#xff0c;任何人不得将其用于非法用途以及盈利等目的&#xff0c;否则后果自行承担&#xff01; 前 言 一次偶然的机会&#xff0c…

Python课程学习笔记 下

笔记目录 Python 学习笔记 上面向对象和异常面向对象基本理论定义类根据类实例化对象属性相关方法相关类的补充属性补充方法相关补充描述器python对象的生命周期内存管理机制面向对象的三大特性面向对象应当遵循的原则 错误和异常错误和异常的概念常见的系统异常和系统异常类继…

从点击APP图标到首页展示的加载过程

转载链接在这里 iOS 系统架构 Mac系统是基于Unix内核的图形化操作系统&#xff0c;Mac OS 和 iOS 系统架构的对比分析发现&#xff0c;Mac OS和iOS的系统架构层次只有最上面一层不同&#xff0c;Mac是Cocoa框架&#xff0c;而iOS是Cocoa Touch框架&#xff0c;其余的架构层次都…

python os模块

10.3 os模块 os就是“operating system”的缩写&#xff0c;顾名思义&#xff0c;os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块&#xff0c;一方面可以方便地与操作系统进行交互&#xff0c;另一方面页可以极大增强代码的可移植性。如果该模块中…

Python:异常处理,模块和包,正则表达式

1&#xff0c;异常处理机制 Python的异常处理机制可以让程序具有极好的容错性&#xff0c;让程序更加健壮。当程序运行出现意外情况时&#xff0c;系统会自动生成一个Error对象来通知程序&#xff0c;从而实现将“业务实现代码”和“错误处理代码”分离&#xff0c;提供更好的可…

操作系统面试题总结

进程的常见状态&#xff1f;以及各种状态之间的转换条件? 创建状态&#xff1a;进程在创建时需要申请一个空白PCB&#xff0c;向其中填写控制和管理进程的信息&#xff0c;完成资源分配。如果创建工作无法完成&#xff0c;比如资源无法满足&#xff0c;就无法被调度运行&#…

Python--多线程与并行

一、线程和进程介绍 1.1、进程基本概念 进程&#xff08;Process&#xff09;&#xff0c;是计算机中已运行程序的实体&#xff0c;曾经是分时系统的基本运作单位。在面向进程设计的系统&#xff08;如早期的Unix、Linux2.4及更早的版本&#xff09;中&#xff0c;进程是程序…

【Python学习】--pythonf笔记

系列文章目录 文章目录 系列文章目录前言一、Python代码规范&#xff08;编码、代码格式&#xff09;1. 编码2. 代码格式3. import 语句4. 空格 二、Python代码注释&#xff08;块注释、行注释、文档注释&#xff09;1. 块注释2. 行注释3. 建议4. 文档注释 三、Python命名规范&…

进程和信号

进程和信号 一、进程初识 1、程序的开始和结束 开始&#xff1a;编译链接时的引导代码。操作系统下的应用程序其实在main执行前也需要先执行一段引导代码才能去执行main。在程序链接时由链接器将编译器中事先准备好的引导代码给链接进去与我们的代码一起组成最终的可执行程序…

什么!学Python多进程的你还不知道multiprocessing模块?该充电了>_(Python编程 | 系统编程 | 并行系统工具 | multiprocessing模块)

文章目录 multiprocessing模块基本操作&#xff1a;进程和锁关于实现和用法的规则 *IPC*工具&#xff1a;管道、共享内存和队列管道共享内存和全局对象队列和子类 启动独立程序其他更多 multiprocessing模块 Python标准库中的multiprocessing模块允许脚本通过与threading模块非…

一文入门Python基础

Python基础 python中的输出函数 print()函数 可以输出的内容 数字字符串含有运算符的表达式(会返回表达式计算的结果) 内容输出的目的地 显示器文件 # 将数据输入文件中&#xff0c;注意点——所指的盘必须存在——使用filefp fp open(路径,模式) print(hello,file fp) fp.…

深入理解Linux进程管理(1.0)

学习方法论 写作原则 标题括号中的数字代表完成度与完善度 0.0-1.0 代表完成度&#xff0c;1.1-1.5 代表完善度 0.0 &#xff1a;还没开始写 0.1 &#xff1a;写了一个简介 0.3 &#xff1a;写了一小部分内容 0.5 &#xff1a;写了一半内容 0.9 &#xff1a;还有个别内容没写 1…