Python if/elif分支实现RGB伽马校正时R、G、B输出相同问题求助
Python实现XYZ转sRGB时输出三通道数值完全一致问题排查
问题现象
- 代码运行无语法报错,矩阵乘法计算得到的线性RGB矩阵(RGB_l)结果正常,但后续经过if/elif分支计算得到的R、G、B三个分量输出完全相同,和预期颜色转换结果不符。
- 已确认的代码基础逻辑:RGB_l为3行1列的NumPy矩阵,依次提取矩阵内的三个分量赋值给R_l、G_l、B_l,再通过分支判断执行对应分量的sRGB伽马校正计算。核心代码如下:
X = float(input("X: "))/100 Y = float(input("Y: "))/100 Z = float(input("Z: "))/100 b = np.array([[X], [Y], [Z]]) a = np.array([[3.2406, -1.5372, -0.4986], [-0.9689, 1.8758, 0.0415], [0.0557, -0.2040, 1.057]]) RGB_l = np.dot(a, b) print("RGB linear :", RGB_l) R_l = RGB_l[0, 0] G_l = RGB_l[1, 0] B_l = RGB_l[2, 0] a = 0.055 if R_l <= 0.0031308: R = 12.92*R_l elif R_l > 0.0031308: R = ((1+a)**(1/2.4))-a print(R) if G_l <= 0.0031308: G = 12.92*G_l elif G_l > 0.0031308: G = ((1+a)**(1/2.4))-a print(G) if B_l <= 0.0031308: B = 12.92*B_l elif B_l > 0.0031308: B = ((1+a)**(1/2.4))-a print(B)
- 实际运行输出样例:
0.967559351663262 0.967559351663262 0.967559351663262
根因定位
- 高值段的伽马校正计算存在两处核心错误:
- 表达式完全没有将对应通道的线性值(R_l/G_l/B_l)纳入运算流程
- 幂运算的作用对象完全错误,原代码
elif分支的计算((1+a)**(1/2.4))-a实际计算的是和通道线性值无关的固定常数
- 只要三个通道的线性值都超过阈值0.0031308,无论线性值本身是多少,最终结果都是同一个固定值,这也是三通道输出完全一致的直接原因。
- 标准sRGB非线性转换的高值段公式为:当线性通道值
V_l > 0.0031308时,非线性输出值V = 1.055 * (V_l ** (1/2.4)) - 0.055,和代码现有逻辑的核心差异是:幂运算的作用对象是线性通道值V_l,而非常量1+a。
修复方案
将每个通道的分支计算替换为正确的公式逻辑,补入对应线性通道值的运算:
a = 0.055 # R通道伽马校正 if R_l <= 0.0031308: R = 12.92 * R_l else: R = (1 + a) * (R_l ** (1 / 2.4)) - a # G通道伽马校正 if G_l <= 0.0031308: G = 12.92 * G_l else: G = (1 + a) * (G_l ** (1 / 2.4)) - a # B通道伽马校正 if B_l <= 0.0031308: B = 12.92 * B_l else: B = (1 + a) * (B_l ** (1 / 2.4)) - a
内容的提问来源于stack exchange,提问作者гиви
相关产品推荐
相关产品推荐

