尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

GAMMA拉伸对比分析

GAMMA拉伸对比分析 第一章 研究背景与实验设计1.1 研究背景Gamma校正是图像信号处理中的重要组成部分,主要用于提升暗部可见性并改善主观视觉效果。Gamma作用于不同颜色空间时,对亮度、色度、色相、裁剪风险以及工程复杂度的影响并不相同。本文在同一幅图像上,分别对RGB三通道、YUV空间的Y通道和Lab空间的L*通道执行幂函数拉伸,比较七组参数γ=0.35、0.50、0.65、0.80、1.00、1.40、2.20的视觉与定量差异。本文统一采用y=x^(1/γ)定义,因此γ1表示提亮,0γ1表示压暗。1.2实验方法三种方法使用相同的Gamma参数和输入图像,区别仅在于被非线性映射的颜色分量。RGB域将同一LUT应用于三个颜色通道;YUV域只改变Y并旁路U/V;Lab域只改变L*并旁路a*/b*。最终结果均转换为8 bit BGR进行显示、保存与统计。第二章RGB域Gamma拉伸分析2.1 RGB域Gamma拉伸的意义RGB域Gamma拉伸是指分别对红色通道R、绿色通道G和蓝色通道B执行相同的非线性幂函数映射。它不改变图像尺寸和空间结构,仅重新分配各通道的像素灰度等级,使暗部和高光之间的亮度关系发生变化。RGB Gamma主要具有以下意义:第一,调整图像的整体明暗关系。与线性增益不同,Gamma不是把所有像素乘以同一个系数,而是根据输入像素的大小分配不同增益。本文采用y=x^(1/γ):当Gamma大于1时,暗部获得的相对增益更大,因此能够提升暗部细节;当Gamma小于1时,暗部被进一步压低,图像整体变暗。第二,改善有限位深下的灰度分配。对于8 bit图像,输入和输出都只有0~255共256个编码值。Gamma映射可以把更多输出编码分配到关注的亮度范围。例如,Gamma大于1时会把较多编码分配到原图暗部,提高暗部的可见性。需要注意的是,RGB Gamma并不是严格意义上的“只改变亮度”。虽然三个通道使用相同曲线,但非线性映射会改变通道之间的比例,从而改变颜色的饱和度和综合色感。2.2 RGB Gamma数学模型本文采用如下Gamma定义(参数越大越提亮):y = x^(1/γ)式中,x和y分别表示归一化到0~1范围的输入与输出,γ表示Gamma参数。对于8 bit RGB图像,三个通道的映射公式分别为:R_out = 255 × (R_in / 255)^(1/γ)G_out = 255 × (G_in / 255)^(1/γ)B_out = 255 × (B_in / 255)^(1/γ)Gamma曲线的导数为:dy / dx = (1/γ) × x^(1/γ-1)当γ大于1时,指数1/γ小于1,低输入区域的曲线斜率较大,暗部像素获得更高增益;当γ小于1时,低输入区域的输出被压缩,暗部变得更暗。RGB Gamma对颜色比例的影响可以表示为:R_out / G_out = (R_in / G_in)^(1/γ)由该式可知,当γ大于1时,指数1/γ小于1,原有的通道比例会向1靠近,图像通常表现为饱和度下降;当γ小于1时,通道比例差异会被放大,综合色感和饱和度可能增强。2.3 不同Gamma参数的映射差异本章选取以下七组Gamma参数进行比较:γ = 0.35、0.50、0.65、0.80、1.00、1.40、2.20以输入像素值50为例,输出像素按照下式计算,不同参数的输出如下图所示:Output = 255 × (50 / 255)^(1/γ)图2-1 RGB域不同Gamma参数的映射曲线从映射结果可以看出,Gamma对暗部像素的影响非常显著。输入像素50在γ=0.35时被压缩到2.4,而在γ=2.20时被提升到121.6。随着输入值逐渐接近255,各条曲线最终都收敛到255,因此Gamma主要改变暗部和中间像素值,高光的绝对变化相对较小。图像代码:#!/usr/bin/env python3 # -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt # ============================== # 参数设置 # ============================== # Gamma参数 GAMMA_VALUES = [0.35, 0.50, 0.65, 0.80, 1.00, 1.40, 2.20] # 输入像素值 INPUT_PIXEL = 50 # 输出图片 OUTPUT_NAME = "Gamma_Curve_With_Table.png" # ============================== # 建立Gamma曲线 # ============================== x = np.arange(256) x_norm = x / 255.0 plt.figure(figsize=(12,8)) table_data = [] for gamma in GAMMA_VALUES: y = (x_norm ** gamma) * 255 plt.plot( x, y, linewidth=2, label=f"γ={gamma}" ) # 输入Pixel对应输出 y_out = (INPUT_PIXEL / 255.0) ** gamma * 255 plt.scatter( INPUT_PIXEL, y_out, s=60, zorder=5 ) plt.text( INPUT_PIXEL+4, y_out, f"{y_out:.1f}", fontsize=10 ) gain = y_out / INPUT_PIXEL table_data.append([ gamma, INPUT_PIXEL, round(y_out,1), round(gain,2) ]) # ============================== # 输入Pixel竖线 # ============================== plt.axvline( INPUT_PIXEL, linestyle="--", color="black", linewidth=1.5 ) plt.text( INPUT_PIXEL+2, 248, f"Input Pixel={INPUT_PIXEL}", fontsize=11 ) # ============================== # 绘制表格 # ============================== col_labels = [ "Gamma", "Input", "Output", "Gain" ] table = plt.table( cellText=table_data, colLabels=col_labels, cellLoc='center', colLoc='center', bbox=[0.68,0.12,0.30,0.42] ) table.auto_set_font_size(False) table.set_fontsize(10) # ============================== # 图形设置 # ============================== plt.title( "Gamma Mapping Curves", fontsize=18 ) plt.xlabel( "Input Pixel", fontsize=14 ) plt.ylabel( "Output Pixel", fontsize=14 ) plt.xlim(0,255) plt.ylim(0,255) plt.grid(True,alpha=0.3) plt.legend( loc="lower right" ) plt.tight_layout() plt.savefig( OUTPUT_NAME, dpi=300 ) plt.show() print("图片已保存:", OUTPUT_NAME) print("\nGamma映射结果:") for row in table_data: print( f"Gamma={row[0]:4} " f"Input={row[1]} " f"Output={row[2]} " f"Gain={row[3]}x" )2.4 实验图像图2-2 RGB域不同Gamma参数下的整体对比图2-3 不同RGB Gamma参数下的暗部ROI细节对比2.5定量结果对比表中平均Y和Y标准差用于描述整体亮度与亮度分布;平均C*用于描述Lab空间中的综合色度;HSV平均饱和度用于观察相对颜色浓度;低端通道裁剪表示至少一个B、G或R通道落入0~1的有效区域像素比例。Gamma平均YY标准差平均C*
返回列表