图像的gamma变换

图像的gamma变换

gamma矫正公式:

     output = input^r

input的取值范围为[0,1],因为如果为0-255,对输入图像进行指数运算时很容易达到255,然后需要截断操作,就失去gamma变换的意义。

图像的gamma变换_第1张图片
从上图中可以看出,gamma变换实际上就是一种将图像的像素值进行非线性处理的技术。

  1. 当gamma值大于1时,会将图像中的比较集中的高照度区域范围做一个拉伸,将对比度拉升到一个比较大的范围,比如gamma值取2时,[0.5-1]的区域经过gamma变换后,输出范围由原来的[0.5,1]扩大为[0.25,1],这不就是对比度拉伸麽。
  2. 同理,当gamma值小于1时,会将图像中比较集中的低照度区域范围做一个拉伸,将对比度同样拉升到一个比较大的范围,比如gamma值取0.5时,[0-0.25]的区域经过gamma变换后,输出范围由原来的[0-0.25]扩大为[0-0.5]。
  3. 所以在实际应用中,应对不同的图像可以采取不同的gamma系数来处理,比如当图片出现过度曝光时,可以取gamma大于1对原图像进行指数变换,把高亮度区域的对比度进行拉伸,使得人眼看起来图像辨识度很高;当图像出现欠曝光时,就可以取gamma值小于1的操作了。

下面附上非常简短的python实现代码:

  1. 首先读入图片,并进行归一化(我首先进行了灰度处理,也可以直接对三通道图像进行直接归一化)
  2. 然后对图像进行gamma指数运算
import cv2
import numpy as np
src = cv2.imread('./gamma.jpg', 0)
r1 = 1/2.2
r2 = 2.2
result_r1 = ((src/float(np.max(src)))**r1)
result_r2 = ((src/float(np.max(src)))**r2)
cv2.imshow('src', src)
cv2.imshow('result_r1', result_r1)
cv2.imshow('result_r2', result_r2)
cv2.waitKey(0)

图像的gamma变换_第2张图片

参考文献1
参考文献2
参考文献3

你可能感兴趣的:(python,opencv,opencv,python)