抗锯齿和伽马校正

7
计算机屏幕上的像素亮度通常不是线性相关的数字RGB三元组值。早期CRT的非线性响应需要补偿性的非线性编码,我们今天仍在使用这样的编码方式。
通常情况下,我们在计算机屏幕上生成图像并在那里消费它们,所以一切都很好。但当我们进行抗锯齿处理时,非线性——称为伽马值——意味着我们不能只将0.5的alpha值添加到50%覆盖的像素,并期望它看起来正确。在典型的伽马值(2.2)下,alpha值为0.5只有1.0的22%的亮度。
关于抗锯齿伽马校正,是否有广泛认可的最佳实践? 你是否有从日常生活中使用的方法?有没有人对不同技术的图形输出结果和人类感知质量进行过研究?
我考虑过标准X^(1/2.2)补偿,但这样的计算相当复杂。也许我可以用一个256条目的查找表来加快速度。
4个回答

2
查找表在这样的工作中经常被使用。它们小巧快速。但是,无论是查找表还是某些公式,如果最终结果是图像文件,并且格式允许,最好将颜色配置文件或至少伽马值保存在文件中以供以后查看,而不是尝试自己调整RGB值。
原因:对于典型的字节值R、G、B通道,每个像素在每个通道中有256个唯一值。这几乎足以让人眼看起来很好(我希望“字节”被定义为9位!)。除了微不足道的值反转之外的任何数学运算都会将其中一些值映射为多个值。输出对于每个像素的R、G或B将没有256个可供选择的值,而是远远少于这个数量。这可能会导致轮廓、锯齿状、色彩噪声和其他不良影响。
抛开精度问题,如果需要任何种类的良好质量,则所有的合成、混合、混合、颜色校正、假透镜光晕添加、色度键等都应该在线性RGB空间中完成,其中R、G和B的值与物理光强成比例。图像数学模拟物理光数学。但是,在速度至关重要的情况下,有方法可以作弊。

1
九位字节?你这么喜欢八进制吗? :-) - Donal Fellows

2

Jim Blinns的“Dirty Pixels”一书概述了一种快速而有效的合成计算方法,使用16位数学加上查找表来准确地在线性颜色空间中前后转换。这个人曾参与NASA的可视化工作,他非常懂行。


2

我现在尝试回答实际问题,主要是为了参考:

首先,国际电信联盟(ITU)提供了一些建议(http://www.itu.int/rec/T-REC-H.272-200701-I/en),可以应用于编程(但你必须了解相关知识)。

在吉姆·布林的《符号、符号、符号》第9章中,有非常详细的数学和感知误差分析,虽然他只涵盖了合成(许多其他图形任务也受到影响)。

他所建立的符号也可以用来推导处理伽马的方法,或者检查给定的处理方法是否正确。非常方便,我的宠物方法(主要是因为我独立发现了它,但后来发现了他的书)。


1
生成图像时,通常使用线性色彩空间(如线性RGB或CIE颜色空间之一),然后在最后转换为非线性RGB空间。该转换可以通过硬件或查找表甚至通过巧妙的数学加速。(请参见其他答案的参考资料。)
执行alpha混合(例如,在此背景上呈现此图标)时,为了速度,这种精度通常被省略。结果是直接在非线性RGB空间中通过lerping计算,其中alpha作为参数。这不是“正确”的方法,但在大多数情况下足够好。特别是对于桌面上的图标之类的东西。
如果您想要更准确的混合,可以将其视为原始渲染。在线性空间中工作(可能需要进行初始转换),然后在最后将其转换为非线性显示空间。
现在很多图形都使用sRGB作为非线性显示颜色空间。如果我记得正确,sRGB非常类似于2.2的伽马值,但在低端的值上做了调整。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接