1. 颜色误区
在印刷、包装、油墨行业,一个长期困扰质检工程师的现象是:不同厂家的红色油墨,在 D65 光源下用 RGB 相机拍摄,图像可能完全一致,但客户换一个光源、或者换一台色差仪,就会判定"颜色不一致"。
这不是相机坏了,也不是油墨有问题,而是RGB 相机本身获取的信息量太少。
1.1 RGB
人眼和 RGB 相机都只有三个颜色通道(红、绿、蓝),本质上是对连续光谱做了三次加权积分:
R=∫λS(λ)⋅rˉ(λ) dλ R = \int_{\lambda} S(\lambda) \cdot \bar{r}(\lambda) \, d\lambdaR=∫λS(λ)⋅rˉ(λ)dλ
其中S(λ)S(\lambda)S(λ)是物体反射的光谱功率分布,rˉ(λ)\bar{r}(\lambda)rˉ(λ)是传感器的红色响应函数。绿、蓝同理。
问题在于:这个积分过程是不可逆的。无数条不同的光谱曲线S(λ)S(\lambda)S(λ),经过积分后可能得到完全相同的(R,G,B)(R, G, B)(R,G,B)三元组。这就是**同色异谱(Metamerism)**的数学根源。
1.2 同色异谱
| 场景 | RGB 相机结果 | 客户实际感知 |
|---|---|---|
| D65 光源下拍摄 | 两块红色油墨 RGB 值几乎相同 | 看起来一样 |
| 切换到 A 光源(白炽灯) | 仍按 RGB 判断为"一致" | 明显偏色,判定不合格 |
| 客户用分光色差仪测量 | 无法提供光谱数据 | 色差 ΔE 超标,退货 |
RGB 相机在 D65 下"看起来一样",是因为它恰好在这一个光源下把两条不同的光谱曲线投影到了同一个点。一旦光源改变,投影点就会分开,而 RGB 相机无法预知这种分离。
结论:RGB 是"结果",光谱才是"原因"。要彻底解决同色异谱,必须跳出 RGB 的三维空间,回到连续光谱反射率曲线这个物理本质。这正是高光谱成像(Hyperspectral Imaging, HSI)要解决的问题。
要彻底解决同色异谱,必须跳出 RGB 的三维空间,回到连续光谱反射率曲线这个物理本质。这正是高光谱成像(Hyperspectral Imaging, HSI)要解决的问题。
2. 高光谱成像
2.1 成像原理
高光谱成像在可见光到近红外波段(约 400–1000 nm)内,以极窄的波段间隔(通常 2–10 nm)采集几十到上百个通道的数据。每个像素不再是一个 RGB 三元组,而是一条连续的光谱反射率曲线。
RGB 相机: 每个像素 → (R, G, B) → 3 个数值 高光谱相机:每个像素 → (λ1, λ2, ..., λN) → 几十~上百个数值高光谱采集的结果是一个三维数据立方体(Data Cube):
高光谱采集的结果是一个三维数据立方体:
维度 1:空间 X 维度 2:空间 Y 维度 3:光谱 λ(波长通道)对于油墨检测,我们关心的是每个像素位置上的光谱维度切片,即该点油墨的反射率随波长变化的曲线。
2.2 采集要点
- 光源:建议使用高显色性、光谱平滑的卤素灯或宽谱 LED,避免窄带光源引入偏差。
- 标定:采集前必须做白板标定和暗电流标定,否则反射率曲线会整体偏移。
- 几何:45°/0° 或 0°/45° 的照明-观测几何,减少镜面反射干扰。
- 稳定性:油墨表面若有光泽,需控制入射角,避免高光饱和。
3. 光谱提取
这是整个技术方案的关键。从原始高光谱数据到可用的光谱曲线,需要经过一条完整的处理链路。
3.1 处理流程
整个处理链路是一条单向流水线:从原始高光谱数据立方体出发,先做暗电流与白板标定,把原始读数校正到统一基准;接着进行反射率计算,得到物理意义上的反射率数据;然后做ROI 区域分割,把油墨区域从背景、纸张和高光中分离出来;再对分割出的像素做光谱去噪与平滑,抑制近红外端的噪声与条纹;随后剔除异常像素(如高光饱和点、混入背景的点);在此基础上做区域光谱平均,得到该油墨的代表性曲线;最终输出连续光谱反射率曲线,并进入光谱匹配与色差判定环节,给出颜色是否一致的结论。
原始传感器读数是数字量化值(DN),必须转换为物理意义上的反射率:
原始传感器读数是数字量化值(DN),必须转换为物理意义上的反射率:
R(λ)=Isample(λ)−Idark(λ)Iwhite(λ)−Idark(λ) R(\lambda) = \frac{I_{\text{sample}}(\lambda) - I_{\text{dark}}(\lambda)}{I_{\text{white}}(\lambda) - I_{\text{dark}}(\lambda)}R(λ)=Iwhite(λ)−Idark(λ)Isample(λ)−Idark(λ)
- IsampleI_{\text{sample}}Isample:样品原始读数
- IdarkI_{\text{dark}}Idark:盖镜头盖采集的暗电流
- IwhiteI_{\text{white}}Iwhite:标准白板读数
这一步把"相机看到什么"变成"物体反射多少",是后续所有分析的基础。
3.3 辐标定位
油墨区域需要与背景、纸张、高光区分开。常用方法:
- 光谱角匹配(SAM):先人工框选一小块纯油墨区域作为参考光谱,再在全图计算每个像素与参考光谱的夹角,夹角小于阈值即判为同类油墨。
- 阈值分割:在特定波段(如红色油墨在 550–600 nm 吸收谷)做阈值。
- 形态学处理:去除噪点、填补空洞。
上述光谱角匹配的实现思路可以这样理解:输入是一个形状为「高 × 宽 × 波段数」的三维数据立方体,以及一条人工框选得到的参考光谱(长度为波段数)。算法先对数据立方体沿波段维度做逐像素的向量归一化,即每个像素的光谱向量除以它自身的模长(分母加一个极小量避免除零),这样就把亮度因素消掉,只保留光谱形状;参考光谱同样做归一化。接着对每个像素,把归一化后的光谱向量与归一化参考向量做逐波段相乘再求和,得到两者的余弦值,也就是夹角余弦。由于浮点误差可能让余弦略微超出 [-1, 1],需要做一次截断保证数值合法。最后对余弦值取反余弦,得到每个像素与参考光谱之间的光谱角(单位弧度)。整幅图输出一张与空间尺寸同大小的角度图,角度越小说明该像素的光谱形状越接近参考油墨,据此设定阈值即可完成油墨区域的分割。
3.4 光谱降噪
高光谱数据在近红外端信噪比下降明显,且存在条纹噪声。常用处理:
- Savitzky-Golay 滤波:在保留光谱峰谷形状的前提下平滑曲线。
- 小波去噪:适合去除高频条纹噪声。
- 波段选择:剔除信噪比过低的边缘波段(如 400 nm 以下、950 nm 以上)。
Savitzky-Golay 平滑的实现要点是:调用信号处理库中的 Savitzky-Golay 滤波函数,对传入的单条光谱曲线做平滑。函数有两个关键参数——窗口长度默认取 11(必须是奇数,代表参与局部多项式拟合的波段点数)和多项式阶数默认取 3(代表拟合所用的多项式次数)。窗口越长、阶数越低,平滑越强但峰谷细节损失越多;反之则保留细节但去噪能力下降。函数直接返回平滑后的光谱曲线,长度与输入一致,可无缝接入后续的平均与匹配流程。
3.5 曲线平均
单个像素的光谱仍有随机噪声。对 ROI 内所有有效像素的光谱做逐波段平均,得到该油墨区域最具代表性的连续光谱反射率曲线:
Rˉ(λ)=1M∑i=1MRi(λ) \bar{R}(\lambda) = \frac{1}{M} \sum_{i=1}^{M} R_i(\lambda)Rˉ(λ)=M1i=1∑MRi(λ)
其中MMM为 ROI 内有效像素数。同时可计算标准差曲线,用于评估油墨的均匀性。
3.6 特征提取
为了消除整体亮度差异、突出光谱形状,常做以下处理:
- 连续统去除(Continuum Removal):用包络线归一化,突出吸收特征。
- 一阶导数光谱:增强吸收峰位置信息,对同色异谱更敏感。
- 特征波段提取:如红色油墨在 520–580 nm 的吸收谷深度、近红外端的反射平台高度。
4. 光谱对比
4.1 比对思路
RGB 比对的是三个积分值,光谱比对的是整条曲线。两条同色异谱的光谱曲线,在 RGB 空间可能重合,但在光谱空间必然存在差异——差异就藏在那些 RGB 积分"看不见"的波段里。
4.2 相似度度量
常用的光谱匹配算法:
| 方法 | 公式/含义 | 特点 |
|---|---|---|
| 光谱角(SAM) | θ=arccosa⋅b∣a∣∣b∣\theta = \arccos\frac{\mathbf{a}\cdot\mathbf{b}}{|\mathbf{a}||\mathbf{b}|}θ=arccos∣a∣∣b∣a⋅b | 对亮度不敏感,看形状 |
| 欧氏距离 | ∣a−b∣2|\mathbf{a} - \mathbf{b}|_2∣a−b∣2 | 简单,受亮度影响 |
| 光谱相关系数 | Pearson 相关系数 | 衡量曲线线性相关程度 |
| 光谱信息散度(SID) | 基于信息熵的散度 | 对细微形状差异敏感 |
实际工程中建议组合使用:SAM 判断形状一致性,欧氏距离判断幅值差异,两者同时满足才判为同色。
4.3 色差换算
客户用的是分光色差仪,输出的是 CIELAB 色差 ΔE。我们可以用标准观察者函数把光谱反射率曲线转换为 XYZ,再转 Lab:
X=k∫λR(λ)⋅S(λ)⋅xˉ(λ) dλ X = k \int_{\lambda} R(\lambda) \cdot S(\lambda) \cdot \bar{x}(\lambda) \, d\lambdaX=k∫λR(λ)⋅S(λ)⋅xˉ(λ)dλ
其中S(λ)S(\lambda)S(λ)为光源光谱功率分布,xˉ(λ)\bar{x}(\lambda)xˉ(λ)为标准观察者颜色匹配函数。这样就能在任意指定光源下计算色差,与客户色差仪的结果直接对齐。
把反射率曲线换算为 XYZ 三刺激值的实现思路如下:输入包括一条反射率曲线、对应光源的光谱功率分布、三条标准观察者颜色匹配函数(分别对应 X、Y、Z),以及等长的波长数组。首先用波长数组做数值微分(相邻波长差),得到每个波段对应的波长间隔,用于把离散求和近似为积分。然后计算归一化系数 k:取 100 除以「光源 SPD × Y 匹配函数 × 波长间隔」的求和结果,这个系数保证完美漫反射白体的 Y 值为 100。接着分别对 X、Y、Z 三个通道,把「反射率 × 光源 SPD × 对应匹配函数 × 波长间隔」逐波段相乘后求和,再乘以系数 k,得到 X、Y、Z 三个三刺激值。最后把这三个值返回,即可进一步转换为 Lab 并计算与客户色差仪一致的 ΔE。由于光源 SPD 是外部传入的参数,同一组反射率曲线只需换一份光源数据,就能在任意指定光源下重算色差。
4.4 多光校验
真正的"严苛颜色还原",要求油墨在多种光源下都保持一致。高光谱方案可以:
- 采集一次光谱曲线;
- 在 D65、A、F11 等多种标准光源下分别计算 Lab 值;
- 计算同色异谱指数(Metamerism Index, MI);
- 只有 MI 小于阈值的油墨,才判定为真正一致。
这一步是 RGB 相机根本无法完成的——因为它只有一组 RGB 值,无法"换光源重算"。
5. 产线落地
5.1 系统架构
产线系统的数据流是一条从左到右的链路:高光谱相机负责成像,通过线扫采集方式逐行获取被测物数据,汇聚成数据立方体;随后进入实时标定与反射率计算模块,把原始读数转换为反射率;接着做ROI 分割与光谱提取,锁定油墨区域并取出代表性光谱曲线;再送入光谱匹配引擎,与光谱库中的标准曲线比对;匹配结果交由色差与同色异谱判定模块,输出合格与否的结论;最终判定结果上传至MES / 质检系统,与生产批次、工单信息关联,实现闭环质量管控。
5.2 关落地难点
- 数据量:线扫高光谱每秒产生数百 MB 数据,需要 GPU 加速与流水线处理。
- 速度:产线速度要求实时判定,需在 ROI 分割和光谱匹配上做算法优化。
- 标定漂移:长时间运行需定期白板复标,建议每批次自动插入标定帧。
- 模型泛化:不同油墨体系(溶剂型、UV 型)光谱特征不同,需建立光谱库。
5.3 流程融合
- 高光谱系统作为离线抽检 + 在线预警的双层机制;
- 光谱库持续积累,形成企业自己的"油墨光谱指纹库";
- 与客户色差仪数据做定期比对校准,保证判定标准一致。
6. 总结
RGB 相机在 D65 下"看起来一样",本质是三通道积分丢失了光谱信息,同色异谱因此无法避免。高光谱成像通过采集几十个通道的连续光谱反射率曲线,把颜色判定从"三个数"升级为"一条曲线",从物理根源上消除了同色异谱带来的误判。
核心链路可以概括为:
- 标定→ 把 DN 值变成反射率;
- 分割→ 锁定油墨区域;
- 去噪→ 得到干净的光谱曲线;
- 平均→ 提取代表性曲线;
- 匹配→ 用光谱角、距离、色差多维度判定;
- 多光源验证→ 用同色异谱指数做最终把关。
对于颜色要求最严苛的印刷包装场景,高光谱不是"更贵的 RGB",而是换了一个信息维度——它看到的是颜色的物理本质,而不是颜色的三通道投影。