四、光强度的显示
(一)、强度等级的分配
有没有人想过这样一个问题,即为什么我们常用的RGB模型中的亮度等级是线性变化的?亮度等级又是如何分配到RGB(0,0,0)致RGB(255,255,255)的呢?下面我们将来探讨这些问题。
对于RGB三个分量表示的一个像素,显示卡将其先通过D/A转化为电信号,再经过显示器最终输出到屏幕上,那么我们先来看看我们是怎样把亮度等级分配到0到1的范围内的。首先,我们对于光强度的感觉和声音强度的感觉是相同的,即按对数等级变化。这表示若两个强度的比率和另两个强度之间的比率相同,则我们所感觉到的两个强度之间的差异也相同。因此,为了显示n+1个我们感觉亮度按线性变化的亮度等级,必须将显示器上的等级按下式分布,来得到线性变化的亮度感觉。
I1/I0 = I2/I1 = … = In/In-1 = r
我们假定,显示器上所能显示的最低等级为I0,最高等级为In,任意的中间强度Ik即为:
Ik = rkI0
假定最高强度In为1,对于特定的I0和n,我们就可以得到比值r:
r = (1/I0)1/n
通常我们用的显示器I0在0.005到0.025之间,对于每像素灰度为8位(n=255)I0=0.01的显示器,相邻强度等级的比率r=1.0182,其256个强度等级的近似值为0.0100、0.0102、0.0104、0.0106、0.0109、……、0.9821和1.0000。
对于彩色系统,我们可以对R、G、B三个分量分别用上述方法设置强度等级。这样,我们就得到了我们通常使用的一个光强度按线形变化的RGB模型。
(二)、Gamma矫正
我们所使用的显示器是一种非线性设备,而显示器的电子枪电压和线性像素值是成正比的,那就是说光照模型产生的一组线性变化的光强度值,在显示器上显示出来会变为非线性的。例如RGB色为(128,128,128)的像素的光强度是(255,255,255)的一半,但在显示器上显示出来确并不是这样,请看下图:
这副图的背景是用半色调抖动出来的正确的(128,128,128)色块,中间的色块是用(128,128,128)填充的色块。如果显示器是线性的那么中间的色块远看上去应该和背景色没有差别,然而由于显示器的非线性,导致现在我们可以很明显的感觉到中间的色块要暗的多。下图是显示器的响应曲线,所显示的强度实际是按该图变化的。
我们用下面这个函数描述显示器响应曲线:
I=aVg
I为光强度,V为电压,参数a和g决定显示器的属性。这样对于一个特定的强度值I,我们就可以计算出正确的电压值(也即像素值):
V=(1/a)1/g
这种计算就称为光强度的Gamma矫正,一般的显示器g值通常为2到3之间,这和具体的显示器有关。下图是经过Gamma矫正后的图片(g值取2),看上去明显要好的多,如果我们选取更精确的Gamma值就可以使中间的色块完全消失在背景色中。
通常说来,我们的显示卡都会提供硬件级的Gamma矫正,那样就可以不必用软件来实现,我们在具体的软件中给用户提供一个选择正确Gamma值的机会,不过用了Gamma矫正后会损失一些像素精度(特别是在高亮度区),这点也需要注意。