graphics - 抗锯齿和 Gamma 补偿

标签 graphics antialiasing gamma

计算机屏幕上像素的亮度通常与像素的数字 RGB 三元组值不线性相关。早期 CRT 的非线性响应需要补偿非线性编码,我们今天仍在继续使用此类编码。

通常我们在计算机屏幕上生成图像并在那里使用它们,所以一切正常。但是,当我们进行抗锯齿处理时,非线性(称为 Gamma )意味着我们不能仅将 0.5 的 alpha 值添加到 50% 覆盖的像素并期望它看起来正确。 alpha 值 0.5 的亮度仅为 alpha 1.0(典型 gamma 为 2.2)的 0.5^2.2=22%。

对于抗锯齿 Gamma 补偿,是否存在广泛确立的最佳实践?你有每天使用的宠物方法吗?有没有人看过对不同技术的图形输出质量的结果和人类感知的研究?

我曾考虑过进行标准 X^(1/2.2) 补偿,但这需要大量计算。不过,也许我可以使用 256 个条目的查找表使其更快。

最佳答案

查找表经常用于此类工作。它们很小而且速度很快。

但是无论是查找还是某些公式,如果最终结果是图像文件,并且格式允许,最好在文件中保存颜色配置文件或至少保存 Gamma 值以供以后查看,而不是尝试调整RGB 值自己设定。

原因:对于典型的字节值 R、G、B channel ,每个 channel 中的每个像素都有 256 个唯一值。这几乎足以使人眼看起来不错(我希望“字节”被定义为九位!)除了琐碎的值反转之外,任何类型的数学都会对其中一些值进行多对一映射。输出不会为每个像素的 R、G 或 B 提供 256 个值可供选择,但数量要少得多。这可能会导致轮廓、锯齿、色彩噪声和其他不良情况。

抛开精度问题不谈,如果需要任何体面的质量,所有堆肥、混合、混合、色彩校正、假镜头光晕添加、色度键控等都应该在线性 RGB 空间中完成,其中 R 的值、G和B与物理光强度成正比。图像数学模拟物理光数学。但当最终速度至关重要时,就有办法作弊。

关于graphics - 抗锯齿和 Gamma 补偿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233651/

相关文章:

opengl - 在 OpenGL 中调整整个场景的亮度/ Gamma

c# - ImageList:32 位图像质量下降

c# - 在 ASP.NET/C# 中使用 GDI+ 裁剪图像时抗锯齿?

windows - Android Studio 上的 Inconsolata 字体

java - 在 Java 中实现 Gamma 不完整

image-processing - 从rec的正确转换。 709转sRGB

Android:无法清除对 SurfaceView 的初始绘制

java - 带显示列表的 OpenGL 光照

java - 使用 JOGL 在屏幕外绘制

iOS - CAShapeLayer 抗锯齿?