图像Gamma校正

article/2025/10/16 3:12:15

1. gamma校正的起因:人眼感知光线的特殊性

对于现实世界的光的强度来说,描述光的强弱,是根据光子在单位面积上的光子数量来描述的,这是物理规则,这是没错的,光的亮度(强度)是和光子数量成正比的。但是对于人眼来说,由于人眼的特殊构造,0.1倍光子数量的感知亮度,并不是等于0.2倍光子数量感知亮度的一半,也就是说眼睛感知亮度不是和光子数量成固定比例的,即眼睛感知亮度和光子数量之间的关系为非线性关系。为了把这两者的亮度关系说清楚,我们先定义几个名词:

物理亮度:表示光的强度,用光子数量乘以1个常量系数产生出来的值,也就是说光子数量与光的亮度(这里说的是物理亮度,不是眼睛感觉到的亮度)成正比。

感知亮度:眼睛感觉到光的亮度(光子进入眼睛视网膜,让大脑产生亮的程度)。

物理线性:以物理光子数量描述的线性数值空间,此空间值范围为[0.0,1.0],0.0表示全黑(最暗),1.0表示全白(最亮)。

感知线性:以光子进入人眼产生的感知亮度描述的线性数值空间,此空间值范围也是[0.0,1.0],0.0表示全黑,1.0表示全白。

我们把物理光子的亮度划为11个等级,0-10,分别对对应着由完全黑到完全白,每个等级递增0.1;然后我们也把人眼感知亮度也按同样的规则划分11个等级,如下图所示:

上图中上排是物理线性数值亮度,下排是感知线性数值亮度。这两者在各自的数值空间是线性的。对上排来说,0.2表示的光子数量是0.1表示的光子数量的2倍。对下排来说,0.2的感知亮度是0.1的感知亮度的2倍。注意:因为我们要对比两种亮度的关系,所以把上排中的光子数量转换成了感知亮度,即以颜色方块显示出来,如果不转换到同一个空间中就没法对比,不是吗?如何转换,下面会有讲述的。上排的1.0的颜色值是精确对应着下排1.0的颜色值,即全亮的物理光子表现出来的感知亮度就是感知线性空间的最高感知亮度。

我们先看下排,下排的数值是在感知线性空间上的,没错,0.2处的亮度是0.1处的两倍,0.5处就是中间亮度,也是1.0亮度的一半,可以看到0.5的数字都没有显示出来,是因为字体颜色就是用0.5的颜色画的。每一个亮度比上一级的亮度的增量都是0.1,这就是和我们眼睛感觉的一样的。

再来看上排,我们可以看到上排起步(0.1处)就有比下排起步(0.1处)明显亮很多,其亮度在下排的[0.3,0.4]之间的一个值,但是接下来,虽然光子数量都是以0.1倍的增加,表现出来的亮度也一直是在增加,但是亮度的增值却一直在递减!0.2处的亮度居然和感知线性空间的0.5的亮度差不多,因为0.2处也没有显示出来“0.2”这个数值;0.3处的亮度在感知线性空间的[0.5,0.6]之间的一个亮度值。通过上排的光子数量和光子表现出来的亮度分析,得出物理亮度和感知亮度是非线性的,具体来说是,是幂律关系。

2. gamma校正的方法

当我们拿照相片对着场景中拍摄时,光线从镜头进入照相机,我们人眼看到的场景亮度是感知亮度,场景的光子进入照相机(照相机镜头是物理光学器材,只能接收光子,无法接收什么感知亮度值),这些光子是构成了物理亮度,如果就按照这么个流程的话,那么照相机中保存场景图片的值是光子数量相关的一个值,即是物理亮度值,然后这个物理亮度值不做任何修改直接通过照相机的屏幕发射出来,我们人眼接触到这些由屏幕发射出来的光子,正好是可以产生和直接看场景一样的感知亮度,完美!看起来似乎很完美,真的可以这样吗?

下面把这个流程用流程图过一遍:

假设相机中图片直接存物理亮度信息的流程

上面这个流程看起来相当完美,实际上是通不行的,是因为我们保存图片的精度有问题,而精度问题又是由物理亮度造成的。

ISP在将图像编码为我们常用的8位图像之前,会进行一次所谓的色调重建的过程。而且,这个过程不仅仅是对图像的压缩保存需要,对图像的显示也是需要的:

当我们对图像进行编码时,需要符合人类的感知曲线,优化编码效率。简单说,我们分配较少的bit数给人类较难区分的图像亮区,分配更多的bit数来突出人类更加敏感的图像暗区

对于显示设备也是一样。无论显示设备的伽马特性如何,它们都需要伽马编码来最大限度地提高信号的视觉质量。它会执行所谓的Gamma校正过程,最终使得我们看到的依然是线性的显示图像。

以上,也就介绍了为什么我们看到的RAW图像很暗。因为经过我们前面处理后的RAW图像依然是线性的,显示设备的Gamma校正过程会进一步压低暗区,使得我们看到很暗的图像——这就是为什么我们现在需要进行Gamma编码。

参考文献

为什么要对图像做Gamma校正?如何做?

详解 gamma 校正 - 知乎 


http://chatgpt.dhexx.cn/article/ApCopEWj.shtml

相关文章

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分水岭算法详解

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

分水岭算法 matlab实现

背景 做图像分割的时候用到了,就学习了一下 大概思想 把图像中的像素大小理解成山地的海拔,向山地灌水,海拔低的地方会积水,这些地方称之为谷底。随着水位上升,不同谷底的水会相遇,相遇的地方就是分水岭。…

分水岭算法c语言,Opencv分水岭算法学习

分水岭算法可以将图像中的边缘转化成“山脉”,将均匀区域转化为“山谷”,这样有助于分割目标。 分水岭算法是一种基于拓扑理论的数学形态学的分割方法,其基本思想是把图像看作是测地学上的拓扑地貌,图像中的每一点像素的灰度值表示…

分水岭算法

引言:它是基于拓扑理论的形态学处理方法。将一张图像假想成为一张地貌特征图。 原理理解:灰度图被看作拓扑平面,灰度高看成山峰,灰度低看成山谷。从山谷开始注水,随着水位升高水流会相遇汇合。为了防止汇合&#xff0…

Opencv分水岭算法——watershed自动图像分割用法

分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。 其他图像分割方法,如阈值,边缘检测等都不会考虑像素在…

目标分割算法之分水岭算法

分水岭算法 1.经典算法原理及实现 传统的目标分割算法主要分为两种 1.基于像素相似性:阈值分割、k-means分割 2.基于像素邻域关系:区域生长、分水岭、基于标记分水岭 分水岭算法原理 如图中展现了凹凸不平的地貌,视觉上明显的位置有盆地及…

分水岭算法的理解和应用

分水岭算法 主要思想 图像的灰度空间很像地球表面的整个地理结构,每个像素的灰度值代表高度。分水岭就是灰度值较大的像素连成的线。二值化阈值可以理解为水平面,比灰度二值化阈值小的像素区域会被淹没。随着水位线的升高,被淹没的区域越来越…

分水岭算法及其实现

1 - 算法描述 1.1 分水岭算法的原理   分水岭的概念是以三维方式来形象化一幅图像为基础的:两个空间坐标再加上强度。在这种“地形学”解释中,考虑三种类型的点:(a)局部最小值点,该点对应一个…

传统图像分割——分水岭算法(watershed)

传统图像分割——分水岭算法(watershed) 文章目录 传统图像分割——分水岭算法(watershed)前言一、什么是分水岭算法?二、经典的分水岭求解算法1.定义2.算法流程 总结 前言 本篇文章主要梳理分水岭算法的原理&#xf…

图像分割 - 分水岭算法

目录 1. 介绍 2. 分水岭算法的实现 距离变换 连接连通分量 3. 代码 1. 介绍 图像是由x,y表示的,如果将灰度值也考虑进去的话,那么一幅图像需要一个三维的空间去表示。 这样就可以把x,y轴比作大地,将灰度值的z轴…