图像γ(指数)变换
指数变换 (伽马变换) 是用来图像加强, 提高暗部细节, 简单来讲就是经过非线性变换, 让图像从曝光强度的线性响应变得更接近人眼感觉的响应, 即将漂白 (相机曝光) 或过暗 (曝光不足) 的图片, 进行矫正。
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。
小结:γ变换是一种简单而有效的图像处理技术,可以用来改善图像的亮度和对比度,提高图像的视觉质量和观感。另外,如果需要精细的控制数据变化及数据的稳定性,可以考虑先将像素归一化到0~1,再指数变换,往往能取得不错的效果。
参考资料:
https://www.cnblogs.com/chang-yuan/p/15230607.html
https://www.cnblogs.com/jiujiubashiyi/p/15996047.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署