理解 Gamma | ||||||||||
作者:较瘦 发表时间:2005.4.20 | ||||||||||
关于Gamma的学习笔记。欢迎参观、指导。。 1. 在哪见过、听说过Gamma? 2. 什么是Gamma? 2.1. 显示器Gamma曲线 3. 什么是Gamma校正? 4. Gamma校正可能发生在哪里 4.2. 应用程序级 4.3. 文件级 5. 改变Gamma带来的影响 5.1. 影调的变化 5.2. 颜色的变化 5.3. 其它 6. 校正Gamma的理由 6.1. 标准化及互换性 6.2. 算法上的要求 7. 不校正Gamma的理由 7.1. 现实的非标准化 7.2. 更符合视觉特性 7.3. 可能导致颜色数的减少 8. 结论 1. 在哪见过、听说过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的 …… 这些都是怎么回事? 图 1-1 显卡(驱动程序)上的Gamma设置现在很多显卡上都有Gamma设置(图中是一破烂集成显卡)。 图 1-2 ACDSEE中的曝光调节 2. 什么是Gamma? 2.1. 显示器Gamma曲线 Gamma可能源于CRT(显示器/电视机)的响应曲线,即其亮度与输入电压的非线性关系。 图 2-1 一典型显示器 的响应曲线,非常接近指数函数 图片来源:http://radsite.lbl.gov/radiance/refer/Notes/gamma.html (说明:上图中输入值为数字化的,即通常的RGB值,但可以理解数/模转换是线性的,所以它和输入电压是等效的。) 归一化后,我们通常可以用一简单的函数来表示: output = input ^ gamma gamma就是指数函数中的幂 图 2-2 归一化的Gamma曲线 图片来源:http://www.teamten.com/lawrence/graphics/gamma/ 注意上图曲线的一些特性: * 端点是不变的,即不管gamma值如何变化,0对应的输出始终是0,1的输出始终是1(这一特性会被用到)。这可能是gamma又被叫作“灰度”系数的原因吧。 * gamma > 1时,曲线在gamma=1斜线的下方;反之则在上方。 另外说明一下,虽然是以显示器作为例子,但可扩展到一般的图像相关的输入/输出设备。Gamma曲线应该是普遍存在的,即使它不是严格的指数关系,可能还是会这么通称。至少我知道的数码机机/摄像头里的sensor也存在gamma曲线及gamma校正。 2.2. 检查显示系统的Gamma值 在PC上,好像还没有什么软件方法可以得到系统的Gamma值(4.1会说明这一点)。有人做了一些图片,可以粗略估计。其原理和Adobe Gamma类似。 图 2-3 Gamma对照图 图片来源:http://radsite.lbl.gov/radiance/refer/Notes/gamma.html 另有一张类似的图片: /Article/UploadPic/2005-6/20056820102824.gif 使用方法:与Adobe Gamma类似,即眯着眼,或站远点,或近视眼取下眼镜,总之当左边糊成一片,而右边某栏的亮度和左边相当时。 注意:如果您没有做任何Gamma校正(没有使用Adobe Gamma之类的软件,或虽使用了但校正系数设为1.0),测得的才是显示器的Gamma,否则只能称为系统Gamma(或复合Gamma)。 另外,通过显示器自带的ICC Profile是可以知道显示器的Gamma的,这个应该比较准。我看了自己的G71f+,大约是2.2. 3. 什么是Gamma校正? 从一个数字化的图片文件,到我们最终看到的图片,中间要经过许多环节。几乎在任何一个环节上,都可以加入一些变换,以改变最终输出和最初输入的关系(类似的,这种关系被称作系统Gamma或复合Gamma)。 比如,对gamma=2.5的显示器,在数据传递到显示器之前,将其做一个gamma=0.4的变换(比如对显卡缓存中的数据,d’ = d ^ 0.4),这样就能从总体上得到一个线性的关系。 注意这里有一点混乱。通常我们说做一个gamma=c的校正,意思是指做output = input ^ (1/c)的变换。有一个倒数关系。 对于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校正过程有更详细的说明。 http://www.cgsd.com/papers/gamma_diagram.html 4. Gamma校正可能发生在哪里 4.1. 系统级(硬件、操作系统) 显示器内没有听说过有何补偿,即使有,它们也对外呈现一定的gamma值。DVI接口的及LCD类显示器不清楚。 主要的补偿发生在显卡及其驱动程序类。如果显卡硬件不支持,则由驱动程序软件完成。在Windows中,上层通过调用驱动程序的一个接口函数(DrvIcmSetDeviceGammaRamp)向其传递Gamma校正表(LUT),这个表的大小是3*256项(每项16字节),对应于RGB三个通道,每个通道256级。描述这一细节,可以对有些事情更有把握: * 这种校正实际上可以是任意函数,而不限于gamma为幂的指数函数。 * 也是因为此,不能通过驱动程序得到系统的gamma值(因为最多只能得到那个表)。 * 这一设置对整个系统有效(任何程序,任意显示的图片都受它影响)。 以前我一直不明白Adobe Gamma和驱动程序的Gamma是什么关系,它们一起出现就不知所措。还有人说它们是共同作用的。现在我完全明白了,没有迭加关系,最后者的设置有效。而且,Adobe Gamma也不必是(实际上也不是)一个驻留程序,它仅在启动时将那个表传给驱动程序就完成了它的任务。 还可以用其它程序来校正/设置gamma,下面是一个方便的小工具:Gamma Panel。(查看本文中的图片,需要经常改变gamma,最好下一个,Free的。) http://www.stars.benchmark.pl/index.php?show=gapa&SID=5c96c83c7df02e6e44dea37584af9534 图 4-1 Gamma Panel,一个校正系统Gamma的小工具 图中的Gamma是校正系数,即实际曲线是:output = inupt ^ (1/gamma) 4.2. 应用程序级 如前提到的,某些播放软件有Gamma校正功能,ACDSEE也有。这时,它们不是修改系统的Gamma校正表,而是在解码时对当前帧/图像作了实时的Gamma变换。 图 4-2 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发生了怎样的变化,然后做一些乘除法就可以了。 5. 改变Gamma带来的影响 5.1. 影调的变化 通常的感觉是,系统gamma高,图像会发暗,而校正后,画面变亮。观察下列图片。 两个对应的File Gamma=2.5的图片是为了模拟系统Gamma的变化。或者也可以用Gamma Panel之类的工具,将Gamma校正系数设为1.0~2.5观察(每组中的第1个图片)。 图 5-1 灰度图0-128, File Gamma=1.0 图片来源:http://www.cgsd.com/papers/palette2.html 图 5-2 灰度图0-128, File Gamma=2.5 图片来源:http://www.cgsd.com/papers/palette2.html 图 5-3 灰度图128-255, File Gamma=1.0 图片来源:http://www.cgsd.com/papers/palette.html 相关文章
推荐文章最新文章 |