伽马校正探究

        关于伽马校正的前因后果,在网上有不同版本的说法,由于年代久远的因素,导致原本很简单的事情越说越复杂。今天我们的目标就是抓住伽马的头,而不是摸一下伽马的尾巴。

 

一,鱼龙混杂的论调

1,CRT 显示器的物理属性非线性引起

        这一切要从CRT的特性说起, CRT显示器是靠电压来驱动一个能够发射电子束的电子枪来击打荧光屏上的三种荧光粉,使其发出RGB三种颜色的光,通过调节电压的方向可以改变电子束击打在屏幕上的位置,实现扫描,并根据输入信号的大小来调节电压的大小从而改变荧光粉发出光的明暗。但是,电压的大小与荧光粉发出光的明暗之间并不是一个简单的线型关系,在大部分区间,两者之间是一个幂函数关系。通常这里的伽马值取2.2。

          

 2,人眼对自然亮度感知是非线性的引起

        通常人眼对于亮度的感知是不均匀的。在一个黑暗的房间里面点亮一根蜡烛后,可以感受到明显的光明,而继续点亮第二根蜡烛却没有第一根蜡烛的作用明显。原因在于每增加单位亮度感知,需要增加单位亮度的伽马次方的激励。对于这种感知的测试实验有两个著名的人物,分别是韦伯和史蒂芬斯。下面是人眼的感知曲线图。

3,非线性存储节省内存空间引起

        依据于人眼对于暗部信息的敏感度更强,当摄像机拍摄视频后在数字量化编码的过程中,如果均匀分配量化区间,那么会导致暗部的信息丢失,而亮部信息的冗余。这样的丢失和冗余是因为人的眼睛造成的。那么为了消除这样的问题,在OETF阶段做一次伽马编码,通常这里的伽马值取0.45。

 二、抓住伽马的头

        通过多方查找资料,我认为伽马的起源还是来自于CRT显示器的传说,原因有如下几点:

1,CRT显像管具有调制特性 

        

         这里的电压和电流之间的关系已经撇开了人眼的观察,是一个纯粹的物理量,也就是说电压值跟物理亮度之间是幂的关系。

2,CRT显示器出现的年代更早   

        世界上最早发明阴极显像管是1895年,而最早发明数码摄像机是1985年,两者相差大概一百年的时间。对于为了优化存储空间而进行的伽马编码压缩,只有在数字电子产品出现之后才有意义,对于模拟时代的产品来说,使用的模拟电路实现伽马压缩不存在内存空间优化的事情。因此第3种论调不攻自破。

3,为了匹配人眼的感知毫无意义

        人的眼睛天生就是看东西的,这种看体现在真实的感官之上。那么摄像机拍摄视频,显示器显示视频,需要做到的就是要自然的表现自然的东西,意思就是原始世界是一朵红色的花,显示器上也展示一朵红色的花,这时候人眼看起来就毫无违和感,所以伽马校正的起源跟人眼没有关系。因此第2种观点也站不住脚。

三,伽马概念的推广

        1,CRT显示器的伽马值是2.2(准确的说是行业里面大多数厂家趋于这个数值),那么就逼迫摄像机厂家的伽马值是1/2.2=0.45,这样二者级联之后的伽马值就是1,也就是线性的船体函数。

        2,在CRT显示器淘汰之后,在LCD里面人为的添加了一个LUT伽马映射表去模拟CRT显示器的特性,这是为了兼容历史的基因,这个CRT的基因衍生了许多的摄影素材,摄影设备。

        3,为了满足不同场合的显示需求,经常需要微调伽马的数值,这是因为不同的环境会影响显示的效果。电影院的系统伽马值可能需要1.5,而普通室内的系统伽马值可能只需要1.2左右。下图是BT709对于伽马压缩的规定,并不是严格的0.45.

        

        本文的最后附上韩世麟讲解的视频,虽然对于伽马的起源说法是错的,但是从另一个角度看问题,确实也能学到挺多知识。

       1: Gamma校正与线性工作流入门讲解_哔哩哔哩_bilibili

       2:《美术中灰色的物理光强——演示人眼亮度感知的非线性》

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
伽马校正是一种对图像亮度进行非线性调整的算法,通过对输入值进行指数运算,将输出值与输入值呈指数关系,从而调整图像的整体亮度。伽马校正对于优化图像的显示效果非常重要,可以避免图像过亮或过暗的情况。具体的伽马校正计算过程可以用以下公式表示:output = input^(1/Gamma) 下面是一个使用Python实现伽马校正的代码示例: ```python import numpy as np import cv2 def gamma_trans(img, gamma): # 先将像素值归一化处理,再进行伽马计算,后还原到范围 gmma_list = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)] # 将列表转换成nparray,并将数据类型转换为无符号8位整型 gamma_table = np.round(np.array(gmma_list)).astype(np.uint8) # 使用伽马表对图像进行灰度映射 return cv2.LUT(img, gamma_table) if __name__ == '__main__': # 读取图像 im = cv2.imread('data/lena.jpg', 0) # 显示原始图像 matshow('im', im) # 使用伽马值小于1的伽马校正 im = gamma_trans(im, 0.5) matshow('im0.5', im) # 使用伽马值大于1的伽马校正 im = gamma_trans(im, 3) matshow('im3', im) ``` 以上代码使用了NumPy和OpenCV库,首先定义了一个`gamma_trans`函数,该函数接收一个图像和伽马值作为输入,通过计算生成伽马表,然后使用伽马表对图像进行灰度映射。最后,在主程序中读取图像,分别使用伽马值0.5和3进行伽马校正,并使用`matshow`函数显示处理后的图像。通过调整伽马值可以得到不同的伽马校正效果 。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值