【opencv】图像处理之伽马变换

■ 概述

      伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算(r,s分别代表输入和输出灰度):
在这里插入图片描述

      伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:
      1)gamma值小于1时,会拉伸图像中灰度级较低的区域,同时会压缩灰度级较高的部分。
      2)gamma值大于1时,会拉伸图像中灰度级较高的区域,同时会压缩灰度级较低的部分。

【opencv】图像处理之伽马变换_第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()

输出:
【opencv】图像处理之伽马变换_第2张图片

■ 讨论

      如果想让图像变亮,直接把每个像素值+100不就可以了吗?

实验:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./dark.jpg',0)
plt.imshow(img + 100, cmap="gray")
plt.show()

输出:
【opencv】图像处理之伽马变换_第3张图片原因:
      如果直接将所有像素值+100的话,假如有的像素值大于155,+100之后将会超过255!最终将会导致有些亮的地方会变黑。

例:np.array(355, dtype=np.uint8) --> array(99, dtype=uint8)

你可能感兴趣的:(opencv,计算机视觉,图像处理,图像识别)