💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《图像增强》
📝《模型优化》
📝《模型实战部署》
📝《图像配准融合》
📝《数据集》
📝《高效助手》
伽马校正作为一种传统的图像增强技术,适用于简单的亮度和对比度调整,尤其是在图像整体较暗或者需要快速增强的场景中。但它不适合处理复杂光照场景以及要求精确局部控制的场合。在更复杂的任务中,现代的图像处理方法(如基于深度学习的增强算法)可能更具优势。
目录
- 一、伽马校正原理
- 二、伽马校正优缺点
- 2.1 优点
- 2.2 缺点
- 三、伽马校正适用场景
- 四、伽马校正实例
- 4.1 代码
- 4.2 代码解析
- 4.2.1 查找表生成
- 4.2.2 像素值替换
- 4.3 伽马校正结果
- 五、总结
一、伽马校正原理
伽马校正公式:
输出像素值
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 中的每个值对应的是经过伽马校正计算后的结果,所以最终得到的图像是伽马校正后的图像。
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!