图像γ(指数)变换

  指数变换 (伽马变换) 是用来图像加强, 提高暗部细节, 简单来讲就是经过非线性变换, 让图像从曝光强度的线性响应变得更接近人眼感觉的响应, 即将漂白 (相机曝光) 或过暗 (曝光不足) 的图片, 进行矫正。

1. 伽马变换

  其中 c 和 γ 为正常数,r为输入值,范围为[0,1],常常先归一化,再输入,S为输出值。不同γ值的图像如下:

  在式中或者图中,观察可以发现,向上凸的曲线(比如1/4),在输入灰度较小(较暗)的区间会被放大到一个范围更广的区间,而亮的区域会被压缩到一个较小的区间,向下的曲线则相反,所以规则如下:

  • γ小于1时, 指数变换会拉伸图像中灰度级较低的区域, 同时会压缩灰度级较高的部分,使图像的暗部更亮,亮部更暗。
  • γ 大于 1 时, 指数变换会拉伸图像中灰度级较高的区域, 同时会压缩灰度级较低的部分,使图像的暗部更暗,亮部更亮。

  系数C的规则如下:

  • 如果C的值大于1,会增加图像的整体亮度和对比度。
  • 如果C的值在0到1之间,会减小图像的整体亮度和对比度。

2. 代码实现

import cv2
import numpy as np

def gamma_correction(image, gamma,C=1):
    # 将图像的数据类型转换为浮点数
    image = image.astype(float)
    # 对像素值进行Gamma变换
    image = C*np.power(image, gamma)
    # 将像素值转换回整数类型,并将其限制在0-255的范围之内
    image = np.clip(image, 0, 255)
    image = image.astype(np.uint8)
    return image

# 加载图像
# image = cv2.imread('house.jpg', cv2.IMREAD_GRAYSCALE)#灰度图
image = cv2.imread('house.jpg', 1)#原始彩色图
height=image.shape[0]
width=image.shape[1]
image=cv2.resize(image,(int(height/4),int(width/4)),interpolation=cv2.INTER_LINEAR)

# 创建Gamma变换后的图像
gamma = 0.95
corrected_image = gamma_correction(image, gamma,C=1.2)

gamma_2 = 1.2
corrected_image_2 = gamma_correction(image, gamma_2,C=1.2)

gamma_2 = 0.95
corrected_image_3 = gamma_correction(image, gamma_2,C=1.4)

cv2.imshow('img',np.hstack((image,corrected_image,corrected_image_2,corrected_image_3)))
cv2.waitKey(0)
cv2.destroyWindow()

 

   让这个屋子的暗部条纹更加清晰,所以γ的值应该小于1,提高暗屋子与亮部的对比度,C大于0,可以尝试几种不同值的组合。这副图中区分还不是很大。上图中第三个图γ=0.6,C=10,第四个图γ=1.2,C=2。

 

小结:γ变换是一种简单而有效的图像处理技术,可以用来改善图像的亮度和对比度,提高图像的视觉质量和观感。

 

参考资料:

https://www.cnblogs.com/chang-yuan/p/15230607.html

https://www.cnblogs.com/jiujiubashiyi/p/15996047.html

 

posted @ 2023-11-09 16:26  wancy  阅读(292)  评论(0编辑  收藏  举报