浅析图像处理中的名词:Gamma 校正(Gamma变换、Gamma调整)

在数字图像处理领域,Gamma 校正(也称为伽马调整或伽马变换)是一个重要的概念。它涉及到对图像每个像素的亮度进行非线性调整,以达到令人满意、更加自然的视觉感受。本文将深入探讨 Gamma 校正的工作原理、实现方法以及它在实际应用中的重要性。

一、什么是 Gamma 校正

Gamma 校正本质上是一种对图像进行非线性亮度变换的过程,目的是为了更好地匹配人眼对光线强度的非线性响应特性。人的视觉系统对光照强度的反应并不是线性的,这意味着一个线性变化的光强,人眼感知起来却并非如此。

1.1 Gamma 值的概念

在图像处理中,Gamma 值(γ)是一个大于 0 的实数。一般情况下,大多数显示设备的默认 Gamma 值设定在 2.2 左右( Windows 下的 Gamma 为 2.2,而原 Mac OS 则为 2.5),意味着图像数据通过一个指数函数压缩以达到更适合人眼观察的效果。

1.2 为什么需要 Gamma 校正

(1)、人眼感光特性

人眼对亮度的感知是非线性的,Gamma 校正可以通过调整图像的亮度曲线使之更匹配人眼的视觉特性。人眼可感知的亮度范围为 10^−2 ~ 10^6 cd/m² (坎德拉每平米),可感受范围达10^8cd/m² 。 cd/m² 为国际计量标准的亮度单位,也叫尼特(nit),二者等价。(尼特通常用于度量诸如电视和计算机显示器等显示设备亮度,而 cd/m² 则更多用于照明领域。)下面列举一些光源的亮度:

光源太阳白炽灯我的显示器蜡烛夜空
亮度(cd/m²)1.6x10^95x10^43007.50.001

人眼的感光能力是随着外界环境光的强弱来自动调节的:比如在没有灯的屋子内,让光源每增加1nit我们的都可以捕捉到,而且很明显,而当光强到达一定会程度后,每增加1nit,我们的眼睛是感受不到变化的。这说明人眼对亮度变化的反应随着光的增加而减弱。实验表明,人眼的这种特性近似于 Log 函数,若用 I 表示亮度,S 表示人眼反应,那么两者之间的对应关系为:

                                              S = a * log (I)                             公式一

函数大致形状如下图所示:

与相机相比,我们对暗色调的变化比对亮色调的类似变化更敏感。这种特性有一个生物学原因:它使我们的视觉能够在更广泛的亮度范围内运行。否则,我们在户外遇到的典型亮度范围将过于压倒性。这是我们认为的50%亮度,如下:

而被相机检测到50%的亮度为:

(2) 、线性编码问题及非线性编码

实验结果表明,人眼对于亮度变化的感知能力是有限的。在均匀背景的情况下,只有当前景的亮度变化超过背景亮度的1%时,人眼才能够察觉到这种亮度的变化。因此,在对数字图像进行编码时,为了确保数字图像的亮度均匀和平滑,所有相邻编码值之间的亮度差异必须小于1%,以避免人眼识别出像素间的亮度突变。

然而,采用8位线性编码方式存在一个明显的问题。该编码方式仅能提供255个不同的编码值,这限制了其所能表示的亮度范围仅为2.55倍,这一范围显然无法满足观众对亮度变化的需求。对于亮度变化的表示来说,255个编码值远远不足以提供足够的区分度。

就算采用12位的编码深度能够将亮度范围扩展至40.96倍,但这也会显著增加设备的制造成本。因此,在设计数字图像编码系统时,需要在图像质量、编码效率和成本之间寻找一个平衡点。

基于上面的分析,找到一种既符合人眼视觉特性,又节省编码空间的方法来进行编码,于是非线性编码就成了首选,于是 Gamma 校正就出现了,Gamma 本质上为幂函数。

设编码值为 C,亮度为 I,则两者的关系为:

                                                                                                                                                     公式二

人眼对反射率为 18% 的灰色的感觉是 50% 亮度。如果要用幂函数拟合人眼的非线性特征的话,公式 2 中 取 2.5 时, ,这时最为接近人眼的识别曲线。

如下图所示:

非线性编码的亮度变化如下:

请注意线性编码如何使用不足的级别来描述暗色调 — 即使这会导致描述亮色调的级别过多。另一方面,伽玛编码的渐变在整个范围内大致均匀地分布色调(“感知均匀”)。这也确保了后续的图像编辑、颜色和直方图都基于自然、感知均匀的色调。

但是,真实世界的图像通常至少具有 256 个级别(8 位),这足以使色调在打印中显得平滑和连续。如果改用线性编码,则需要 8 倍的级别 (11 位) 才能避免图像分色。

可以看出Gamma 校正后的编码不仅能体现人眼的识别范围更能节省编码空间。理论上说, Gamma 方式的编码能够反映的亮度范围可达 10^6 ,远大于 12bit 线性编码。

(3)、CRT 的非线性失真

CRT(Cathode ray tube 阴极射线管)是把电能转换成光能的一种设备,CRT 的特性决定了从电压到亮度的转换是非线性的:转换规律满足:

                                                                               ​​​​​​​                                                       ​​​​​​​        ​​​​​​​        ​​​​​​​     公式三

其中 V 为输入电压,I 为 CRT 显示器在该电压下的显示亮度。

变化方式如下图:

不同显示器的值略有差别,不过一般都在 2.0~3.0 之间,一般认为的中值为 = 2.5。这里的 与(公式 2)中的 均为 2.5,这说明 CRT 的 Gamma 特性正好与人眼识别光线的特性相反。

通过 Gamma 编码的数据(encoding gamma)与 CRT 显示器的 Gamma 特征(display gamma),这两组编码恰好乘积(system gamma)为 1。

二、Gamma 校正工作原理及数学表达式

2.1、工作原理

Gamma校正是数字图像处理中的一种技术,用于调整图像的对比度和亮度。它基于这样一个观察:人眼对亮度的感知并不是线性的,而是遵循一种非线性关系。这种非线性关系可以用Gamma值来描述。

Gamma校正的基本思想是通过一个幂律转换来补偿显示设备的亮度特性。当图像从计算机发送到显示设备(如显示器或投影仪)时,通常会经过一个非线性的变换。

2.2、数学表达式

Gamma 校正基本公式可以描述为:

                        ​​​​​​​        ​​​​​​​                      ​​​​​​​​​​​​​​                                                      公式四

其中,c为正常数,一般取1,s 是输入图像的像素值(均一化的值),r 是输出图像的像素值(也是均一化的值),是 Gamma 值。有时考虑到偏移量,也将表达式写为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​                                                ​​​​​​​        ​​​​​​​             公式五

其中ϵ 为偏移量,其参数他同上。

三、实现 Gamma 校正

3.1 硬件和软件的实现

  • 硬件实现:许多显示设备(如显示器和电视)内部都已实现 Gamma 校正。
  • 软件实现:在图像处理软件(如 Photoshop,GIMP)和编程库(如 OpenCV, PIL)中,都提供了工具和函数来进行 Gamma 校正。

3.2、校正过程:

  1. 首先将图像数据从 0-255 的线性空间映射到 0-1 的非线性空间。
  2. 然后通过幂函数应用 Gamma 校正,再用公式 计算新的像素值。
  3. 最后将数据从非线性空间映射回 0-255 的范围。

3.3 编程示例

  • 以下是如何在 OpenCV 中实现 Gamma 校正的简单示例(python代码):
import cv2
import numpy as np

# 读取图像
image = cv2.imread("'path_to_your_image.jpg")

# 设置Gamma值
gamma1 = 0.5
gamma2 = 2.2

# 应用Gamma校正
gamma_05 = np.array(255 * (image / 255) ** gamma1, dtype='uint8')
gamma_22 = np.array(255 * (image / 255) ** gamma2, dtype='uint8')

# 显示原图和校正后的图像
cv2.imshow('Original', image)
cv2.imshow('Gamma 0.5', gamma_05)
cv2.imshow('Gamma 2.2', gamma_22)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 与python不同的是,C++需要借助lookUpTable实现,以下是具体代码:
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 定义一个Gamma校正函数
Mat applyGammaCorrection(const Mat &src, double gamma) {
    Mat dst = src.clone();
    Mat lookUpTable(1, 256, CV_8U);
    uchar *lut = lookUpTable.ptr();
    
    for (int i = 0; i < 256; i++) {
        double range = i / 255.0;
        double gamma_range = std::pow(range, gamma) * 255.0;
        lut[i] = saturate_cast<uchar>(gamma_range);
    }
    
    cv::LUT(src, lookUpTable, dst);
    return dst;
}

int main(int argc, char *argv[]) {
    // 读取图像
    string imagePath = "path_to_your_image.jpg"; // 改为实际路径
    Mat image = imread(imagePath, IMREAD_COLOR);
    if (image.empty()) {
        cout << "Image not found or unable to open" << endl;
        return -1;
    }

    // 设置Gamma值
    double gamma1 = 0.5;
    double gamma2 = 2.2;

    // 应用Gamma校正
    Mat gamma_05 = applyGammaCorrection(image, gamma1);
    Mat gamma_22 = applyGammaCorrection(image, gamma2);

    // 显示原图和校正后的图像
    namedWindow("Original", WINDOW_AUTOSIZE);
    namedWindow("Gamma 0.5", WINDOW_AUTOSIZE);
    namedWindow("Gamma 2.2", WINDOW_AUTOSIZE);

    imshow("Original", image);
    imshow("Gamma 0.5", gamma_05);
    imshow("Gamma 2.2", gamma_22);
    
    waitKey(0);
    destroyAllWindows();
    return 0;
}

运行结果如下:

​​​​​​​​​​​​​​

从图中可以看出,gamma值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的gamma值,就可以达到增强低灰度或高灰度部分细节的作用。

四、Gamma 校正在实际中的重要性

4.1 图像和视频编辑

在图像和视频编辑领域,Gamma 校正帮助编辑者调整图像的对比度和亮度,使输出的视觉作品更加符合人眼视觉习惯。

4.2 色彩管理

正确的 Gamma 校正对于维持从图像捕捉到显示这一过程中色彩的一致性至关重要。

4.3 用户体验

在用户界面设计中,合理使用 Gamma 校正可以优化视觉效果,提升用户体验。

4.4 在实际应用中,Gamma校正可以用于多种场景,包括但不限于:

  • 改善图像质量以便更好地显示或打印;
  • 在视频制作中调整色彩和对比度;
  • 在3D渲染中模拟真实世界的光照效果;
  • 在医学成像中改善图像的可读性

五、结论

Gamma 校正不仅是一种技术上的需求,也是提升图像质量的重要手段。理解 Gamma 校正的原理和应用,对于数字影像的采集、处理和展示都有着重要的意义。在不断深入探索图像处理的旅程中,Gamma 校正是一个不可或缺的知识点。

参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值