全息显示中的Gamma Correction/sRGB2Linear

本文探讨了全息显示中的Gamma校正原理及其在视觉感知中的应用。介绍了人眼对亮度变化的非线性感知特性,以及如何通过Gamma校正使显示器输出更接近人眼感知,确保图像真实还原。

@TOC

全息显示中的Gamma Correction

物理光和视觉传感相关特性

  • 从系统的角度来看变换过程,物理世界的光的变换可以看成是线性恒等变换。即input==output
  • 人眼对暗的区域的变化感应更加敏感,即人眼感知的强度不是线性变化的,比如灯泡功率增大一倍人眼感知的强度并不是原来的两倍。(实际上,我个人觉得这句话其实和gamma较正没有太多联系)
  • 视觉传感器和人眼存在不同,传统相机记录的强度和实际强度是线性变化的,可以理解成传统相机直接记录光子数目。到目前为止,还没有出现任何视觉感知上的问题。
  • 显示器显示图像时,通过存储的图像数据来逐像素控制电压(这一步可以说是线性的),从而控制发光强度。然而这一过程不是线性的,而是一个下凹的曲线。这会导致我们观察到的图像出现偏差(偏暗)。所以我们需要预先编码存储的图像数据,来抵消后面这一非线性的过程。
  • 以显示器为例,人眼所观察到的来自显示器的光应该还原物理光,即从物理到物理这个端到端的整个系统来说,整个变换函数应该是一个恒等变换。

在计算全息中

  • 计算全息涉及到多个类似的概念:强度(sRGB空间或者Linear空间,因为是强度感知的时候需要修正)、振幅。Linear2sRGB如下图所示:
    在这里插入图片描述
  • 由此定义完sRGB空间之后,对于得到的sRGB图像,我们可以先将其转换到线性空间,然后使用平方根求解振幅

References

知乎

### Gamma校正在图像处理和显示技术中的概念 Gamma校正是指调整图像信号强度之间的非线性关系,使得最终呈现给用户的颜色更加自然。显示器和其他输出设备通常不会按照输入电信号的线性比例来重现亮度级别;相反,它们遵循某种幂律响应曲线——即所谓的gamma函数[^3]。 对于计算机图形学而言,在渲染过程中如果不考虑伽玛校正,则可能会导致色彩失真以及抗锯齿效果不佳等问题。例如,当一个物体边缘跨越多个像素时,如果简单地取平均值作为这些部分的颜色值而不经过适当转换的话,那么实际看到的结果会显得过暗,并且边界处可能出现明显的伪影现象,这被称为“套索效应”。 ### 应用场景 在数字摄影领域中,相机捕捉到的数据通常是未经压缩并接近于物理世界的线性光照条件下的信息。然而大多数消费级显示屏并不能很好地再现这样的数据,因为人类视觉系统本身具有一定的非线性特性。为了使照片看起来更贴近真实情况,就需要对原始影像做相应的修正操作—这就是为什么JPEG文件内部存储着已经过预处理(包括但不限于伽马编码)后的RGB数值的原因之一。 另外,在视频编辑软件里也会涉及到此方面的设置选项,以便确保不同平台之间的一致性和兼容性。比如YouTube等流媒体服务提供商就规定上传者应当提交符合Rec.709标准的作品,其中便包含了具体的伽马参数说明。 ### 实现方法 一种常见的做法是在绘制之前先将所有颜色由sRGB空间映射回线性域完成必要的计算后再转回去展示给观众看。具体来说就是: 1. 将每个通道上的分量从8位整数形式转化为浮点型; 2. 使用逆向伽马解码公式\(C_{linear} = C_{encoded}^{(\frac{1}{\gamma})}\),这里γ代表目标系统的典型指数,默认情况下可以设为2.2左右; 3. 执行诸如混合、模糊之类的变换动作; 4. 最终再经由正向伽马编码\(C'_{encoded}=C'^{\gamma}_{linear}\)恢复至适合输出的状态。 ```python import numpy as np def gamma_correction(image, gamma=2.2): """Apply gamma correction to an input image.""" # Convert from uint8 (0-255 range) to float between 0 and 1. img_float = image.astype(np.float32)/255 # Apply inverse gamma function for linear space operations. corrected_img = np.power(img_float, 1/gamma) # Perform some operation in linear space... # Reapply forward gamma encoding before converting back to original format. final_image = np.clip(np.power(corrected_img, gamma), 0., 1.) return (final_image * 255).astype(np.uint8) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值