显示与图像领域中的Gamma值来源与Gamma校正

目录

一、定义:

二、 来源1:CRT显示器的电压与亮度非线性

 三、来源2:人眼对黑白的敏感程度是不一样

 四、sRGB的概念与理解

五、Gamma Space 与 Linear Space

 1:Gamma Space

  2:Linear Space

五、Gamma Correction流程

§ 模拟gamma2.2

§ 数字digital Gamm

一、定义:

(Gamma Correction,伽玛校正):所谓伽玛校正就是对图像的伽玛曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比度效果。计算机绘图领域惯以此屏幕输出电压与对应亮度的转换关系曲线,称为伽玛曲线(Gamma Curve)。


二、 来源1CRT显示器的电压与亮度非线性

      在早期的计算机发展史中,我们使用的设备大都是CRT显示器,即阴极射线显像管。阴极射线显像管有一个特点,就是我们输入的电压与得到的亮度不对等,最简单的例子,输入两倍的电压,亮度却没有对应增长为两倍。其关系大致会呈一个幂曲线。

      而历史上最早的显示器(阴极射线管)显示图像的时候,电压增加一倍,亮度并不跟着增加一倍。即输出亮度和电压并不是成线性关系的,而是呈亮度增加量等于电压增加量的2.2次幂的非线性关系:

       2.2也叫做该显示器的Gamma值,现代显示器的Gamma值也都大约是2.2。这种关系意味着当电压线性变化时,相对于真实世界来说,亮度的变化在暗处变换较慢,暗占据的数据范围更广,颜色整体会偏暗。


 三、来源2:人眼对黑白的敏感程度是不一样

        人眼对光强的感知能力并不是线性的——对暗部颜色变化更敏感,但很难识别亮部的颜色差异。如图,在真实世界中(下方),如果光的强度从0.0逐步增加到1.0,那么亮度应该是线性增加的。但是对于人眼来说(上方),感知到的亮度变化却不是线性的,而是在暗的地方有更多的细节。换句话说,我们应该用更大的数据范围来存暗色,用较小的数据范围来存亮色。这就是sRGB格式做的,定义在Gamma0.45空间。而且还有一个好处就是,由于显示器自带Gamma2.2,所以我们不需要额外操作显示器就能显示回正确的颜色。

        胶片在发明和发展的过程中,用化学成像的方式充分模拟了人眼的“非线性感受光的能力”。胶片在其宽容度范围内,对光线强弱变化的反应比较接近人眼,因此胶片经曝光经冲洗获得的相片,我们就认为是“正确和真实”的,因为胶片所拍摄到的画面跟我们看到的差不多。

        CCD、CMOS成像方式是通过像点中的“硅”感受光线的强弱而获得画面。而硅感光是物理成像,它真实地反应光线强度的变化,来多少就输出多少,因此它对光线的反应是线性的。于是,它的伽马跟人眼的伽马就冲突了。看下面这个图:

         这是同一个景物,左边是我们人眼看到的画面,右边是CCD成像的画面。CCD可能更接近真实的世界,因为当时的亮度也许就不高,但对于人眼而言,已经足够把这坨花看得真真切切了。但我们一看CCD出来的东西,哇靠,什么玩意儿啊,整个一废品嘛。但实际上,CCD获得的光线跟人眼获得的光线是一样的,只是反应不同罢了;换句话说,人眼所获得的画面数据,CCD也同样都获取了。那么,要想输出一张“像人眼看到的那样”的画面,只需要调整一下“对光线的反应”就可以了,而“对光线的反应”就是伽马曲线。看下图:

        这就是Gamma值的两种来源所在。以上内容,看完后还是不懂也没关系,可以先死记住以下几个知识点:

  • 显示器的输出在Gamma2.2空间。
  • 伽马校正会将颜色转换到Gamma0.45空间。
  • 伽马校正和显示器输出平衡之后,结果就是Gamma1.0的线性空间。
  • sRGB对应Gamma0.45空间。

 四、sRGB的概念与理解

        人眼对亮度的感知不是线性的,其对较暗区域的变化更加敏感,基于人眼该特点,sRGB标准要求图像(各通道为8bits,最多存储256个亮度值)使用编码伽马,把更多地空间用来存储更多暗部区域,来最大化地利用表示亮度的数据位或带宽。

        SRGB(standard Red Green Blue)是一种语言协议,它提供一种标准方法来定义色彩,让显示、打印和扫描等计算机外部设备与应用软件对于色彩有一个共通的语言。sRGB代表了标准的红、绿、蓝,即CRT显示器、LCD显示器、投影机、打印机以及其他设备中色彩再现所使用的三个基本色素。sRGB的色彩空间基于独立的色彩坐标,可以使色彩在不同的设备使用传输中对应于同一个色彩坐标体系,而不受这些设备各自具有的不同色彩坐标的影响。

    解码gamma-编码gamma”其实是一种理想化的机制,只在所有显示器Gamma值统一的条件下有效。然而现实中每一台显示器的解码Gamma值并不统一,这就会导致同一张图片在不同显示器上看起来不一样。对此,人们提出的解决方案是引入Color Profile(色彩配置文件),你可以把它简单的理解为RGB数值与颜色波长之间的对应关系。图片文件都自带有一个Color Profile,它声明了图片的RGB值对应的波长,显示器接收到这个波长值后,根据显示器自己的Color Profile转换为屏幕输出该特定波长所需的RGB值。

        Color Profile引入“波长”这个量的同时,也包含了Gamma校正。 sRGB是一种最常用的Color Profile,是微软联合惠普等厂商联合制定的色彩标准。我们可以认为sRGB色彩空间就是Gamma色彩空间


、Gamma Space 与 Linear Space

 1:Gamma Space

        观察下图,左边的图片更加接近人眼实际看到的样子,但显示器真正显示出来的却是右边图片的样子。

        为了确保我们看到的图片与显示器显示出来的一样,就需要显示器去进行伽马校正计算来中和抵消输入信号与输出亮度的非线性关系。伽马校正的通用公式,可以表达成:

output = input^y

      当 𝛾 小于1的时候,我们称为 伽马编码(Gamma Encoding

      当 𝛾 大于1的时候,我们称为 伽马解码(Gamma Decoding

      由于没有一个很好的时机可以在显示器校正输出前对数据进行伽马编码,于是普遍的做法是,我们会在图片存储的时候进行伽马编码,它的公式如下:

output = input^{1/gamma}

        因此实际图片存储的颜色会偏亮一些,等到在显示器输出时,再通过伽马校正(解码)得到更接近我们人眼识别到的图像。

  2:Linear Space

        既然使用伽马颜色空间能够方便在显示器上显示出更接近人眼感知的颜色,为什么还要用线性颜色空间呢?

答案就是 光照计算 

        假设我们在shader中定义 输出颜色 = 贴图颜色 * 光照系数 ,其中这里的贴图颜色是经过Gamma Encoding 过的,所以就需要我们再乘上 Gamma 系数。这样公式就变成了:

FinalColor = rgb^{gamma}*Light

        但实际上,我们并不希望在这里做伽马校正,而是应该在输出到屏幕的时候。在shader中仅直接操作贴图的颜色,于是公式又变成

FinalColor = (rgb*Light)^{Gamma}

显而易见,rgb^{gamma}*Light\neq (rgb*Light)^{Gamma}

因此,当需要模拟逼真的物理写实光照,就得转换到线性空间下进行计算。

        在Gamma 或 Linear空间的渲染结果是不同的,从表现上说,在Gamma Space中渲染会偏暗,在Linear Space中渲染会更接近物理世界,更真实。


、Gamma Correction流程

         Gamm校正的定义:Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:这个指数即为Gamma.

§ 模拟gamma2.2

gamma2.2的调试过程如下:

(1)将背光源稳定于某一亮度,先测试最大亮度值和最小亮度值;

(2)然后调整Vcom电压使画面闪烁(Flicker)至最佳值;

(3)根据标准gamma2.2 曲线,得到每一灰阶对应的亮度;

(4)使用色彩分析仪测量实际的亮度;

(5)通过调整控制灰阶电压的寄存器,使每一灰阶达到标准的亮度值,直至符合标准曲线。

§ 数字digital Gamma

        digital Gamma也称3Gamma:是通过对显示模组的R、G、B三种颜色分别进行调节,来调整屏幕的色温。较低的色温会使图像呈现出暖色调,而较高的色温会使图像呈现出冷色调 。

        摄像机将CCD获得的线性信息,经过调整,变成了类似人眼的非线性信息,于是输出的画面就像人眼看到的那样了。这个调整伽马曲线的过程,是摄像机必须要经过的一个步骤。

         这个图就是摄像机处理CCD信息的“伽马调整”的过程。CCD送出RGB信息,这时的信息是直线的伽马形态,然后每个通道会经过一个“伽马调整模块”,分别把R/G/B三个通道的伽马曲线调成非线性,然后输出。

         先看总伽马(Master Gamma)。总伽马也称RGB伽马,RGB不是有三个通道吗,一起联动着调,就是一调三个通道的曲线一起变化,就是总伽马调整了,很简单吧。如果我们分别调整每个通道的伽马呢?那当然就是通道伽马调整,你调G Gamma,那么绿色通道的伽马曲线就单独变化,调R就红变化,调B就蓝变化;如果三个调整的幅度一样呢?那就是相当于总伽马调整了。

        再来看黑伽马(BLK Gamma)。黑伽马不是指有条曲线叫黑马曲线,而是指伽马曲线中光线输入量比较少的那部分的伽马曲线,光输入量少就对应画面中比较暗的部分,所以给它起个名字叫黑马。看下图,曲线中的暗部就是黑伽马的区域,调整黑伽马,就是改变曲线的这一部分的形态。

         既然黑伽马是伽马曲线中的一部分,那么是否也有R/G/B通道的黑伽马和总黑伽马呢?那当然,一马四蹄,马腿岂能不是四条?红绿蓝各通道的黑伽马分别就是R/G/B黑伽马,一起联动调整就是总黑伽马了。 

总伽马调整 

黑伽马调整

        根据输入是线性空间还是gamma空间来进行不同路径的调整,如果进来的不是线性空间的输入,在经过shader之前,先要进行Gamma2Linear操作,转换到线性空间,再送到着色器进行光照的相应计算。

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Gamma校正是一种常见的图像处理方法,它可以调整图像的亮度和对比度。在视频处理,同样可以使用gamma校正来增强视频的视觉效果。下面,我将介绍如何使用MATLAB进行视频Gamma灰度校正前后对比及灰度显示。 首先,我们需要加载视频文件并将其转换为灰度图像序列。可以使用MATLAB的VideoReader和rgb2gray函数来实现。代码示例如下: ```matlab v = VideoReader('sample_video.mp4'); nFrames = v.NumFrames; video = cell(1,nFrames); for i = 1:nFrames video{i} = rgb2gray(read(v,i)); end ``` 接下来,我们可以选择一个视频帧进行Gamma校正Gamma校正可以使用imadjust函数实现,该函数可以调整图像的灰度范围。Gamma校正的原理是通过对图像的像素进行幂次变换,来调整图像的亮度和对比度。 ```matlab % 选择第10帧进行Gamma校正 frame = video{10}; % Gamma校正 gamma = 1.5; frame_gamma = imadjust(frame,[],[],gamma); ``` 接下来,我们可以将Gamma校正前后的图像进行对比,并显示图像的灰度。代码示例如下: ```matlab % 显示Gamma校正前后的图像 figure subplot(1,2,1) imshow(frame) title('Original Frame') subplot(1,2,2) imshow(frame_gamma) title(['Gamma-corrected Frame (gamma=' num2str(gamma) ')']) % 显示图像的灰度 figure subplot(1,2,1) imhist(frame) title('Original Frame Histogram') subplot(1,2,2) imhist(frame_gamma) title(['Gamma-corrected Frame Histogram (gamma=' num2str(gamma) ')']) ``` 执行以上代码后,可以看到Gamma校正前后的图像对比,并显示图像的灰度。 注意,在实际应用,可能需要对整个视频序列进行Gamma校正,可以使用循环对每一帧进行处理。另外,需要根据实际场景选择合适的Gamma,以达到最佳的视觉效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯语新知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值