Gamma详解

在显示器应用的过程中,经常会遇到一个参数 Gamma 值,许多人对此了解不深, Gamma 值在影像显示中到底起什么作用?我们如何设置适宜的 Gamma 值?在此我们转载太平洋电脑网的一篇文章,文中讲述了 Gamma 的概念及如何设置,希望能对大家有所帮助!
一. 在哪见过、听说过Gamma?
   * 还用说,Adobe Gamma
  * 常听说MAC的默认Gamma是1.8,PC的是2.2
  * 我的显卡驱动程序里有Gamma调节
  * 我下载了一个软件,也可以调节显示器的Gamma
  * WinDVD播放器带Gamma校正功能
  * ACDSEE的曝光调节里可以调Gamma
  * ACDSEE的选项中有Enable Gamma Correction
  * XV Viewer 能以参数-gamma 2.2 启动(x window也可以)
  * PNG文件里有Gamma校正
  * Photoshop里当然也有
  * ICC Profile也和Gamma有关?
  * 摄像头、数码相机、扫描仪?胶片?……中也有提到Gamma的
  ……
这些都是怎么回事?

显卡(驱动程序)上的Gamma设置

ACDSEE中的曝光调节
二. 什么是Gamma?
   2.1. 显示器 Gamma 曲线
   Gamma 可能源于 CRT (显示器 / 电视机)的响应曲线,即其亮度与输入电压的非线性关系。
 

一典型显示器的响应曲线,非常接近指数函数
上图中输入值为数字化的,即通常的 RGB 值,但可以理解数 / 模转换是线性的,所以它和输入电压是等效的。
归一化后,我们通常可以用一简单的函数来表示:
   output = input ^ gamma
   gamma 就是指数函数中的幂。

归一化的Gamma曲线
注意上图曲线的一些特性:
   * 端点是不变的,即不管 gamma 值如何变化, 0 对应的输出始终是 0 , 1 的输出始终是 1 (这一特性会被用到)。这可能是 gamma 又被叫作“灰度”系数的原因吧。
   * gamma > 1 时,曲线在 gamma=1 斜线的下方;反之则在上方。
  另外说明一下,虽然是以显示器作为例子,但可扩展到一般的图像相关的输入 / 输出设备。 Gamma 曲线应该是普遍存在的,即使它不是严格的指数关系,可能还是会这么通称。至少我知道的数码机机 / 摄像头里的 sensor 也存在 gamma 曲线及 gamma 校正。
2.2. 检查显示系统的 Gamma 值
  在 PC 上,好像还没有什么软件方法可以得到系统的 Gamma 值( 4.1 会说明这一点)。有人做了一些图片,可以粗略估计。其原理和 Adobe Gamma 类似。
 

Gamma对照图
  使用方法:与 Adobe Gamma 类似,即眯着眼,或站远点,或近视眼取下眼镜,总之当左边糊成一片,而右边某栏的亮度和左边相当时。注意:如果您没有做任何 Gamma 校正(没有使用 Adobe Gamma 之类的软件,或虽使用了但校正系数设为 1.0 ),测得的才是显示器的 Gamma ,否则只能称为系统 Gamma (或复合 Gamma )。如笔者的 ACER AL1916W 的 GAMA 值为 2.0 左右。
  另外,通过显示器自带的 ICC Profile 是可以知道显示器的 Gamma 的,这个应该比较准。
三. 什么是Gamma校正?
  从一个数字化的图片文件,到我们最终看到的图片,中间要经过许多环节。几乎在任何一个环节上,都可以加入一些变换,以改变最终输出和最初输入的关系(类似的,这种关系被称作系统 Gamma 或复合 Gamma )。
  比如,对 gamma=2.5 的显示器,在数据传递到显示器之前,将其做一个 gamma=0.4 的变换(比如对显卡缓存中的数据, d ’ = d ^ 0.4 ),这样就能从总体上得到一个线性的关系。
  注意这里有一点混乱。通常我们说做一个 gamma=c 的校正,意思是指做 output = input ^ (1/c) 的变换。有一个倒数关系。
 

Gamma校正示意图
  对于 PC ,显示器的 Gamma 是 2.2 左右(可能以前更多的是 2.5 ,现在好像趋向 2.2 了),一般没有内置的校正,所以我们说 Adobe Gamma 对 Windows 系统默认的校正系数 2.2 。对于 MAC ,显示器的 Gamma 是 2.5 ,硬件内置了 1.4 的校正,所以它还需要 2.5/1.4~=1.8 的校正才成为线性的。下文对各种系统下的 gamma 校正过程有更详细的说明。
四. Gamma校正可能发生在哪里
   4.1. 系统级(硬件、操作系统)
  显示器内没有听说过有何补偿,即使有,它们也对外呈现一定的 gamma 值。
  主要的补偿发生在显卡及其驱动程序类。如果显卡硬件不支持,则由驱动程序软件完成。在 Windows 中,上层通过调用驱动程序的一个接口函数( DrvIcmSetDeviceGammaRamp )向其传递 Gamma 校正表( LUT ),这个表的大小是 3*256 项(每项 16 字节),对应于 RGB 三个通道,每个通道 256 级。
  描述这一细节,可以对有些事情更有把握:
   * 这种校正实际上可以是任意函数,而不限于 gamma 为幂的指数函数。
   * 也是因为此,不能通过驱动程序得到系统的 gamma 值(因为最多只能得到那个表)。
   * 这一设置对整个系统有效(任何程序,任意显示的图片都受它影响)。
  以前我一直不明白 Adobe Gamma 和驱动程序的 Gamma 是什么关系,它们一起出现就不知所措。还有人说它们是共同作用的。现在我完全明白了,没有迭加关系,最后者的设置有效。而且, Adobe Gamma 也不必是(实际上也不是)一个驻留程序,它仅在启动时将那个表传给驱动程序就完成了它的任务。
  还可以用其它程序来校正 / 设置 gamma ,下面是一个方便的小工具: Gamma Panel 。(查看本文中的图片,需要经常改变 gamma ,最好下一个, Free 的。)

Gamma Panel,一个校正系统Gamma的小工具
   4.2. 应用程序级
  如前提到的,某些播放软件有 Gamma 校正功能, ACDSEE 也有。这时,它们不是修改系统的 Gamma 校正表,而是在解码时对当前帧 / 图像作了实时的 Gamma 变换。

ACDSEE浏览图片时可加载Gamma校正功能
图中左边是由 IE 打开的同一图片(无 Gamma 校正),可以看出它们的亮度不同。(不过,黑框和白边是相同的。)
   4.3. 文件级
  如前面提到的(图 1-2 ACDSEE 中的曝光调节),某些图像处理软件可以调整文件的 Gamma ,这种调整的结果将写入文件(即相当于对图像进行某种处理)。比如,当你的 PC 未进行 Gamma 校正(你的系统 Gamma= 显示器的 Gamma 约 2.2 ),这时你可以把文件的 Gamma 调为 2.2 保存,你以及其它未校正系统 Gamma 的 PC 用户看到的这个图片应是正好的。(注意,这里有一个前提即原始图片在 Gamma=1 的系统上看是“正好”的。
  另一种方式则是将 Gamma 校正的系数写入文件内,而不改变文件内容,而浏览 / 处理软件在解码这一图像时会依据这一参数对它单独进行 Gamma 校正。(这被称作“文件 Gamma ”。 PNG 格式支持)
  总之,不管 Gamma 校正发生在哪一环节,它们是等效的(在理想情况下 / 或近似地看)。明白在哪些环节 Gamma 发生了怎样的变化,然后做一些乘除法就可以了。
五. 改变Gamma带来的影响
   5.1. 影调的变化
  通常的感觉是,系统 gamma 高,图像会发暗,而校正后,画面变亮。
  观察下列图片。
  两个对应的 File Gamma=2.5 的图片是为了模拟系统 Gamma 的变化。或者也可以用 Gamma Panel 之类的工具,将 Gamma 校正系数设为 1.0~2.5 观察(每组中的第 1 个图片 ) 。

灰度图0-128, File Gamma=1.0

灰度图0-128, File Gamma=2.5

灰度图128-255, File Gamma=1.0

灰度图128-255, File Gamma=2.5 

           

很直观的调整Gamma值的例子
结论:
   * 当系统 Gamma 高( Gamma 校正 =1.0 )时,看到的图像暗部影调丰富;反之,则亮部丰富。
   * Gamma 校正设为 2.5 时看到的 File Gamma=2.5 的图片,和校正设为 1.0 时看到的 File Gamma=1.0 的图片相当。
   5.2. 颜色的变化
很显然, Gamma 的变化带来亮度的变化。而单独改变某个通道的 Gamma ,则会则会带来色调( Hue )的变化。

             

Gamma Correction = 1.0    Gamma Correction = 2.5
Source Output    Source Output
R 80% R 57%    R 80% R 80%
G 20% G ~0%    G 20% G 20%
B 20% B ~0%    B 20% B 20%
当然,如果显示器本来就偏色,我们则可以改变某个通道的 Gamma 使其总体上保持均衡。
六. 校正Gamma的理由
  主要指是否要将系统 Gamma 校正到 1.0 。因为校正总是存在的。(下同)
   6.1. 标准化及互换性
  如果数码相机 / 扫描仪给你一个 Gamma=1.0 的图片,你最好是在系统 Gamma=1.0 的系统上查看;或者当你的数码图片要拿去输出时,对方系统 Gamma=1.0 ;……
  (这部分涉及到色彩空间、 ICC Profile ,我还不太清楚,而且接触的设备非常有限,不多说了。)
   6.2. 算法上的要求
  在涉及不同灰度的混合时,就会对 gamma 有要求。一个简单的例子,考虑在填充时,一半的黑( 0 ) + 一半的白( 255 ),效果应该和 50% 的灰( 128 )相同。但这仅在系统 gamma=1.0 时成立。
  又如,彩色转黑白时常说的: 30% R + 59% G + 11% B ,也是针对 gamma=1.0 而言。
  同样,许多算法也是针对 1.0 的系统 gamma ,否则算法内要做 gamma 校正。
下面是一个抗距齿( anti-alias ,反走样)的例子。

通常情况下的边缘
由于只能在矩形的点阵中画斜线,而斜线的像素值为全黑,当斜线较陡(或平)时,就会有明显的锯齿感。

采用anti-alias后,锯齿感没有那么明显了
在 Photoshop 中放大查看此图片,就会发现边缘不是全黑的,而是渐变的。(这是对 anti-alias 的直观理解。)
注:不要用 ACDSEE 放大查看,它默认的放大算法是插值的,无法看清像素的原貌。

anti-alias并gamma校正后,锯齿感完全消失
当然,如果你保持系统 gamma=1.0 去查看上面的图片,就会发现第 2 张图完全无锯齿感,第 3 张图反而有一点。(这不是也可以作为一种估计系统 gamma 的方法吗)
七. 不校正Gamma的理由
   7.1. 现实的非标准化
  假定你的图片作为 Web 发布,你的用户(观众)的系统 Gamma 会是 1.0 吗?——在接触到 Photoshop 前,我是不知道什么 Gamma 的。
也许只能折衷吧。( MAC 通过硬件只校正到 1.8 , SGI 只校正到 1.4 ,不知道有没有这方面的原因。)

               

  而我们整天面对的操作系统,它默认用户界面的设计,又是以什么系统 Gamma 值为前提的呢?——似乎设为 1.0 并不是最舒服的。
   PNG 文件格式提供了 Gamma 补偿的功能,但并没有流行起来,因为人们不知道他们的系统 Gamma 是多少(当然还有别的原因)。
   7.2. 更符合视觉特性
  就人的感知觉,心理量和物理量一般呈对数关系,视觉也不例外。虽然这个对数关系和那个指数关系并不严格对应,但方向上是一致的。即越暗处感觉越细(对同等光强的变化,暗处比亮处敏感),而对于(未校正的)显示器 gamma 曲线( gamma 值大于 1 ),也是暗处对应的层次更多。
  比如对 gamma=2 ,以一半的光强为分界, 0~182 对应于暗的一半, 182~255 对应于亮的一半。
   7.3. 可能导致颜色数的减少
  这是由于数字量的舍入误差造成的。输入数据按通常的每通道 8 位计算,当显卡( DAC )精度只有 8 位时就会发生。
   x = 0:255; y = uint8((x / 255) .^ gamma * 255); n = histc(y, x); count = sum(n>0)
  当 gamma=2 (或 0.5 )时,结果 count=192 ,即 256 色变为了 192 色。若三通道 Gamma 值(校正系统)相同,则总共的颜色数为 192^3 = 707,788 色,而 24 位色原本为 16,777,216 。
  当然,对 10bit, 12bit 及更高位显卡就不存在这个问题了。(以前一直不明白在 8bit 色彩的系统上,更高位的显卡有何意义。现在有一点感受了。)
 八. 结论
   Gamma 是一个基本的要素。关心图形、图像的人应该给它一点关心。
  不将显示系统 Gamma 校正到 1.0 似乎并没有太大的错误,至少你和人民大众站在了一边。校正到什么程度,既有折衷的考虑,也有口味的因素。但不偏色是必要的。当标准需要你校正时,你最好遵守标准。总之,取决于你的图片与谁“接口”。
   Gamma 只是 ICC Profile 的一部分。关于标准及互换性的问题,也许只有理解了色彩管理以后,才能完全明白。

Gamma详解相关推荐

  1. matlab对图像进行gamma变换_matlab灰度图像调整及imadjust函数的用法详解

    matlab--imadjust函数作用: 对进行图像的灰度变换,即调节灰度图像的亮度或彩色图像的颜色矩阵 在MATLAB中,通过函数imadjust()进行图像灰度的调整,该函数调用格式如下: J= ...

  2. LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用

    LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...

  3. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization

    <<小白学PyTorch>> 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积.激活.初始化.正则 扩展之Tensorflow2.0 | 20 TF ...

  4. pythonsvc_sklearn-SVC实现与类参数详解

    sklearn-SVC实现与类参数 它是基于libsvm实现的.随着样本数量的增加,拟合时间的复杂度要高于二次,这就使得当样板数量超过一万个时,很难扩展到数据集中. 在多类处理时,是按照1对1的方案进 ...

  5. Xgboost算法原理详解及python实现

    Xgboost算法(回归树) 1.算法原理 2.对数据的要求(无需规范化) 3.算法的优缺点 4.XGB.GBDT.LR与RF 5.python代码实现 导入相关包 读取数据并预处理 训练 贝叶斯初步 ...

  6. 三维重建:PNG格式详解-与LibPNG使用

    PNG图像包含了骨骼信息,左边的图像比右边的大几十K,包含了骨骼信息:        PNG格式详解:https://blog.mythsman.com/post/5d2d62b4a2005d7404 ...

  7. Sklearn参数详解—SVM

    总第108篇 本篇主要讲讲Sklearn中SVM,SVM主要有LinearSVC.NuSVC和SVC三种方法,我们将具体介绍这三种分类方法都有哪些参数值以及不同参数值的含义. 在开始看本篇前你可以看看 ...

  8. Halcon例程(基于3D形状匹配识别方法)详解 —— create_shape_model_3d_lowest_model_level.hdev

    一.例程简介 最近在研究3D识别方面的东西,查了不少资料,发现halcon里有不少关于三维物体识别的例程,这里对其中一个做出详解.该例程是基于三维匹配方法的,因为有三维模型SM3,所以不需要自己创建: ...

  9. python支持向量机回归_Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导 ...

最新文章

  1. ​有多少小伙伴用着 JDK8 却写着 JDK6 的代码
  2. 干掉 GuavaCache:Caffeine 才是本地缓存的王
  3. VMWare假造机上装配Ubuntu Linux体例-1
  4. SQLMAP注入教程-11种常见SQLMAP使用方法
  5. protobuf-2.5.0安装
  6. mplab x ide 中文使用手册_SCI必备利器:翻译又快又准,强推这款超牛X的神器!...
  7. 从此明白了卷积神经网络(CNN)
  8. 京东健康APP内测版已上线各大安卓应用商店
  9. hihoCoder1687(向量叉积)
  10. connect by prior id= pid start with id='1' 树结构查询
  11. 【创建型】Prototype模式
  12. 服务器备份软件cwRsync
  13. 国内的微软更新服务器地址,windows update 服务器
  14. 未来15年,还有一波“增量”机会
  15. nlp自然语言处理_自然语言处理中的偏见nlp是一个危险但可解决的问题
  16. 华为云服务查找手机_华为云服务登录入口
  17. 大前端学习笔记--持续随缘更新
  18. 怎么用matlab画一个笑脸,MATLAB笑脸识别
  19. 前端处理emoji表情的编码解码
  20. mac电脑开机进入grub界面

热门文章

  1. 九阳JYL-Y92与Y99型号破壁机对比评测
  2. 各种json工具包的比较:
  3. 我的Java学习笔记(六)----IO流
  4. C++ 高阶操作:模板元编程
  5. python登录斗鱼_Python实现抓取斗鱼实时弹幕
  6. STC16f40k128——时钟系统
  7. 计算机培训费用濮阳,濮阳云计算培训,濮阳计算机培训费用,濮阳计算机培训完工作好不好找 - IT教育频道...
  8. Latex在引用表格和图片时,出现编号错误。
  9. uml里的extend和include_解析UML用例图中include与extend的区别
  10. Linux下基于root新建用户,以user_00为例