伽马矫正(Gamma correction)

在学习HOG描述子时,对图像进行预处理中使用了伽马矫正这个方法,这里对伽马矫正进行简要的介绍。

伽马矫正也称幂律变换,一般用于平滑的扩展暗调的细节。进行伽马矫正的原因是因为人类的眼睛在感知光线时,眼睛对亮度的感知遵循近似的幂函数(如下图所示)而不是线性函数。

计算机系统中,由于显示器或显卡的原因会出现实际输出图像有亮度偏差。在第一次进入一些游戏时,想必大家都经历过调节屏幕亮度参数直至能看清底部图片的操作吧,这也伽马矫正的一种。

从图像中可以看出,当输入值为0-10时(实际亮度),输出值大概为0-50(人类视觉感知亮度)。但当输入值为240-255时,输出值并没有大幅度变动,由此可见人类视觉神经对黑暗的变化更加敏感。

然而,相机传感器与人类视觉神经不同,相机传感器遵循线性关系(如下图所示),对暗部和亮部的敏感度也是相同的。

那么在显示器显示图像时问题就出现了,所有显示设备(比如传统CRT屏幕)都具有电压响应强度曲线,该曲线是幂函数,指数Gamma从1.8到2.5不等,如下式所示。

V_{out}=(V_{in})^{gamma}

这就导致显示器和相机传感器捕捉的图像不一致,为了校正这个差异,我们对输入信号进行伽马矫正(Gamma correction)。

如果图像未经过伽马矫正,则亮色部分被分配过多位值,暗色部分被分配过少位值,图像会看起来过暗或有漂白的效果。

伽马矫正实例

下面介绍伽马矫正的具体过程

假设图像中一像素A值为200,那么对这个像素矫正的过程如下:

1.归一化

将像素值转换为0-1之间的实数:(p+0.5)/256, p为像素值。对像素A而言,其值为0.783203

2.预补偿

根据公式,将归一化后的像素以1/gamma为指数对应值,进行指数运算。若gamma为2.2,则1/gamma为0.454545,则像素A预补偿结果为0.783203^{0.454545}=0.894872

3.反归一化

将预补偿后的结果反变换为0-255之间的整数:p*256-0.5,对像素A而言,预补偿后的A为228,这个228就是显示器显示的数据。

 

通过观察得到,如果图像分辨率为800*600,则需要进行48万个浮点数运算,计算效率低,无法实时运行。

由此提出一种快速算法,将0-255个像素值的256个值分别进行预补偿计算得到一个gamma矫正查找表(LUT),通过查找表,就可以快速对0-255之间任何的图像值进行gamma矫正。

 

参考文献:

[1] https://theailearner.com/2019/01/26/power-law-gamma-transformations/

[2] https://www.cnblogs.com/qiqibaby/p/5325193.html

[3] https://blog.youkuaiyun.com/love_xunmeng/article/details/8274400

 

 

 

局部自适应伽马矫正(Local Adaptive Gamma Correction)是一种可以根据图像的局部特征进行自适应调整的伽马矫正方法。该方法可以有效地增强图像的对比度并保留细节信息。下面是一个示例代码,演示如何使用OpenCV和NumPy库进行局部自适应伽马矫正: ```python import cv2 import numpy as np def local_adaptive_gamma_correction(image, gamma=1.0, clip_limit=2.0, tile_size=8): # 将图像转换为Lab颜色空间 lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB) l_channel, a_channel, b_channel = cv2.split(lab_image) # 对L通道进行伽马矫正 l_channel = cv2.equalizeHist(l_channel) l_channel = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=(tile_size, tile_size)).apply(l_channel) l_channel = cv2.pow(l_channel/255.0, gamma) * 255.0 # 合并通道并转换回BGR颜色空间 corrected_lab_image = cv2.merge((l_channel, a_channel, b_channel)) corrected_image = cv2.cvtColor(corrected_lab_image, cv2.COLOR_LAB2BGR) return corrected_image # 读取图像 image = cv2.imread('image.jpg') # 进行局部自适应伽马矫正 gamma_corrected_image = local_adaptive_gamma_correction(image, gamma=1.5, clip_limit=2.0, tile_size=8) # 显示原始图像和矫正后的图像 cv2.imshow('Original Image', image) cv2.imshow('Gamma Corrected Image', gamma_corrected_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码中的`local_adaptive_gamma_correction()`函数实现了局部自适应伽马矫正。该函数首先将输入图像转换为Lab颜色空间,然后对L通道进行直方图均衡化和CLAHE(对比度限制自适应直方图均衡化)处理。接下来,将L通道的像素值进行伽马矫正,并将L通道与a通道、b通道重新合并。最后,将结果转换回BGR颜色空间。 您可以根据需要调整`gamma`、`clip_limit`和`tile_size`参数以获得所需的效果。请注意,上述代码中的`'image.jpg'`应替换为您要进行矫正的实际图像路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值