灰度变换作为一种图像预处理技术可以显著的改善图像的质量,下面将介绍几种灰度变换的方法
1. gamma 变换
Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:
s = c r λ s = cr^{\lambda} s = c r λ
这个指数即为Gamma。
Gamma变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。
经过Gamma变换后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到, 当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。
1.1 实现代码
下面是就 python2.7 和 opencv 的实现
def
gamma_trans
(
img
,
gamma
)
:
#具体做法先归一化到1,然后gamma作为指数值求出新的像素值再还原
gamma_table
=
[
np
.
power
(
x
/
255.0
,
gamma
)
*
255.0
for
x
in
range
(
256
)
]
gamma_table
=
np
.
round
(
np
.
array
(
gamma_table
)
)
.
astype
(
np
.
uint8
)
#实现映射用的是Opencv的查表函数
return
cv2
.
LUT
(
img0
,
gamma_table
)
在上面我们看到没有每次都计算一次指数,因为指数的计算复杂度很高,这里我们存储下计算结果,然后使用查表的方法来节省计算时间。但是上面这段代码还可以继续优化,因为每调用一次这个函数就要计算一遍需要查询的表格,当参数 λ \lambda λ 不变的时候,我们可以先计算出需要查的表,然后对每一张图像查表即可。
参考
[1] CSDN 京局京段蓝白猪《Python-OpenCV中的Gamma变换(校正)》
s