■ 概述
伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算(r,s分别代表输入和输出灰度):
伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:
1)gamma值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分。
2)gamma值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分。
γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。
opencv实现代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('./dark.jpg',0)
plt.figure(figsize=(15,15))
plt.subplot(131)
plt.title('gamma = 1')
plt.imshow(img, cmap = 'gray') # 原图
# 默认gamma值为1.0,默认不变化
def adjust_gamma(image, gamma=1.0):
invgamma = 1/gamma
brighter_image = np.array(np.power((image/255), invgamma)*255, dtype=np.uint8)
return brighter_image
# gamma大于1,变亮
img_gamma = adjust_gamma(img, gamma=3.0)
plt.subplot(132)
plt.title('gamma > 1')
plt.imshow(img_gamma, cmap="gray")
# gamma小于1,变暗
img_gamma = adjust_gamma(img, gamma=0.5)
plt.subplot(133)
plt.title('gamma < 1')
plt.imshow(img_gamma, cmap="gray")
plt.show()
输出:
■ 讨论
如果想让图像变亮,直接把每个像素值+100不就可以了吗?
实验:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('./dark.jpg',0)
plt.imshow(img + 100, cmap="gray")
plt.show()
输出:
原因:
如果直接将所有像素值+100的话,假如有的像素值大于155,+100之后将会超过255!最终将会导致有些亮的地方会变黑。
例:np.array(355, dtype=np.uint8) --> array(99, dtype=uint8)