一、Gamma校正入门

什么是Gamma校正

Gamma校正,说白了就是给图像的亮度做个「非线性映射」。你可能会问:为什么要做这种映射?嗯,这得从人眼的感知特性说起。

我刚开始接触图像处理时,总觉得Gamma校正是个很玄乎的东西。后来在做一个显示器校准项目时,才真正理解了它的价值。简单来说,Gamma校正就是调整图像的中间调——让暗部更暗、亮部更亮,或者反过来。

举个例子:你拍了一张照片,在电脑上看觉得还行,但打印出来发现暗部一片漆黑。这就是典型的Gamma问题。显示器是发光设备,打印是反射设备,两者的Gamma特性完全不同。

核心概念:Gamma校正 = 对图像像素值进行幂次变换,公式为 Vout = Vinγ

Gamma校正的数学原理

数学上其实很简单。就是一个幂函数:

# Gamma校正的数学表达
V_out = V_in ^ gamma

# 实际应用中,通常归一化到[0,1]区间
# gamma < 1:提亮暗部(压缩暗部,拉伸亮部)
# gamma > 1:压暗暗部(拉伸暗部,压缩亮部)
# gamma = 1:线性,不做任何改变

我习惯把Gamma曲线想象成一根橡皮筋。当γ<1时,相当于把暗部区域「拉宽」,让更多细节显现出来。当γ>1时,则是把亮部区域「拉宽」。

举个例子:

输入值γ=0.5γ=1.0γ=2.2
0.10.3160.10.006
0.30.5480.30.083
0.50.7070.50.218
0.70.8370.70.471
0.90.9490.90.802

你看,γ=0.5时,0.1的输入变成了0.316,暗部被大幅提亮。而γ=2.2时,0.1几乎变成了0,暗部更暗了。

我的经验:在实际项目中,我通常用γ=0.45来「解码」图像,用γ=2.2来「编码」图像。这两个值互为倒数,正好构成一个完整的Gamma校正链路。

Gamma曲线与人类视觉感知的关系

为什么人眼需要Gamma校正?这得从人眼的生理结构说起。

人眼对亮度的感知不是线性的。你想想看,在暗处时,我们对微弱的光线变化特别敏感。但在亮处时,同样的亮度变化我们却感觉不明显。这就是韦伯-费希纳定律——人眼对亮度的感知近似于对数关系。

说白了,人眼更像一个「压缩感知器」:它把宽动态范围的物理亮度,压缩成了窄动态范围的感知亮度。

我曾经做过一个实验:让10个人在暗室中调整两个色块的亮度,直到感觉它们「亮度差一倍」。结果发现,物理亮度差4倍时,人才感觉差了一倍。这就是Gamma的生理基础。

关键点:Gamma ≈ 2.2 时,人眼感知到的亮度变化最均匀。这也是为什么sRGB标准采用γ=2.2的原因。

Gamma校正的典型应用场景

1. 显示器校准

这是最常见的应用。每个显示器出厂时的Gamma值都不一样,有的偏亮,有的偏暗。校准的目的就是让显示器符合标准Gamma曲线。

我记得有一次帮朋友校准显示器,他做设计但总觉得颜色不对。一测发现Gamma值高达2.8,整个画面偏暗。校准到2.2后,他惊呼「原来我的图这么亮!」

校准步骤大致如下:

  1. 测量当前显示器的Gamma曲线
  2. 计算校正LUT(查找表)
  3. 将LUT写入显卡或显示器
  4. 验证校准结果

2. 图像增强

Gamma校正也是图像增强的利器。特别是处理欠曝或过曝的照片时。

# 用Gamma校正增强图像
import numpy as np
import cv2

def gamma_correction(img, gamma=1.0):
    # 归一化到[0,1]
    normalized = img / 255.0
    # 应用Gamma变换
    corrected = np.power(normalized, gamma)
    # 还原到[0,255]
    return (corrected * 255).astype(np.uint8)

# 欠曝照片:用γ<1提亮暗部
dark_img = cv2.imread('underexposed.jpg')
brightened = gamma_correction(dark_img, gamma=0.5)

# 过曝照片:用γ>1压暗亮部
bright_img = cv2.imread('overexposed.jpg')
darkened = gamma_correction(bright_img, gamma=2.2)

注意:Gamma校正不是万能的。如果图像暗部噪点太多,强行提亮会让噪点更明显。我曾经在一个监控项目中吃过这个亏——为了看清暗部细节,把γ设到0.3,结果画面全是噪点。

3. 摄影后期

在摄影后期中,Gamma校正是最基础也是最常用的调色工具。Lightroom、Photoshop里的「曝光度」滑块,本质上就是在调整Gamma值。

我个人的习惯是:

  • 人像照片:γ ≈ 0.8-1.0,让肤色更柔和
  • 风景照片:γ ≈ 1.0-1.2,保持自然对比度
  • 夜景照片:γ ≈ 0.5-0.7,提亮暗部细节

但记住,这些只是起点。每张照片都有自己的「脾气」,需要微调。

知识体系总览

下面这张图展示了Gamma校正的核心知识结构:

Gamma校正 数学原理 V_out = V_in^γ 幂次变换 人类视觉感知 韦伯-费希纳定律 非线性感知 应用场景 显示器校准 图像增强 摄影后期 核心:非线性映射,匹配人眼感知

这张图把Gamma校正拆成了三个维度:数学原理是基础,视觉感知是原因,应用场景是实践。三者缺一不可。

避坑指南:我曾经在做一个医疗影像项目时,直接用了sRGB的Gamma值来处理DICOM图像。结果发现病灶区域完全看不清。后来才意识到,医疗影像用的是线性Gamma,不能套用标准Gamma曲线。所以,一定要先搞清楚你的数据是什么Gamma空间。

好了,Gamma校正的入门就讲到这里。记住三个数字:0.45(解码)、1.0(线性)、2.2(编码)。这三个值能帮你应对90%的场景。

专注资料整理