Python OpenCV实现Gamma变换详解:原理、代码与直方图分析

认真发呆
认真发呆
发布时间:2026-10-13 | 2人浏览过
原创

本文详解Python OpenCV中Gamma变换的应用。通过非线性映射矫正曝光不足或过度图像,提升暗部细节。代码演示如何分通道计算直方图,利用查找表实现Gamma校正,并可视化校正前后灰度分布变化,帮助理解Gamma值对图像亮度的拉伸与收缩作用。

Gamma变换主要用于图像增强,其核心作用是提升图像暗部细节。简单来说,该算法通过非线性变换,将图像从曝光强度的线性响应调整为人眼更敏感的响应曲线,从而矫正因曝光过度导致的“漂白”效果或曝光不足造成的过暗问题。

Gamma变换的基本数学形式如下所示:

当Gamma值大于1时,会对图像的灰度分布直方图产生拉伸效果,使灰度值向高灰度区域延展;反之,当Gamma值小于1时,则产生收缩效果,使灰度值向低灰度区域靠拢。

#分道计算每个通道的直方图
img0 = cv2.imread('12.jpg')
hist_b = cv2.calcHist([img0],[0],None,[256],[0,256])
hist_g = cv2.calcHist([img0],[1],None,[256],[0,256])
hist_r = cv2.calcHist([img0],[2],None,[256],[0,256])
def gamma_trans(img,gamma):
 #具体做法先归一化到1,然后gamma作为指数值求出新的像素值再还原
 gamma_table = [np.power(x/255.0,gamma)*255.0 for x in range(256)]
 gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
 #实现映射用的是Opencv的查表函数
 return cv2.LUT(img0,gamma_table)
img0_corrted = gamma_trans(img0, 0.5)
cv2.imshow('img0',img0)
cv2.imshow('gamma_image',img0_corrted)
cv2.imwrite('gamma_image.png',img0_corrted)
#分通道计算Gamma校正后的直方图
hist_b_c =cv2.calcHist([img0_corrted],[0],None,[256],[0,256])
hist_g_c =cv2.calcHist([img0_corrted],[1],None,[256],[0,256])
hist_r_c =cv2.calcHist([img0_corrted],[2],None,[256],[0,256])
fig = plt.figure('gamma')
pix_hists = [[hist_b, hist_g, hist_r],
    [hist_b_c, hist_g_c, hist_r_c]]
pix_vals = range(256)
for sub_plt, pix_hist in zip([121, 122], pix_hists):
 ax = fig.add_subplot(sub_plt, projection='3d')
 for c, z, channel_hist in zip(['b', 'g', 'r'], [20, 10, 0], pix_hist):
  cs = [c] * 256
  ax.bar(pix_vals, channel_hist, zs=z, zdir='y', color=cs, alpha=0.618, edgecolor='none', lw=0)
 ax.set_xlabel('Pixel Values')
 ax.set_xlim([0, 256])
 ax.set_ylabel('Count')
 ax.set_zlabel('Channels')
plt.show()
cv2.waitKey()

以上关于Python OpenCV中Gamma变换的使用详解即为全部内容,希望能为读者提供参考。欢迎支持本站,获取更多技术分享。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表