如何使用colour库在校准RGB空间中调整图像至指定色温?
问题:如何使用colour Python库在校准后的ProPhoto RGB色彩空间中将图像调整至指定色温?
我有一张图像,先以未校准的16位线性RGB格式拍摄,随后利用图像中的色卡将其校准至ProPhoto RGB色彩空间。具体操作是将厂商提供的色卡目标值从Lab*映射至ProPhoto RGB,检测输入图像色卡中的对应源色彩,再应用colour.colour_correction函数。
通过以下代码,我已得出图像中白色参考点当前色温为6250K:
import colour ref_gray = [0.85007768, 0.89948808, 1.11035624] XYZ = colour.RGB_to_XYZ(ref_gray, "ProPhoto RGB") xy = colour.XYZ_to_xy(XYZ) CCT = colour.xy_to_CCT(xy, method="hernandez1999") # CCT is 6250.9622746435989
我知道colour.CCT_to_xy函数可反向转换,但不知道如何利用生成的xy色度坐标调整图像,也不确定这种操作是否合理。
如何调整图像,使白色色卡的色温变为5500K?
解决方案
要在校准后的线性ProPhoto RGB空间中将图像色温调整至5500K,你可以通过白平衡线性校正实现,核心是基于当前白色点与目标白色点的色度差异生成校正因子,再批量应用到图像上。具体步骤如下:
1. 计算当前与目标白色点的XYZ值
首先明确当前白色参考点和目标色温对应的XYZ坐标:
import numpy as np import colour # 当前白色参考点的ProPhoto RGB值 ref_gray = np.array([0.85007768, 0.89948808, 1.11035624]) # 转换为XYZ色彩空间 xyz_current = colour.RGB_to_XYZ(ref_gray, "ProPhoto RGB") # 计算5500K对应的xy色度坐标,再转换为XYZ(Y分量保持1,保证亮度一致) xy_target = colour.CCT_to_xy(5500, method="hernandez1999") xyz_target = colour.xy_to_XYZ(xy_target)
2. 生成XYZ空间校正因子
校正因子为目标白色XYZ与当前白色XYZ的比值,用于将当前白色点映射为目标白色点:
correction_scale = xyz_target / xyz_current
3. 批量应用校正到图像
由于图像是线性ProPhoto RGB格式,可通过numpy批量处理提升效率:
# 假设image_prophoto是校准后的16位线性ProPhoto RGB图像(转为float类型) image_prophoto = ... # 将RGB像素转换为XYZ image_xyz = colour.RGB_to_XYZ(image_prophoto, "ProPhoto RGB") # 应用校正因子 image_xyz_corrected = image_xyz * correction_scale # 转换回ProPhoto RGB image_corrected = colour.XYZ_to_RGB(image_xyz_corrected, "ProPhoto RGB") # 可选:转回16位整数格式(裁剪超出范围的像素值) image_corrected_16bit = np.clip(image_corrected * 65535, 0, 65535).astype(np.uint16)
关键说明
- 操作合理性:线性色彩空间下,白平衡校正是对XYZ通道的线性缩放,不会破坏已校准的色彩线性关系,适合专业图像调整。
- 色域处理:校正后部分像素可能超出ProPhoto RGB色域,可通过
np.clip裁剪,或根据需求使用colour库的色域映射工具。 - 效率优化:尽量用numpy向量运算代替逐像素循环,colour库函数原生支持批量处理numpy数组。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

