图像增强——传统算法伽马校正实现暗光增强(附Python代码)

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》


在这里插入图片描述

伽马校正作为一种传统的图像增强技术,适用于简单的亮度和对比度调整,尤其是在图像整体较暗或者需要快速增强的场景中。但它不适合处理复杂光照场景以及要求精确局部控制的场合。在更复杂的任务中,现代的图像处理方法(如基于深度学习的增强算法)可能更具优势。

一、伽马校正原理

伽马校正公式:

输出像素值 I o u t I_{out} Iout通过以下公式计算:
I o u t = ( I i n 255 ) γ × 255 I_{out}=(\frac{I_{in}}{255})^γ × 255 Iout=(255Iin)γ×255

其中 I i n I_{in} Iin是输入的原始像素值, γ γ γ是控制亮度的伽马值。

γ < 1 γ<1 γ<1时,图像整体会变亮,适合用于暗光增强。

γ > 1 γ>1 γ>1时,图像整体会变暗,适合用于高光抑制。

通过调节伽马值,可以让图像的亮部和暗部的对比更明显,增加细节。然而,伽马校正是一种全局调整,可能无法有效应对具有复杂光照条件的场景。

二、伽马校正优缺点

2.1 优点

简单易用:伽马校正是一种计算复杂度低的全局亮度调整方法,适合快速图像处理。

提高图像对比度:尤其在暗光或高对比度场景下,伽马校正可以增强细节,改善图像的视觉效果。

可控性强:通过调整伽马值,可以灵活地控制图像亮度,满足不同的处理需求。

广泛应用:适用于图像和视频中的亮度调整,很多图像处理软件和硬件都内置了伽马校正功能。

2.2 缺点

全局操作:伽马校正对整个图像进行统一的调整,无法对局部光照条件进行细化处理。它无法应对复杂的场景光照变化,特别是同时存在明亮和暗淡区域的图像。

高光损失:对于亮部和高光区域的处理效果不好,可能导致这些部分的细节丢失或者过曝。

无法自动自适应:伽马校正参数需要手动调整,无法根据图像的光照条件自动调整最佳亮度。

颜色偏移:在 RGB 图像中,伽马校正可能会导致颜色偏移,尤其是在过度增强时,这可能会影响图像的颜色平衡。

三、伽马校正适用场景

暗光图像增强:伽马校正广泛用于低光照条件下拍摄的图像。通过调整伽马值,可以提升暗部细节,使图像整体更亮、更清晰。
应用领域:安防监控图像增强、夜间拍摄照片处理、交通摄像头图像处理等。

视频亮度调整:在视频处理中,伽马校正常被用于调整整体视频的亮度,使得视频内容在不同设备或显示器上呈现出适当的亮度效果。
应用领域:电影后期处理、视频剪辑、显示设备校准等。

图像对比度增强:伽马校正可以提高图像的整体对比度,使得图像在视觉上更加生动。在一些高对比度的场景中,可以通过调整伽马值改善图像的观感。
应用领域:摄影后期处理、科学图像分析、卫星遥感图像等。

图像预处理:在某些机器视觉或计算机视觉任务中,伽马校正可以作为图像预处理步骤之一,改善输入图像的质量,使得后续算法(如边缘检测、特征提取)能够更准确地运行。
应用领域:图像分类、目标检测、人脸识别等。

医疗图像处理:在 X 射线、CT 扫描等医疗成像中,伽马校正可以用来调整图像亮度,突出特定组织或器官的细节。
应用领域:医学影像增强、手术图像处理。

四、伽马校正实例

4.1 代码

下面使用 Python 和 OpenCV 来批量处理多张图像,通过调整伽马值进行暗光增强。

其中adjust_gamma 函数:这是实现伽马校正的函数。它通过创建一个查找表(LUT)来对每个像素值进行伽马校正。

enhance_images_in_folder 函数:批量处理文件夹中所有图像,对每张图像应用伽马校正,并将增强后的图像保存在指定的输出文件夹中。

伽马值 gamma_value:伽马值控制亮度增强效果,值越小,图像越亮。你可以根据图像的亮度调整这个值。

伽马校正参数调整:
如果图像过于暗,可以降低伽马值(如 1.5 或更小),以提高亮度。

具体代码见下:

import cv2
import numpy as np
import os

# 伽马校正函数
def adjust_gamma(image, gamma=1.0):
    # 建立查找表:将像素值(0-255)映射到经过伽马调整后的新值
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(256)]).astype("uint8")
    
    # 应用查找表来调整图像
    return cv2.LUT(image, table)   # cv2.LUT 是 OpenCV 提供的函数,作用是根据查找表 table 将图像 image 的每个像素值转换为伽马校正后的新像素值。

# 批量处理图像的函数
def enhance_images_in_folder(input_folder, output_folder, gamma=1.5):
    # 如果输出文件夹不存在,创建它
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历输入文件夹中的所有图像
    for filename in os.listdir(input_folder):
        if filename.endswith(".jpg") or filename.endswith(".png") or filename.endswith(".bmp"):
            # 构建图像的完整路径
            img_path = os.path.join(input_folder, filename)
            
            # 读取图像
            image = cv2.imread(img_path)
            
            # 检查图像是否正确读取
            
            if image is None:
                print(f"无法读取图像 {filename}")
                continue
            
            # 进行伽马校正
            enhanced_image = adjust_gamma(image, gamma=gamma)
            
            # 保存处理后的图像
            output_path = os.path.join(output_folder, filename)
            cv2.imwrite(output_path, enhanced_image)
            print(f"已保存增强后的图像:{output_path}")

# 主程序
input_folder = 'path/to/your/input_folder'  # 输入图像文件夹路径
output_folder = 'path/to/your/output_folder'  # 输出增强后的图像文件夹路径
gamma_value = 1.5  # 调整伽马值,越小越亮,适用于暗光增强

# 批量增强图像
enhance_images_in_folder(input_folder, output_folder, gamma=gamma_value)

4.2 代码解析

本小结的代码解析主要讲解一下adjust_gamma()函数,其它部分代码都容易理解。

4.2.1 查找表生成

def adjust_gamma(image, gamma=1.0):
    # 建立查找表:将像素值(0-255)映射到经过伽马调整后的新值
    invGamma = 1.0 / gamma
    table = np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(256)]).astype("uint8")
    
    # 应用查找表来调整图像
    return cv2.LUT(image, table)

在上面代码中,table值为一个一维数组,里面存放了从0到255之间每个数值经过伽马校正公式计算后的数值,即为原像素值通过伽马校正后映射的值,为了更容易理解,见下:

在这里插入图片描述
从上面图中可以看出,经过伽马校正公式处理后,
原像素值为 0 的像素,转换后的值为 0。
原像素值为 1 的像素,转换后的值为 27。
原像素值为 2 的像素,转换后的值为 36。

原像素值为 255 的像素,转换后的值为 255。

table是一个查找表,用于下一步将原图像中对应的像素值替换为伽马校正后的数值。

每个像素值都会根据查找表 table 中的对应索引值进行替换。

4.2.2 像素值替换

代码cv2.LUT(image, table)中cv2.LUT 是 OpenCV 提供的函数,作用是根据查找表 table 将图像 image 的每个像素值转换为伽马校正后。这个过程具体是怎么转换的???

cv2.LUT 函数的具体操作是针对图像中的每一个像素,根据该像素值查找 table 中的对应值,并用这个值替换原始像素值。过程如下:
步骤:

(1)遍历图像中每个像素: cv2.LUT 会遍历 image 图像中每个像素,读取其原始像素值。假设图像中某个像素的值是 x。

(2)查找表查询: 根据像素值 x,在 table 中查找对应的伽马校正后的值,即 table[x]。例如,如果某个像素值为 5,则它会查找 table[5],假设 table[5] = 56,那么这个像素的值会被替换成 56。

(3)像素替换: 将原始像素值 x 替换为 table[x]。这个过程会对图像中的所有像素重复进行。

4.3 伽马校正结果

下面随机挑选了一张用手机拍的现实暗光环境测试伽马校正,见下:

在这里插入图片描述

五、总结

以上就是传统算法伽马校正实现暗光增强解析及方法,其代码中cv2.LUT(image, table) 的操作是基于 查找表索引,将图像 image 中每个像素的值根据 table 中的对应值替换为伽马校正后的值。table 中的每个值对应的是经过伽马校正计算后的结果,所以最终得到的图像是伽马校正后的图像。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值