Python-OpenCV中的Gamma变换(校正)

【参考资料】https://blog.csdn.net/lichengyu/article/details/8457425

                     http://www.jb51.net/article/137566.htm

 

一、什么是Gamma变换

Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:

这个指数即为Gamma。

Gamma变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

经过Gamma变换后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到,当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。

图1  Gamma校正

 

二、为什么进行Gamma变换

1. 人眼对外界光源的感光值与输入光强不是呈线性关系的,而是呈指数型关系的。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而摄像机感光与输入光强呈线性关系。如图2所示:

图2  人眼和摄像机的感光与实际输入光强的关系

为方便人眼辨识图像,需要将摄像机采集的图像进行Gamma变换。

2. 为能更有效的保存图像亮度信息,需进行Gamma变换。

未经Gamma变换和经过Gamma变换保存图像信息如图3所示:

图3  未经Gamma变换和经过Gamma变换保存图像信息

可以观察到,未经Gamma变换的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同时高灰度值时,很多比较接近的灰度值却被保存成不同的值,造成空间浪费。经过Gamma变换后,改善了存储的有效性和效率。

 

三、Gamma变换的基本形式

大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢)。

 

四、Python下有关Gamma变换的示例代码

def adjust_gamma(imgs, gamma=1.0):
    assert (len(imgs.shape)==4)  #4D arrays
    assert (imgs.shape[1]==1)  #check the channel is 1
    # build a lookup table mapping the pixel values [0, 255] to
    # their adjusted gamma values
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
    # apply gamma correction using the lookup table
    new_imgs = np.empty(imgs.shape)
    for i in range(imgs.shape[0]):
        new_imgs[i,0] = cv2.LUT(np.array(imgs[i,0], dtype = np.uint8), table)
    return new_imgs

 

### 使用 PythonOpenCV 实现伽马变换 伽马变换是一种常见的非线性图像增强技术,能够有效调整图像的亮度和对比度。通过改变参数 \(\gamma\) 的值,可以在不同光照条件下优化图像质量。 对于给定的输入图像 \(r\),伽马变换公式为: \[ s = c(r + \varepsilon)^\gamma \] 其中: - \(s\) 表示输出图像中的像素值, - \(c\) 是比例系数, - \(\varepsilon\) 是一个小常数用于防止零幂运算错误, - \(\gamma\) 控制着曲线形状,决定了图像整体明暗变化的程度[^3]。 为了在 Python 中利用 OpenCV 库执行伽马校正,下面提供了一段完整的代码实例来展示这一过程: ```python import cv2 import numpy as np def adjust_gamma(image, gamma=1.0): invGamma = 1.0 / gamma table = np.array([((i / 255.0) ** invGamma) * 255 for i in range(256)]).astype("uint8") # Apply the lookup table to perform gamma correction on each pixel value of input image. return cv2.LUT(image, table) # Load an example image (replace 'your_image.jpg' with your file path). image_path = "your_image.jpg" original_image = cv2.imread(image_path) # Perform Gamma Correction using a specific gamma value. gamma_value = 2.2 # You can change this parameter based on requirement. corrected_image = adjust_gamma(original_image, gamma=gamma_value) # Save or display corrected images here... cv2.imwrite('output_corrected.png', corrected_image) ``` 上述脚本定义了一个 `adjust_gamma` 函数接收一张图片以及期望应用的伽马因子作为参数,并返回经过伽马矫正后的结果。这里创建了一个查找表(LUT),它包含了所有可能的颜色强度级别对应的伽马修正后的新颜色强度级别。之后调用 `cv2.LUT()` 方法将此表格应用于原始图像以完成整个转换流程[^2]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值