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
的一部分。关于标准及互换性的问题,也许只有理解了色彩管理以后,才能完全明白。
|