Gamma 校正

article/2025/10/16 0:26:37

问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思?
       Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输入和输出密度相同。高于1的Gamma值将会造成输出亮化,低于1的Gamma值将会造成输出暗化。总之,我们的要求是输入和输出比率尽可能地接近于1。在显示器、扫描仪、打印机等输入、输出设备中这是一个相当常见并且比较重要的概念。在计算机系统中,由于显卡或者显示器的原因会出现实际输出的图像在亮度上有偏差,而Gamma曲线矫正就是通过一定的方法来矫正图像的这种偏差的方法。一般情况下,当用于Gamma矫正的值大于1时,图像的高光部分被压缩而暗调部分被扩展,当Gamma矫正的值小于1时,图像的高光部分被扩展而暗调部分被压缩,Gamma矫正一般用于平滑的扩展暗调的细节。

图1 CRT显示器的亮度响应曲线图

       图1显示的是一般CRT显示器的亮度响应曲线,可以看到其输入电压提高一倍,亮度输出并不是提高一倍,而是接近于两倍,显然这样输出的图像同原来的图像相比就发生了输出亮化的现象,也就是说未经过Gamma矫正的CRT显示器其Gamma值是小于1的。

      没有经过Gamma矫正的设备会影响最终输出图像的颜色亮度,比如一种颜色由红色和绿色组成,红色的亮度为50%,绿色的亮度为25%,如果一个未经过Gamma矫正的CRT显示器的Gamma值是2.5,那么输出结果的亮度将分别为18%和3%,其亮度大大的降低了。

图2 按图进行曲线补偿

       为了补偿这方面的不足,我们需要使用反效果补偿曲线来让显示器尽可能地输出同输入图像相同的图像,所以这个时候显示器的输入信号应该按照图2所示的曲线进行补偿,这样才能在显示器上得到比较理想的输出结果。

图3 理想状态下的曲线

       一般的反效果可以直接被赋予存储在帧缓存中的图像,使之Gamma曲线呈非线性,也可以通过RAMDAC进行这种反效果补偿(或者说是Gamma曲线矫正)。这样我们就可以在显示器上看到同我们输入的图像接近的图像了(如图3)。当然图3所示的曲线只是理想状态下的情况,在实际应用中我们并不可能得到如此完美的曲线,所以不同的厂商之间所竞争的就是谁能做到最接近于这个效果。

 

 

       显示器的gamma值是用于定义一个显示器的显示特性的数学方法,是决定显示器从黑色到白色的值。简单的说,当显示一个颜色从黑到白时(也就是0到1),显示器的电压也要随之变化,但这个变化不是线性的。因为显示器的物理特性决定了如果电压的变化是线性的,显示出来的亮度就不是线性的,这时,显示的亮度就会很暗。所以,为了保整显示出来的亮度是正常(线性)的,就需要对显示器的电压变化加以校正,这个值就是我们通常所说的gamma值。通常情况只有在调整HDRI图片时和在做动画渲染时会用到。

       γ校正(Gamma Correction,伽玛校正):所 谓伽玛校正就是对图像的伽玛曲线进行编辑,以对图像进行非线性色调编辑的方法,检出图像信号中的深色部分和浅色部分,并使两者比例增大,从而提高图像对比 度效果。计算机绘图领域惯以此屏幕输出电压与对应亮度的转换关系曲线,称为伽玛曲线(Gamma Curve)。以传统CRT(Cathode Ray Tube)屏幕的特性而言,该曲线通常是一个乘幂函数,Y=(X+e)γ,其中,Y为亮度、X为输出电压、e为补偿系数、乘幂值(γ)为伽玛值,改变乘幂 值(γ)的大小,就能改变CRT的伽玛曲线。典型的Gamma值是0.45,它会使CRT的影像亮度呈现线性。使用CRT的电视机等显示器屏幕,由于对于 输入信号的发光灰度,不是线性函数,而是指数函数,因此必需校正。

       在电视和图形监视器中,显像管发生的电子束及其生成的图像亮度并不是随显像管的输入电压线性变化,电子流与输入电压相比是按照指数曲线变化的,输入 电压的指数要大于电子束的指数。这说明暗区的信号要比实际情况更暗,而亮区要比实际情况更高。所以,要重现摄像机拍摄的画面,电视和监视器必须进行伽玛补 偿。这种伽玛校正也可以由摄像机完成。我们对整个电视系统进行伽玛补偿的目的,是使摄像机根据入射光亮度与显像管的亮度对称而产生的输出信号,所以应对图 像信号引入一个相反的非线性失真,即与电视系统的伽玛曲线对应的摄像机伽玛曲线,它的值应为1/γ,我们称为摄像机的伽玛值。电视系统的伽玛值约为 2.2,所以电视系统的摄像机非线性补偿伽玛值为0.45。彩色显像管的伽玛值为2.8,它的图像信号校正指数应为1/2.8=0.35,但由于显像管内 外杂散光的影响,重现图像的对比度和饱和度均有所降低,所以现在的彩色摄像机的伽玛值仍多采用0.45。在实际应用中,我们可以根据实际情况在一定范围内 调整伽玛值,以获得最佳效果。

       今天有个朋友问γ校正的用处,这里简单说一下:

       伽马校正最初是由于显示器的阴极现象管(也就是物理上所说的示波管的阴极射线版)的成像扭曲引起的,为了不使画面失真所以就用先特殊算法进行校正,此之谓γ校正。

       γ校正的原理是修改显示系统的配色方案,本来显示系统输出的r g b电子枪线性的根据显存中的各个颜色值输出对应的控制电压,但是通过伽码校正可以把某个颜色值对应的输出电压调整高或调整低。达到校正显示系统色泽的目的。同时可以用软件的方法校正,就是对一副图片设定某个颜色的颜色值变换成新的颜色值的对照表,然后用新的颜色值取代原来图片中对应的颜色就行了呀。比如你先编写一个控制rgb各个分量对应关系的曲线调节器,在曲线调节器里面调整控制曲线设置原来颜色多少对应目标颜色多少,然后根据设定的关系,修改要调整色泽的图片每一个像素的颜色就可以了。

      数学公式可以深刻和精确的把握一个概念,却不能表达概念的物理意义和本质含义,本贴试图摆脱数学公式的陈述和推导,用言语来解释gamma的本质含义。

1什么是gamma?
对于CRT显示器,输入电压信号将在屏幕上产生亮度输出,但是显示器的亮度与输入的电压信号不成正比,存在一种失真,如果输入的是黑白图像信号,这种失真将使被显示的图像的中间调偏暗,从而使图像的整体比原始场景偏暗,如果输入的是彩色图像信号,这种失真除了使显示的图像偏暗以外,还会使显示的图像的色调发生偏移。gamma就是这种失真的度量参数。对于CRT显示器,无论什么品牌的,由于其物理原理的一致性,其gamma值几乎是一个常量,为2.5。(注意,gamma=1.0时不存在失真),由于存在gamma失真,输入电压信号所代表的图像,在屏幕上显示时比原始图像暗。

 

2    gamma概念的演化
      gamma本来是显示器的输出图像对输入信号失真的度量参数。
2.1 gamma概念的第一演化(系统gamma和显示器gamma)
       由于存在显示失真,这样的图像不能应用,所以需要校正这种失真。上文讲到,对于显示器来说,gamma值是常量,不可改变,所以校正过程就只能针对输入的图像电压信号了。这种校正就是将正常的图像电压信号向显示器失真的相反方向去调整,既然失真使图像的中间调变暗,那么在图像电压信号输入到显示器之前,先将该电压信号的中间调调亮,然后再输入到显示器,这样就可以抵消显示器的失真了。

       由于显示器的gamma值是常量,所以这种校正的幅度也是相对固定的,这种校正幅度的度量参数也叫gamma,这是gamma概念的第一次演化,为了区别这两种不同的概念,此处的gamma又叫做系统gamma(因为对图像电压信号的校正过程发生在电脑系统中),显示器的固有的gamma又叫做显示器gamma。


2.2 gamma概念的第二次演化
      显示器gamma表示一种失真,系统gamma表示一种校正,这两者共同之处是都表示对原始信号的一种变换,所以gamma概念发展到这里,其一般性含义已经又两层含义,a表示对原始信号的一种变换, b表示这种变换的度量参数。

2.3 gamma概念的第三次演化(文件gamma)
      既然gamma的一般性含义是对原始信号的一种变换,可想而知,文件gamma也一定表示一种变换,这是一种什么样的变换呢?
      从宏观上讲,被照相机拍摄的物体的亮度是连续变化的,如果将亮度连续变化的被摄物体的图像转换成数字文件(计算机文件)时,无论用数码相机还是扫描仪,都要面临用离散的数值去近似表示连续的物理量的问题。具体来说,一个8位的二进制数字文件,如何编码才能比较精确的表示反差很大的一幅图像?
       这要从人的视觉原理说起。人的眼睛感觉到亮度增加一级的时候,光强(光的能量)将增加一倍,同样,当人的眼睛感觉到亮度减小一级的时候,光强将减少一半。就是说,人的眼睛感觉到的亮度的成比例的线性变化,是由光强的倍数变化引起的。如果将一段连续变化的亮度从暗到亮等差分成a b c d e f g 七段,那么这七段亮度对应的光强不是1 2 3 4 5 6 7,而是1 2 4 8 16 32 64。打个数学比方,人眼感觉到的亮度是等差数列,而光强的物理实在是等比数列!为何如此,因为这样可以确保人眼即适应高亮度的阳光下的景物,又能在夜晚看清星光下的猎物,这是大自然的造化。
       数码相机或扫描仪的感光元件,将会把光强变成电信号,然后由模-数转换器件转换成数字信号,继而再存储为数字文件。为了便于讨论,以黑白图像为例,一个黑白图片数字文件中每个象素用一个8位二进制编码表示,8位二进制编码只有256个量级,从0到255。就是说,一幅图片,最亮的地方用255表示,最暗的地方用0表示。这里有一个问题需要我们思考一下:比最亮处(编码255)暗一级的象素的编码值是多少?
       答案是128,因为人眼感觉暗一级,光强将减小一半,这样感光元件的输出电压值将减小一半,从而模-数转换器件得到的数字值也是255的一半,即128。
       依此类推,比最亮的象素(编码255)暗两级的象素的编码值是64,暗三级是32,暗四级是16,暗五级是8,暗六级是4,暗七级是2,暗八级是1。于是矛盾就出现了:
       第一问题是,亚当斯将曝光区分为11个等级,这种8位二进制编码方法无法表示11个分区,只表示了9个分区,分别对应的二进制编码值是0-1,1-2,2-4,4-8,8-16,16-32,32-64,64-128,128-255。
       更严重的是第二个问题,最亮的分区(128-255)占有8位二进制编码256个量级的一半量级资源,即占有128个量级,分别是128,129,130,……,253,254,255。而最暗的分区只占有8位二进制编码256个量级中的两个量级,分别是0和1,比最亮分区暗四级的分区只占有8位二进制编码256个量级中的8个量级,分别是8,9,……,15,16。这表明这种编码方法在最亮的分区中,表达的亮度细节非常的丰富,超过人眼的识别能力(人眼在亮处可以识别1%的亮度变化),可是在较暗的分区中,表达的亮度细节就少的可怜了,会出现马赛克!
        所以需要对感光元件的输出的电压值在模-数转换时做一种变换,使得较暗的分区占有的二进制编码量级多一些,较亮的分区占有的二进制编码量级少一些,从而不至于使图像暗处出现马赛克,也使亮部占有的量级刚好满足人眼的最大识别能力。这样编码的数字文件可以较好的表示反差很大的一幅图像。文件gamma是表示这种变换的度量参数。Windows系统,WWW和sRGB规定文件gamma值为2.2。

2.4 gamma概念的第四次演化
     a表示对原始信号的一种变换,泛指显示器gamma,系统gamma,文件gamma。
     b表示这种变换的度量参数。
     c 在不同的上下文环境中,会特指显示器gamma,系统gamma,文件gamma三个概念中的某个具体概念,注意领会。

2.5 概念总结(四种gamma)
2.5.1 gamma
        gamma在不同的上下文环境中,有不同的含义,一个意思是表示对原始信号的一种变换,另一个意思是表示这种变换的度量参数,还可能表示显示器gamma,系统gamma,文件gamma三个概念中的某个具体概念。
2.5.2 显示器gamma
        是显示器的物理属性,固定的,不变的,不可校正的。显示器gamma在不同的上下文环境中,有不同的含义,一个意思是指显示器的输出图像对输入信号的失真,另一个意思是指这种失真的具体数值。
2.5.3 文件gamma
         对一个给定的数码相片文件,按照相关标准规范, 这个gamma是一个定值,所以无需对其校正。如果出于某种特殊需要,一定要改变某数码相片文件的gamma值,这种改变也不能称作“校正”,而是称作“变换”。
2.5.4 系统gamma
        系统gamma所表示的变换,是计算机系统在读取了照片数字文件之后,在输出到显示器之前的一种变换,对于windows系统它存在于显卡中,是可调节的,可校正的。

3 在使用计算机处理数码相片时总要提到gamma校正,这里的gamma校正过程校正什么?
      由于显示器gamma和文件gamma是固定不变的,gamma校正过程是校正计算机的系统gamma!,使得显示器gamma、系统gamma、文件gamma三个变换的叠加为1.0,从而使最终显示器的图像和原始场景一样,不存在失真。
这就好比密码通信,文件gamma是加密过程,系统gamma和显示器gamma是文件gamma的一种反作用,是解密过程,最后看到的结果和原始信息一样。


源码分享:http://pan.baidu.com/s/1o61ngWa


http://chatgpt.dhexx.cn/article/4Ep1CNtd.shtml

相关文章

opengl高级光照之gamma校正

官方文章 gamma校正 gamma校正概念 一个渐变的效果 通过以下网站调整Gamma值可以观察到效果 色彩管理网 gamma校正 Gamma校正(Gamma Correction)的思路是在最终的颜色输出上应用监视器Gamma的倒数。回头看前面的Gamma曲线图,你会有一个短划线,它是监…

gama校正算法matlab,Gamma校正及其FPGA实现(一)

最近在做一个千兆以太网传输的项目,里面用到了Gama校正算法,本来想使用Altera 的IP核Gamma Corrector,但Quartus16.0把Gamma Corrector的IP核集成到了QSYS里面了,还得研究qsys怎么用,与自己本来的方案不符合&#xff0…

Gamma Correction/Gamma校正/灰度校正/亮度校正 - 部分 DCC 中的线性工作流配置

文章目录 也可以简单参考 SIGGRAPH 2010 的 PBS 的 Gamma-CorrectUnity 中的 gamma、linear 工作流Unity BRP 管线中的 shaderlab 提供的 gamma2linear, linear2gammaUnity中线性空间配置DCC 中的 gamma 值是怎么计算的?Photoshop 的线性工作流方式1方式2验证 Photo…

光栅投影中Gamma校正

学习 郑东亮 达飞鹏 《提高数字光栅投影测量系统精度的gamma校正技术》一文后,对其中的关键技术进行了解析。 摄像机获得的实际灰度图像: 其中是整个系统的gamma值,是预编码值(需要根据实验进行选择),是幅…

java opencv gamma_Gamma校正及其OpenCV实现

一、什么是Gamma校正? Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: [2] 这个指数即为Gamma. 经过Gamma校正后的输入和输出图像灰度值关系如图1所看到的:横坐标是输入灰度值&#x…

gamma校正 matlab,Gamma校正 ——图像灰度变化 OpenCV (十)

Gamma校正(C++、OpenCV实现) 1.作用: Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 伽玛校正由以下幂律表达式定义: 2.函数原型 void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, Out…

图像Gamma(伽玛)校正的原理及OpenCV代码实现

什么是Gamma校正? Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。 Gamma校正的原理表达式如下: 上面中的指数γ即为Gamma。这就是Gamma校正的名称来历。 其中的取值范围是0~1,最重…

Gamma校正

下面是自己所整理的一些gamma校正的东西如有侵权请联系删除。 Gamma矫正: 伽马矫正也称幂律变换,一般用于平滑的扩展暗调的细节。 进行伽马矫正的原因是人类的眼睛在感知光线时,眼睛对亮度的感知遵循近似的幂函数(如图&#xf…

图像Gamma校正

1. gamma校正的起因:人眼感知光线的特殊性 对于现实世界的光的强度来说,描述光的强弱,是根据光子在单位面积上的光子数量来描述的,这是物理规则,这是没错的,光的亮度(强度)是和光子数…

Gamma校正原理及实现

gamma校正原理:   假设图像中有一个像素,值是 200 ,那么对这个像素进行校正必须执行如下步骤:   1. 归一化 :将像素值转换为 0 ~ 1 之间的实数。 算法如下 : ( i 0. 5)/256 这里包含 1 个除法和 1…

python手撕分水岭算法

python手撕分水岭算法 1 分水岭算法实现 主要思路就是: 利用一个优先队列与有序队列(有序队列其实可以不用)。优先队列是按像素的灰度值排列的,灰度值低的先被淹。通过统计像素的附近的点的标记种类个数来确认当前像素点的标记…

分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分支,它从同一物体的两张不同图像提取三维信息。 极几何的工作原理&#x…

分水岭算法-python-opencv

分水岭算法简单原理: 对于一个图像的灰度值,将图像放平,可以看成是类似与山谷与山顶的图像,灰度值小的就是山底。先找到若干个山底,同时加水,当加到一定程度时候,某些山顶会被淹没,…

分水岭算法解析[halcon]

分水岭算法 分水岭算法是根据分水岭的构成来考虑图像的分割, 它是—种基于拓扑理论的数学形态学的分割方法。 首先, 把一幅图像看作起伏的地形, 图像的每像素灰度值作为这个地形的高度, 极小值是盆地, 极大值为山脊。…

opencv-分水岭算法图像分割

分水岭算法图像分割 目标   本节我们将要学习   • 使用分水岭算法基于掩模的图像分割   • 函数:cv2.watershed()    原理   任何一副灰度图像都可以被看成拓扑平面,灰度值高的区域可以被看成是山峰,灰度值低的区域可以被看成是山…

分水岭算法的python实现及解析

1 算法简介 分水岭算法的原理很容易查到,但是很多文章都是直接用的opencv或matlab函数,看不到具体实现方法,这篇文章希望能对大家有点帮助。 分水岭算法就是往山谷中注水,把不同湖水接触的位置称作分水岭,这么做的结…

opencv28:分水岭算法的图像分割

目标 在本章中,将学习 使用分水岭算法实现基于标记的图像分割函数:cv2.watershed() 理论 任何灰度图像都可以看作是一个地形表面,其中高强度的像素表示山峰,低强度表示山谷。可以用不同颜色的水(标签)填充每个孤立的山谷(局部…

OpenCV-分水岭算法

文章目录 分水岭算法cv2.watershed示例 分水岭算法 任何灰度图像都可以看作是一个地形表面,其中高强度表示山峰,低强度表示山谷。你开始用不同颜色的水(标签)填充每个孤立的山谷(局部最小值)。随着水位的上升,根据附近的山峰(坡度)&#xff…

【OpenCV】- 分水岭算法

文章目录 什么是图像分割分水岭算法1、实现分水岭算法:watershed()函数2、处理流程(视频)3、示例程序(书中) 什么是图像分割 将图像中像素根据一定的规则分为若干个cluster集合,每个集合包含一类对象 如下…

OpenCV分水岭算法详解

原理分析 分水岭算法主要用于图像分段,通常是把一副彩色图像灰度化,然后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线。 下面左边的灰度图,可以描述为右边的地形图,地形的高度是由…