1. 色品图到底是什么,为什么搞色彩的人都绕不开它
第一次接触色品图是在做一个显示屏色彩校准的项目,当时需要把一批面板的色域覆盖率算清楚,客户丢过来一张马蹄形彩色图,说“按这个标准来”。那张图就是CIE1931色品图。后来做LED分光、做相机色彩标定、做印刷打样,几乎每个跟颜色打交道的环节都会撞上它。可以说,只要你的工作和“颜色准不准”有关,色品图就是那张必须看懂的地图。
色品图本质上是一张二维坐标图,横轴是x,纵轴是y,用来描述颜色的“色度”信息,也就是抛开亮度之后,一个颜色到底偏红、偏绿还是偏蓝。它把三刺激值XYZ归一化处理,得到x、y两个坐标,把三维的颜色空间压到平面上。这样做的好处是直观,坏处是丢了亮度维度,所以色品图只能告诉你“是什么颜色”,不能告诉你“有多亮”。
它解决的问题很具体:当你需要判断两个颜色是不是同一个色调、某个显示设备能覆盖多大范围的颜色、某批LED的波长是否落在合格区间,色品图都能给你一个统一的参照系。没有它,不同厂商、不同设备之间的颜色沟通就变成了各说各话。
适合看这篇内容的人包括:做显示屏、LED、相机、印刷、涂料、纺织等跟颜色相关工作的工程师;做色彩管理、图像处理、视觉算法的开发者;以及刚入行、被xyY和XYZ搞得一头雾水的同学。我会从坐标怎么来的讲起,一直讲到怎么在实际项目里用它做判断,中间穿插我踩过的坑和实测经验。
2. 色品图的底层逻辑:从XYZ到xyY的推导与取舍
2.1 为什么需要XYZ这个中间层
人眼对颜色的感知其实来自三种视锥细胞,分别对长波、中波、短波敏感。但直接用RGB来描述颜色有个致命问题:不同设备的RGB光谱响应不一样,同一个RGB值在不同屏幕上看起来完全不同。CIE在1931年提出了一套“理想观察者”模型,用三个假想的刺激值X、Y、Z来替代真实的RGB,目的是让颜色描述与具体设备解耦。
XYZ的选取有几个硬性约束:Y必须等于亮度,这样亮度信息可以单独拿出来;X和Z则负责补全色度信息。所有可见光的颜色都能用XYZ的正值组合表示,不会出现负值,这是它比RGB更适合做标准的原因。你可以把XYZ理解成颜色世界的“世界语”,不管你是屏幕、打印机还是人眼,最后都翻译成XYZ来对话。
2.2 xyY归一化的数学过程
有了XYZ之后,色度坐标的定义就很直接了:
x = X / (X + Y + Z) y = Y / (X + Y + Z) z = Z / (X + Y + Z) = 1 - x - y因为x + y + z = 1,所以z是冗余的,只需要x和y就能确定色度。Y单独保留作为亮度。这就是xyY颜色空间的由来。
这里有个容易混淆的点:xyY里的Y和XYZ里的Y是同一个值,不是归一化后的。很多人第一次看会以为Y也被归一化了,其实没有。归一化只发生在色度坐标上。这个细节在做亮度计算时特别重要,我见过有人把xyY的Y当成百分比用,结果亮度算出来差了一个数量级。
2.3 色品图的边界为什么是马蹄形
把所有单色光(也就是光谱色)的xy坐标画出来,连成一条曲线,就是光谱轨迹。这条轨迹从深红(约700nm)经过橙、黄、绿、青、蓝,一直到深紫(约380nm)。把光谱轨迹的两端用一条直线连起来,这条直线叫紫线,代表红和紫的混合色。光谱轨迹加紫线围成的区域就是所有物理上可实现的颜色,形状像马蹄,所以叫马蹄形。
马蹄形外面的点代表什么?代表理论上存在但物理上无法实现的颜色。比如x=0.5、y=0.5这个点,算出来需要负的某个刺激值,现实中没有任何光源能发出这种颜色。这个边界概念在做色域分析时非常关键,因为任何设备的色域都必须是马蹄形的子集。
注意:光谱轨迹上的颜色是单色光,纯度最高。越往马蹄形中心走,颜色越接近白色,纯度越低。中心附近有一个白点,代表等能白光,坐标大约是x=0.333、y=0.333。
3. 核心参数与实操要点:读懂色品图上的每一条线
3.1 光谱轨迹与波长标注
光谱轨迹上每个点对应一个波长,从380nm到700nm。实际使用时,你不需要记住每个波长的坐标,但要知道几个关键位置:520nm附近是绿色最饱和的区域,610nm附近是红色最饱和的区域,470nm附近是蓝色最饱和的区域。做LED分光时,客户给的波长容差通常就是基于这些位置来定的。
我做过一个LED分选的项目,要求红光波长在620nm到625nm之间。把这两个波长对应的xy坐标标在色品图上,就形成了一个很小的区域,分选机就按这个区域来筛。如果只看波长不看色品坐标,遇到光谱半高宽比较大的LED,波长对了但颜色看起来偏橙,就是因为色品坐标偏了。
3.2 色温线与黑体轨迹
色品图上有一条从红到蓝的曲线,叫黑体轨迹,也叫普朗克轨迹。它代表不同温度下黑体辐射的颜色。比如2700K对应暖黄光,6500K对应接近日光的白光。实际光源的色温通常用相关色温CCT来表示,就是找到黑体轨迹上离该光源色品坐标最近的点,那个点的温度就是CCT。
这里有个实操中的坑:两个色温相同的光源,色品坐标可能不一样,因为它们在黑体轨迹的垂直方向上偏离了。这个偏离量用Duv表示。Duv为正表示偏绿,为负表示偏品红。做高端照明时,Duv要控制在±0.003以内,否则人眼能明显看出色调差异。我见过一批灯珠CCT都是4000K,但Duv差了0.01,装在一起后一半偏绿一半偏红,客户直接退货。
3.3 色域三角形与覆盖率计算
任何显示设备或打印设备的色域,在色品图上都表现为一个多边形,通常是三角形。三角形的三个顶点就是该设备红、绿、蓝三个基色的色品坐标。色域覆盖率就是设备三角形面积与某个标准色域三角形面积的比值。
计算三角形面积用鞋带公式:
面积 = 0.5 * |x1(y2 - y3) + x2(y3 - y1) + x3(y1 - y2)|比如sRGB的三个基色坐标大约是红(0.64, 0.33)、绿(0.30, 0.60)、蓝(0.15, 0.06)。代入公式算出来面积约0.112。如果某显示器的三角形面积是0.134,那它对sRGB的覆盖率就是0.134/0.112≈119.6%。但注意,覆盖率超过100%不代表完全覆盖,因为形状可能不同,有些区域覆盖了,有些区域反而没覆盖。所以更严谨的做法是算交集面积,而不是简单比总面积。
提示:做色域对比时,一定要说明是“面积比”还是“交集比”。很多厂商宣传的120% sRGB其实是面积比,实际交集可能只有95%。
3.4 麦克亚当椭圆与颜色容差
色品图上还有一个重要概念:麦克亚当椭圆。它描述的是人眼对颜色差异的感知阈值。在色品图上,人眼刚能分辨出颜色差异的区域近似为椭圆,不同位置的椭圆大小和方向都不一样。在绿色区域,椭圆比较小,人眼很敏感;在蓝色区域,椭圆比较大,人眼相对迟钝。
这个特性在做颜色容差判定时非常实用。比如两个LED的色品坐标距离相同,但在绿色区域可能人眼能看出差异,在蓝色区域就看不出来。所以高端的颜色分选设备会按麦克亚当椭圆来划分档位,而不是简单地按圆形或矩形划分。我参与过一个项目,客户要求按3步麦克亚当椭圆分选,结果良率比按矩形分选低了15%,但客户投诉率降到了几乎为零。
4. 实操过程:从原始光谱数据到色品图绘制
4.1 数据采集与预处理
要画一张准确的色品图,第一步是拿到光谱数据。用光谱仪测量光源或物体的光谱功率分布,波长范围通常取380nm到780nm,步长1nm或5nm。步长越小,积分越准,但数据量越大。对于大多数应用,5nm步长足够,除非你要做高精度的窄带光源分析。
拿到光谱数据后,先做暗电流校正和参考白校正。暗电流校正就是扣掉没有光时的读数,参考白校正就是用标准白板或标准光源做归一化。这两步不做,后面算出来的XYZ会偏得离谱。我见过有人直接用光谱仪的原始读数去算,结果色温差了500K,排查了半天才发现是没做暗电流校正。
4.2 三刺激值XYZ的积分计算
有了校正后的光谱功率分布S(λ),用CIE标准观察者的颜色匹配函数x̄(λ)、ȳ(λ)、z̄(λ)做积分:
X = k * Σ S(λ) * x̄(λ) * Δλ Y = k * Σ S(λ) * ȳ(λ) * Δλ Z = k * Σ S(λ) * z̄(λ) * Δλ其中k是归一化系数,对于自发光光源,通常取k = 683 lm/W,这样Y直接对应亮度。对于反射物体,k要选得让完美反射体的Y等于100。
颜色匹配函数有多个版本,CIE1931是2度视场,CIE1964是10度视场。做小面积光源分析用2度,做大面积均匀光源用10度。选错了会导致色品坐标偏移,虽然不大,但在高精度场合不能忽略。
4.3 色品坐标计算与绘图
算完XYZ后,按前面的公式算x和y。然后就可以在色品图上标点了。如果是画光谱轨迹,就把380nm到700nm每个波长的xy都算出来连成线。如果是画设备色域,就把红绿蓝三个基色的xy算出来连成三角形。
绘图时有个细节:色品图的背景色通常是用sRGB色域填充的,但sRGB色域比马蹄形小很多,所以马蹄形边缘的区域在图上显示为灰色或白色。这不代表那些颜色不存在,只是显示器显示不出来。如果你要精确标注光谱轨迹上的点,最好用坐标网格图,而不是彩色填充图。
4.4 一个完整的计算示例
假设某光源的光谱数据经过积分后得到X=0.45、Y=0.40、Z=0.15。那么:
x = 0.45 / (0.45 + 0.40 + 0.15) = 0.45 / 1.00 = 0.45 y = 0.40 / 1.00 = 0.40这个点落在色品图的橙红区域。如果要算相关色温,就在黑体轨迹上找最近点。假设最近点对应3000K,那CCT就是3000K。再算Duv,如果点在轨迹上方,Duv为正,偏绿;在下方,Duv为负,偏品红。
注意:计算CCT时,如果色品坐标离黑体轨迹太远(Duv绝对值大于0.05),CCT就没有意义了,这时候应该用其他方式描述颜色,比如主波长和纯度。
5. 常见问题与排查技巧实录
5.1 色品坐标算出来是负数怎么办
理论上XYZ都是正值,算出来的xy应该在0到1之间。但如果光谱数据有噪声,或者暗电流校正没做好,可能出现负的XYZ,进而导致xy超出正常范围。排查步骤:先检查光谱仪是否饱和,再检查暗电流校正是否在完全遮光条件下做的,最后检查积分范围是否包含了所有有效波长。如果都没问题,可能是光源太弱,信噪比不够,需要增加积分时间或平均次数。
5.2 同一批LED色品坐标分散很大
这通常是分选环节的问题。先确认测量条件是否一致:驱动电流、温度、测量距离、光谱仪积分时间。如果条件一致但分散还是大,那就是LED芯片本身的波长均匀性问题。这时候要么提高分选精度,要么跟供应商谈更窄的波长档位。我遇到过一批灯珠,供应商说波长容差±5nm,实测色品坐标分散度相当于±12nm,后来发现是他们分选机的校准片老化了。
5.3 色域覆盖率算出来超过100%但显示效果不好
前面说过,面积比超过100%不代表完全覆盖。如果设备的色域三角形形状和标准色域差异很大,可能出现面积大但关键区域缺失的情况。比如某些广色域显示器,绿色很饱和,但红色偏橙,导致sRGB的深红区域反而覆盖不到。解决办法是算交集面积,或者直接看关键颜色的色差。做专业调色时,我一般会选24个标准色块,逐个算色差,比看覆盖率靠谱得多。
5.4 色品图上的白点位置不对
白点应该是等能白光,坐标(0.333, 0.333)。如果画出来偏了,通常是颜色匹配函数用错了,或者积分范围不对称。检查一下是不是把380nm到780nm的积分范围写成了400nm到700nm,少了紫外和深红部分,白点就会偏。另外,如果用的是10度观察者,白点坐标会略有不同,大约是(0.313, 0.329),这是正常的。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决措施 |
|---|---|---|---|
| xy坐标为负 | 暗电流未校正或光谱仪饱和 | 检查遮光条件和信号强度 | 重新校正,调整积分时间 |
| 色品坐标分散大 | 测量条件不一致或芯片均匀性差 | 固定条件复测,对比不同批次 | 提高分选精度或更换供应商 |
| 覆盖率超100%但效果差 | 面积比不等于交集比 | 计算交集面积或关键色差 | 用交集比或色差评估 |
| 白点位置偏移 | 积分范围或观察者函数错误 | 检查波长范围和CMF版本 | 修正积分参数 |
| CCT计算异常 | Duv过大或黑体轨迹查找错误 | 检查Duv绝对值是否超0.05 | 改用主波长描述 |
实操心得:做颜色测量时,温度对结果影响很大。LED的色品坐标会随结温漂移,通常温度升高,波长红移。所以测量时要等光源热稳定,一般点亮后等5到10分钟再测。我吃过这个亏,冷态测和热态测差了0.005的y坐标,客户直接判不合格。
6. 色品图在实际项目中的扩展应用
6.1 显示屏色彩校准中的色品图应用
做显示器校准时,色品图用来确定显示器的原生色域和校准目标。流程通常是:先测显示器的红绿蓝白四个点的色品坐标,画出原生色域三角形;然后根据目标色域(比如sRGB或DCI-P3)计算校准矩阵;最后通过调整RGB增益和偏移,把白点拉到目标位置,把色域三角形尽量对齐目标。
这里有个取舍:如果原生色域比目标色域大很多,校准后色域会缩小,但颜色更准;如果原生色域比目标小,那就只能尽量逼近,无法完全覆盖。我一般建议客户先明确用途,如果是做印刷打样,优先保证sRGB覆盖;如果是做影视后期,优先保证DCI-P3覆盖。
6.2 LED分光分色中的色品图应用
LED分光分色就是按色品坐标把LED分成不同的档位。分选机的原理是快速测量每个LED的xy坐标,然后根据预设的档位边界判定归属。档位边界可以是矩形、圆形或麦克亚当椭圆。矩形最简单,但边缘区域的颜色差异可能超出人眼容差;麦克亚当椭圆最符合人眼感知,但分选速度慢,良率也低。
实际项目中,我通常建议客户先用矩形分选,然后对边缘档位做二次筛选。这样兼顾效率和品质。另外,分选机的校准周期很重要,一般每班次开始前都要用标准光源校准一次,否则测量漂移会导致分选错误。
6.3 印刷与涂料行业的色品图应用
印刷行业用色品图来定义油墨的色域和叠印效果。涂料的颜色匹配也依赖色品图,通过测量标准板和样板的xy坐标,计算色差,然后调整配方。这里要注意的是,印刷和涂料的颜色是反射色,测量时要用标准光源(如D50或D65)照明,否则色品坐标会随光源变化。
我做过一个涂料调色的项目,客户用D65光源确认颜色,但车间用普通日光灯照明,结果确认合格的批次在车间看起来偏黄。后来统一了照明光源,问题才解决。所以做反射色测量时,光源的一致性比测量精度还重要。
6.4 色品图与色貌模型的结合
色品图只描述色度,不描述色貌。实际人眼看到的颜色还受亮度、背景、观察者适应状态影响。所以现代色彩管理会结合色貌模型,比如CIECAM02,来预测颜色在不同条件下的外观。色品图在这个流程中仍然是基础,但不再是全部。
做高端色彩项目时,我会先用色品图做初步筛选,再用色貌模型做精细调整。比如做汽车内饰颜色匹配,不同光照条件下颜色看起来不一样,单靠色品图不够,必须结合色貌模型来评估。
7. 工具选型与数据处理的几点经验
7.1 光谱仪的选择
做色品图相关的测量,光谱仪的分辨率和灵敏度是关键。分辨率一般选1nm到5nm,做窄带光源(如激光或LED)时选1nm,做宽谱光源(如白光LED或荧光灯)时5nm够用。灵敏度要看测量对象,弱光需要高灵敏度探测器。
我用过几种不同档次的光谱仪,便宜的几千块,贵的几十万。差别主要在杂散光抑制、波长准确度和重复性。做研发建议用中高端,做产线分选可以用低端但必须定期校准。校准用标准灯,一般每年送检一次。
7.2 计算脚本的编写
算XYZ和xy的脚本很简单,Python用numpy几行就能搞定。关键是颜色匹配函数的数据要准确,建议从CIE官方或权威数据库获取,不要随便从网上抄。我见过有人用了错误的CMF数据,算出来的色品坐标整体偏移,排查了很久才发现是数据源的问题。
import numpy as np # 假设已加载波长数组wl和光谱数组S # 以及CMF数据x_bar, y_bar, z_bar delta = wl[1] - wl[0] X = np.sum(S * x_bar) * delta Y = np.sum(S * y_bar) * delta Z = np.sum(S * z_bar) * delta total = X + Y + Z x = X / total y = Y / total这段代码里,delta是波长步长,积分就是求和乘以步长。注意S、x_bar、y_bar、z_bar的长度要一致,波长要对齐。如果步长不是均匀的,要用梯形积分。
7.3 数据可视化
画色品图可以用matplotlib,光谱轨迹和紫线用plot,色域三角形用fill。背景色填充比较麻烦,可以用imshow加载一张预先生成的色品图背景,然后把坐标轴对齐。网上有现成的色品图背景图,但要注意版权和坐标准确性。
我一般自己生成背景:在xy平面上采样,把每个xy转成XYZ(设Y=1),再转成sRGB,超出sRGB色域的点用灰色表示。这样生成的背景和坐标轴完全对齐,标注也方便。
提示:画图时把光谱轨迹的波长标注加上,方便读者对照。标注不要太多,每隔50nm标一个就行,否则图会很乱。
8. 我踩过的坑和最后分享的几个技巧
做色品图相关的工作十几年,坑踩了不少。最大的一个坑是早期做LED分选时,没有考虑温度漂移,冷态分选出来的批次,点亮后颜色偏了,客户投诉。后来加了预热环节,问题解决。第二个坑是算色域覆盖率时用了面积比,客户拿去做宣传,结果被专业用户指出交集不够,尴尬收场。从那以后,我对外一律用交集比或关键色差。
还有一个容易忽略的点:色品图上的坐标精度。xy坐标通常保留四位小数,但实际测量精度可能只有三位。如果报告里写四位,会给人虚假的精确感。我一般根据测量设备的重复性来决定保留位数,重复性0.001就保留三位,重复性0.0005才保留四位。
最后分享一个小技巧:做颜色对比时,不要只看色品图上的距离,还要看方向。在麦克亚当椭圆的长轴方向上,人眼不敏感,距离大一点也没关系;在短轴方向上,距离小一点人眼就能看出来。所以判断两个颜色是否可接受,要结合椭圆的方向来评估,而不是简单算欧氏距离。这个技巧在做颜色容差判定时特别有用,能帮你减少不必要的返工。
色品图这个东西,入门容易精通难。刚开始只要会算xy、会看马蹄图就行,但要做到在实际项目中灵活运用,需要理解它背后的假设和局限。希望这篇内容能帮你少走一些弯路,把颜色这件事做得更靠谱。