可调颜色校正与噪声权衡(TCC, Tunable Color Correction)
论文精读与工程整理
源论文 :Ryo Yamakabe, Yusuke Monno, Masayuki Tanaka, Masatoshi Okutomi.
Tunable color correction for noisy images.
Journal of Electronic Imaging, Vol. 29, No. 3, 033012, May/Jun 2020.
DOI:
10.1117/1.JEI.29.3.033012单位:东京工业大学 工学院 系统与控制工程系;产业技术综合研究所(AIST)人工智能研究中心
会议预印版:ICIP 2017, pp. 3125--3129
投稿 2019-12-27,录用 2020-05-21
文档说明 :第 1~5 章为论文核心内容的归纳;第 6 章为对论文数值表的独立复算与核验;第 7~8 章为面向 ISP 落地的工程补充与批判性分析,已单独标注。
0. 一句话结论
PCC(多项式颜色校正)靠高阶项把偏置误差 压下去,但高阶项同时把噪声放大 得更厉害。所以对含噪图像,LCC 与 PCC 之间存在一个色彩保真度 vs 噪声放大 的权衡,而且最优点随噪声水平移动。
本文的做法是两件事:
① TCC 矩阵模型 ------在最小二乘目标上加一个只惩罚高阶项系数的正则项:
M ^ ( λ ) = arg min M ( ∥ Q t − M P t ∥ F 2 + 1 λ ∥ W ∘ M ∥ F 2 ) \hat{\mathbf M}(\lambda) = \arg\min_{\mathbf M}\Bigl(\|\mathbf Q_t - \mathbf M\mathbf P_t\|_F^2 + \tfrac{1}{\lambda}\|\mathbf W\circ\mathbf M\|_F^2\Bigr) M^(λ)=argMmin(∥Qt−MPt∥F2+λ1∥W∘M∥F2)
W \mathbf W W 是二值矩阵,线性项位置为 0、高阶项位置为 1。于是
λ → 0 ⇒ M ^ = M \^ l c c 0 ( 即 LCC ) , λ → ∞ ⇒ M ^ = M ^ p c c ( 即 PCC ) \lambda\to 0 \Rightarrow \hat{\mathbf M}=\\hat{\\mathbf M}_{lcc}\\ \\ \\mathbf 0 \quad(\text{即 LCC}),\qquad \lambda\to\infty \Rightarrow \hat{\mathbf M}=\hat{\mathbf M}_{pcc}\quad(\text{即 PCC}) λ→0⇒M^=M\^lcc 0(即 LCC),λ→∞⇒M^=M^pcc(即 PCC)
λ \lambda λ 成为一个在 LCC 与 PCC 之间连续滑动的旋钮。
② MSE 计算模型 ------把 MSE 做偏置--方差分解:
M S E k ( λ ) = ∥ q k − M ^ ( λ ) μ p k ∥ 2 2 ⏟ 偏置 2 + t r M \^ ( λ ) Σ p k M \^ ( λ ) T ⏟ 噪声方差 \mathrm{MSE}k(\lambda)=\underbrace{\|\mathbf q_k-\hat{\mathbf M}(\lambda)\boldsymbol\mu{p_k}\|2^2}{\text{偏置}^2}+\underbrace{\mathrm{tr}\bigl\\hat{\\mathbf M}(\\lambda)\\boldsymbol\\Sigma_{p_k}\\hat{\\mathbf M}(\\lambda)\^{\\mathsf T}\\bigr}_{\text{噪声方差}} MSEk(λ)=偏置2 ∥qk−M^(λ)μpk∥22+噪声方差 trM\^(λ)ΣpkM\^(λ)T
论文推导出二阶 PCC 输入向量在高斯噪声下的期望向量 μ p \boldsymbol\mu_p μp 与协方差矩阵 Σ p \boldsymbol\Sigma_p Σp 的闭式表达 (式 15、19),于是只要知道噪声方差 σ 2 \sigma^2 σ2,就能解析地算出任意 λ \lambda λ 的 MSE,从而直接挑出最优 λ ^ \hat\lambda λ^------不需要交叉验证、不需要带噪的验证集。
💡 本文档从中提炼出的最有用的一条 (论文没有单独点出):对标准 3×3 CCM、白噪声 σ 2 I \sigma^2\mathbf I σ2I 的情形,第二项化简为
t r M σ 2 I M T = σ 2 ∥ M ∥ F 2 \mathrm{tr}\\mathbf M\\,\\sigma\^2\\mathbf I\\,\\mathbf M\^{\\mathsf T}=\sigma^2\|\mathbf M\|_F^2 trMσ2IMT=σ2∥M∥F2
即 CCM 的噪声增益就是它的 Frobenius 范数。这是一行代码的 CCM 健康检查,见 §7.1。
实验 :在色卡与 40 景高光谱数据集上,TCC 的 mean RMSE 在 18 种工况中 16 种最优;但增益不大(相对 LCC/PCC 中较优者只有 0.5%~3% ),且在 max RMSE 上存在系统性短板(§6.3)。
1. 问题背景
1.1 噪声放大是 CCM 绕不开的代价
已知当拍摄图像含噪时,LCC 与 PCC 都会放大噪声 。因此颜色校正的一个挑战是:在保持高色彩保真度的同时抑制噪声放大。
由于使用了高阶项,PCC 通常比 LCC 取得更低的比色误差。但 PCC 放大噪声也更严重,因为高阶项通常引起更大的噪声放大。
这正是 RPCC 论文 §6.1 承认但未解决的那件事------RPCC 作者说"噪声是厂商偏爱 LCC 的原因""RPCC 无疑会比 LCC 放大更多噪声",却只给了定性的分曝光切换建议,没有给出"切换点在哪"的计算方法。本文补的就是这个。
1.2 已有的噪声分析工作与本文的差异
论文梳理得很清楚:
| 工作 | 内容 | 局限 |
|---|---|---|
| Tan & Acharya (2000)、Barnhöfer et al. (2003) | 数学描述 LCC 中保真度与噪声放大的权衡,给出 MSE 意义下的最优 LCC 矩阵 | 不超出 LCC |
| Quan (2004) | 考虑信号相关泊松噪声的综合误差度量 | 不超出 LCC |
| Lim & Silverstein (2004) | 基于局部窗内观测色信号协方差的空间自适应 LCC | 不超出 LCC |
| Trussell & Vrhel (2013) | 考虑泊松噪声的局部自适应 LCC | 不超出 LCC |
| Burns & Berns (1997) | 用泰勒级数以非常一般的形式分析非线性变换的噪声效应 | 唯一的例外,但形式过于一般 |
| 本文 TCC | 给出跨越 LCC 与非线性 PCC 两个模型推导最优矩阵的数学方法与分析 | --- |
📌 定位准确 :此前所有可计算的噪声分析都卡在 LCC 里。本文的贡献是把它推进到 PCC,并且是闭式的(而非 Burns & Berns 的泰勒近似)。
1.3 为什么只做二阶 PCC
论文给了两条理由:
- 更高阶的 PCC 不一定给出更低的比色误差 ------训练样本与测试样本的统计差异会引起过拟合(引 Cheung et al. 2004、Bianco & Schettini 2014);
- 更高阶的 PCC 噪声放大过于严重,在以含噪图像为输入时无益。
📎 这与 RPCC 论文 §6.2 的观察一致:2 次就能拿到大部分收益,更高阶边际收益极小。本文全文中 "PCC" 均指二阶 PCC。
2. 论文给出的 CCM 文献地图(相当有用)
论文第 2 节把基于回归的 CCM 方法梳理成一张图谱,正好把我前面几篇文档串起来了:
2.1 不考虑噪声的方法
| 方法 | 作者 | 解决的问题 | 本目录文档 |
|---|---|---|---|
| 约束最小二乘 / WPPLS | Finlayson & Drew 1997 24 | 约束特定表面(通常是白)零误差复现 | CCM_白点保持的颜色校正.md |
| 考虑白平衡误差的管线 | Bianco et al. 2012--2014 25--27 | AWB 误差传播 | --- |
| 感知/偏好导向 | Zhang & Liu 2012;Vazquez-Corral et al. 2014 | 人眼感知与偏好 | --- |
| 辐照度无关 / 补偿 | Funt & Bastani 2014;Finlayson et al. 2015, 2019 30--32 | 缓解阴影/光强影响 | --- |
| HPPCC(色相平面保持) | Andersen & Hardeberg 2005;Mackiewicz et al. 2016 33--35 | 分段 LCC,提升复现精度 | RPCC 文档 §2.4 |
| MICC(最大无知) | Finlayson & Drew 1996 36 | 无需训练样本,基于反射率统计假设 | WPPLS 文档 §5.3 |
| 遗传算法选项 | Bianco et al. 2008--2009 38,39 | 自动挑选最佳多项式项集合 | --- |
| RPCC(根多项式) | Finlayson et al. 2015 6 | 取 k k k 次项的 k k k 次根,获得曝光无关性 | CCM_根多项式颜色校正.md |
论文的评语:这些方法都成功解决了各自的问题,但都不考虑噪声效应 。虽然近期一些方法(RPCC 6、Andersen & Connah 34)实验上展示了对噪声的鲁棒性,但仍未显式建模噪声效应。
2.2 其他应对噪声的思路
除了解析建模,论文还列了两类"工程式"做法:求解优化问题 (Zhang & Brainard 2004;Bianco et al. 2007)、加入额外信号处理步骤------均值滤波(Kharitonenko et al. 2002)、DCT 域处理(2013)、去噪(Takahashi et al. 2016)。
3. LCC 与 PCC 的权衡
3.1 统一形式
q = M p ( 1 ) \mathbf q = \mathbf M\mathbf p \qquad (1) q=Mp(1)
p ∈ R N \mathbf p\in\mathbb R^N p∈RN 为相机 RGB 构成的输入向量, q ∈ R 3 \mathbf q\in\mathbb R^3 q∈R3 为目标色空间的输出, M ∈ R 3 × N \mathbf M\in\mathbb R^{3\times N} M∈R3×N。注意本文的 LCC 与 PCC 都含偏置项:
p l c c = 1 , p R , p G , p B T ( 2 ) \mathbf p_{lcc} = 1,\\ p_R,\\ p_G,\\ p_B^{\mathsf T} \qquad (2) plcc=1, pR, pG, pBT(2)
p p c c = 1 , p R , p G , p B , p R p G , p R p B , p G p B , p R 2 , p G 2 , p B 2 T ( 3 ) \mathbf p_{pcc} = 1,\\ p_R,\\ p_G,\\ p_B,\\ p_Rp_G,\\ p_Rp_B,\\ p_Gp_B,\\ p_R\^2,\\ p_G\^2,\\ p_B\^2^{\mathsf T} \qquad (3) ppcc=1, pR, pG, pB, pRpG, pRpB, pGpB, pR2, pG2, pB2T(3)
故 N = 4 N=4 N=4(LCC)与 N = 10 N=10 N=10(二阶 PCC)。标定仍是伪逆:
M ^ = arg min M ∥ Q t − M P t ∥ F 2 = Q t P t ∗ ( 4 ) \hat{\mathbf M}=\arg\min_{\mathbf M}\|\mathbf Q_t-\mathbf M\mathbf P_t\|_F^2 = \mathbf Q_t\mathbf P_t^{*} \qquad (4) M^=argMmin∥Qt−MPt∥F2=QtPt∗(4)
⚠️ 关键一句 :该矩阵"通常在色彩标定阶段假设相机 RGB 无噪声 而算得。然而这样预先算好的矩阵,在真实场景中应用于含噪图像时会放大噪声。"------标定条件与使用条件不一致,这就是问题的根源。
📎 加了偏置项 是本文与 RPCC 论文 的一个差别。偏置项会破坏齐次性( M ⋅ k p ≠ k M p \mathbf M\cdot k\mathbf p \ne k\mathbf M\mathbf p M⋅kp=kMp),因此本文的 LCC 既不满足白点保持的行和约束,也不曝光无关。见 §8.4。
3.2 实验设置
- 目标色空间:sRGB(显示用途)
- 省略了自动白平衡 ,直接把某记录光源下的相机 RGB 变换到 D65 下的 sRGB
- 噪声假设:白高斯噪声(为推导简便;论文承认真实噪声更接近泊松--高斯)
3.3 权衡实例(图 1)
模拟 X-Rite ColorChecker SG 的 96 块(去掉边框重复的白/灰/黑块),每块 200×200 像素。目标 sRGB 用 D65 SPD + 96 块反射率算 XYZ 再转 sRGB;相机 RGB 用 Olympus E-PL2 灵敏度 + CIE A(白炽灯)。加性白高斯噪声。
评价量(对每块的 200×200 个校正后样本统计):
color bias = ( I R − μ ˉ R ) 2 + ( I G − μ ˉ G ) 2 + ( I B − μ ˉ B ) 2 \text{color bias}=\sqrt{(I_R-\bar\mu_R)^2+(I_G-\bar\mu_G)^2+(I_B-\bar\mu_B)^2} color bias=(IR−μˉR)2+(IG−μˉG)2+(IB−μˉB)2
color std = σ ^ R 2 + σ ^ G 2 + σ ^ B 2 ( 5 ) \text{color std}=\sqrt{\hat\sigma_R^2+\hat\sigma_G^2+\hat\sigma_B^2} \qquad (5) color std=σ^R2+σ^G2+σ^B2 (5)
M S E = bias 2 + std 2 ( 6 ) \mathrm{MSE}=\text{bias}^2+\text{std}^2 \qquad (6) MSE=bias2+std2(6)
图 1 的数值 (96 块均值,对应 σ = 4 \sigma=4 σ=4):
| color bias | color std | RMSE | |
|---|---|---|---|
| 未校正的相机 RGB | 36.21 | 5.54 | 36.63 |
| LCC | 6.37 | 15.16 | 16.44 |
| PCC | 4.82 | 15.76 | 16.48 |
PCC 偏置更小(4.82 < 6.37),但标准差更大(15.76 > 15.16),总 RMSE 反而略高。权衡由此显现。
💡 一个论文没强调、但很重要的数字 (我的复算,§6.2):在 σ = 4 \sigma=4 σ=4 时,噪声项占 MSE 的 85%(LCC)~91%(PCC) ,偏置只占 9%~15%。也就是说,在中等噪声下,选哪个 CCM 对总 MSE 的影响已经很小了------主导项是噪声。这解释了为什么 TCC 的增益只有百分之几(§6.1)。
4. TCC 方法
4.1 TCC 矩阵模型
动机 :观察到 PCC 中高阶项的大系数引起大的噪声放大。于是:
M ^ ( λ ) = arg min M ( ∥ Q t − M P t ∥ F 2 + 1 λ ∥ W ∘ M ∥ F 2 ) ( 7 ) \hat{\mathbf M}(\lambda)=\arg\min_{\mathbf M}\Bigl(\|\mathbf Q_t-\mathbf M\mathbf P_t\|_F^2+\tfrac{1}{\lambda}\|\mathbf W\circ\mathbf M\|_F^2\Bigr) \qquad (7) M^(λ)=argMmin(∥Qt−MPt∥F2+λ1∥W∘M∥F2)(7)
∘ \circ ∘ 为逐元素乘积, W \mathbf W W 为二值加权矩阵:
W = 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 ( 8 ) \mathbf W=\begin{bmatrix}0&0&0&0&1&1&1&1&1&1\\0&0&0&0&1&1&1&1&1&1\\0&0&0&0&1&1&1&1&1&1\end{bmatrix} \qquad (8) W= 000000000000111111111111111111 (8)
前 4 列(偏置 + 线性项)不惩罚,后 6 列(二阶项)惩罚。
两个极限性质:
lim λ → 0 M ^ ( λ ) = M \^ l c c 0 , lim λ → ∞ M ^ ( λ ) = M ^ p c c ( 9 ) \lim_{\lambda\to 0}\hat{\mathbf M}(\lambda)=\\hat{\\mathbf M}_{lcc}\\ \\ \\mathbf 0,\qquad \lim_{\lambda\to\infty}\hat{\mathbf M}(\lambda)=\hat{\mathbf M}_{pcc} \qquad (9) λ→0limM^(λ)=M\^lcc 0,λ→∞limM^(λ)=M^pcc(9)
λ → 0 \lambda\to0 λ→0 时 1 / λ → ∞ 1/\lambda\to\infty 1/λ→∞,二阶系数被压为 0,矩阵退化成标准 LCC; λ → ∞ \lambda\to\infty λ→∞ 时惩罚消失,回到标准 PCC。λ \lambda λ 是一个连续旋钮。
⚠️ 注意是 1 / λ 1/\lambda 1/λ : λ \lambda λ 是正则强度的倒数,与常见的岭回归约定相反,读公式时容易搞混。
论文用向量化形式求解(式 10),涉及 3 N × 3 N 3N\times 3N 3N×3N 的线性系统。
💡 可以更简单 (§7.3):式 (7) 的两项对 M \mathbf M M 的三行是可分离的 ,且 W \mathbf W W 三行相同,所以只需解一次 N × N N\times N N×N (10×10)的系统,而不是 3 N × 3 N 3N\times 3N 3N×3N(30×30)。实测结果完全一致。
4.2 MSE 计算模型
λ ^ = arg min λ ∑ k = 1 K M S E k ( λ ) ( 11 ) \hat\lambda=\arg\min_\lambda\sum_{k=1}^{K}\mathrm{MSE}_k(\lambda) \qquad (11) λ^=argλmink=1∑KMSEk(λ)(11)
M S E k ( λ ) = E ( ∥ q k − M ^ ( λ ) p k ∥ 2 2 ) = ∥ q k − M ^ ( λ ) μ p k ∥ 2 2 ⏟ 期望偏置误差 + t r M \^ ( λ ) Σ p k M \^ ( λ ) T ⏟ 校正后的噪声方差 ( 12 , 13 ) \mathrm{MSE}k(\lambda)=E\bigl(\|\mathbf q_k-\hat{\mathbf M}(\lambda)\mathbf p_k\|2^2\bigr)=\underbrace{\|\mathbf q_k-\hat{\mathbf M}(\lambda)\boldsymbol\mu{p_k}\|2^2}{\text{期望偏置误差}}+\underbrace{\mathrm{tr}\bigl\\hat{\\mathbf M}(\\lambda)\\boldsymbol\\Sigma_{p_k}\\hat{\\mathbf M}(\\lambda)\^{\\mathsf T}\\bigr}{\text{校正后的噪声方差}} \qquad (12,13) MSEk(λ)=E(∥qk−M^(λ)pk∥22)=期望偏置误差 ∥qk−M^(λ)μpk∥22+校正后的噪声方差 trM\^(λ)ΣpkM\^(λ)T(12,13)
这是经典的偏置--方差分解,被搬到了 CCM 上。 论文指出:这类计算此前只对 LCC 做过 (Tan & Acharya;Quan),据作者所知没有任何已有工作把它显式扩展到 PCC。
噪声模型假设 : p X = g X + n X p_X=g_X+n_X pX=gX+nX( g g g 为无噪潜在值), n X n_X nX 为信号无关的零均值高斯噪声 ,各通道独立、与 g g g 独立:
E ( n X ) = 0 , V ( n X ) = σ X 2 , C ( n X , n Y ) = 0 , C ( g X , n X ) = 0 E(n_X)=0,\quad V(n_X)=\sigma_X^2,\quad C(n_X,n_Y)=0,\quad C(g_X,n_X)=0 E(nX)=0,V(nX)=σX2,C(nX,nY)=0,C(gX,nX)=0
期望向量(式 15):
μ p k = 1 , g R , g G , g B , g R g G , g R g B , g G g B , g R 2 + σ R 2 , g G 2 + σ G 2 , g B 2 + σ B 2 T \boldsymbol\mu_{p_k}=1,\\ g_R,\\ g_G,\\ g_B,\\ g_Rg_G,\\ g_Rg_B,\\ g_Gg_B,\\ \\mathbf{g_R\^2+\\sigma_R\^2},\\ \\mathbf{g_G\^2+\\sigma_G\^2},\\ \\mathbf{g_B\^2+\\sigma_B\^2}^{\mathsf T} μpk=1, gR, gG, gB, gRgG, gRgB, gGgB, gR2+σR2, gG2+σG2, gB2+σB2T
📌 一个漂亮的细节 :线性项与交叉项的期望都不受噪声影响( E p X p Y = g X g Y Ep_Xp_Y=g_Xg_Y EpXpY=gXgY,因为两通道噪声独立),只有平方项被噪声抬高了 σ 2 \sigma^2 σ2 。这意味着 PCC 的平方项在噪声下是有偏的------这是高阶项带来麻烦的第一个具体来源。
协方差矩阵(式 19)的关键元素:
| 元素 | 值 |
|---|---|
| V ( p X ) V(p_X) V(pX) | σ X 2 \sigma_X^2 σX2 |
| V ( p X Y ) V(p_{XY}) V(pXY) | g X 2 σ Y 2 + g Y 2 σ X 2 + σ X 2 σ Y 2 g_X^2\sigma_Y^2+g_Y^2\sigma_X^2+\sigma_X^2\sigma_Y^2 gX2σY2+gY2σX2+σX2σY2 |
| V ( p X 2 ) V(p_{X^2}) V(pX2) | 4 g X 2 σ X 2 + 2 σ X 4 4g_X^2\sigma_X^2+2\sigma_X^4 4gX2σX2+2σX4 |
| C ( p X , p Y ) C(p_X,p_Y) C(pX,pY) | 0 0 0 |
| C ( p X , p X Y ) C(p_X,p_{XY}) C(pX,pXY) | g Y σ X 2 g_Y\sigma_X^2 gYσX2 ; C ( p X , p Y Z ) = 0 C(p_X,p_{YZ})=0 C(pX,pYZ)=0 |
| C ( p X , p X 2 ) C(p_X,p_{X^2}) C(pX,pX2) | 2 g X σ X 2 2g_X\sigma_X^2 2gXσX2 ; C ( p X , p Y 2 ) = 0 C(p_X,p_{Y^2})=0 C(pX,pY2)=0 |
| C ( p X Y , p X Z ) C(p_{XY},p_{XZ}) C(pXY,pXZ) | g Y g Z σ X 2 g_Yg_Z\sigma_X^2 gYgZσX2 |
| C ( p X Y , p X 2 ) C(p_{XY},p_{X^2}) C(pXY,pX2) | 2 g X g Y σ X 2 2g_Xg_Y\sigma_X^2 2gXgYσX2 ; C ( p X Y , p Z 2 ) = 0 C(p_{XY},p_{Z^2})=0 C(pXY,pZ2)=0 |
| C ( p X 2 , p Y 2 ) C(p_{X^2},p_{Y^2}) C(pX2,pY2) | 0 0 0 |
✅ 规律很清晰 :只有共享通道的项之间才有协方差 ,不共享通道的一律为 0。附录的逐项推导我已按式 (19) 的矩阵逐元素核对过,全部一致(§6.4)。
其中 V ( p X 2 ) = 4 g X 2 σ X 2 + 2 σ X 4 V(p_{X^2})=4g_X^2\sigma_X^2+2\sigma_X^4 V(pX2)=4gX2σX2+2σX4 用到了 V ( n 2 ) = E n 4 − σ 4 = 3 σ 4 − σ 4 = 2 σ 4 V(n^2)=En\^4-\sigma^4=3\sigma^4-\sigma^4=2\sigma^4 V(n2)=En4−σ4=3σ4−σ4=2σ4,即高斯四阶矩。这一点在扩展到泊松噪声时会出问题(§8.2)。
注意平方项的方差 4 g X 2 σ X 2 4g_X^2\sigma_X^2 4gX2σX2 正比于信号强度的平方 ------这就是"高阶项放大噪声"的数学来源:亮区的平方项噪声被放大得最厉害。
4.3 推广到多光谱
期望向量与协方差矩阵的结构可自然推广到 H H H 个波段:
μ p k = 1 , g X 1 , ... , g X H , g X 1 g X 2 , ... , g X H − 1 g X H , g X 1 2 + σ X 1 2 , ... , g X H 2 + σ X H 2 T ( 20 ) \boldsymbol\mu_{p_k}=1,\\ g_{X_1},\\dots,g_{X_H},\\ g_{X_1}g_{X_2},\\dots,g_{X_{H-1}}g_{X_H},\\ g_{X_1}\^2+\\sigma_{X_1}\^2,\\dots,g_{X_H}\^2+\\sigma_{X_H}\^2^{\mathsf T} \qquad (20) μpk=1, gX1,...,gXH, gX1gX2,...,gXH−1gXH, gX12+σX12,...,gXH2+σXH2T(20)
Σ ~ p k = C 11 C 12 C 13 C 21 C 22 C 23 C 31 C 32 C 33 ( 21 ) \tilde{\boldsymbol\Sigma}{p_k}=\begin{bmatrix}\mathbf C{11}&\mathbf C_{12}&\mathbf C_{13}\\\mathbf C_{21}&\mathbf C_{22}&\mathbf C_{23}\\\mathbf C_{31}&\mathbf C_{32}&\mathbf C_{33}\end{bmatrix} \qquad (21) Σ~pk= C11C21C31C12C22C32C13C23C33 (21)
三个分块分别对应线性项、交叉项、平方项,各子块的元素形式与 RGB 情形相同。
RGB-NIR(4 波段)实例:
p p c c = 1 , p R , p G , p B , p I , p R p G , p R p B , p R p I , p G p B , p G p I , p B p I , p R 2 , p G 2 , p B 2 , p I 2 T ( 23 ) \mathbf p_{pcc}=1,p_R,p_G,p_B,p_I,\\ p_Rp_G,p_Rp_B,p_Rp_I,p_Gp_B,p_Gp_I,p_Bp_I,\\ p_R\^2,p_G\^2,p_B\^2,p_I\^2^{\mathsf T} \qquad (23) ppcc=1,pR,pG,pB,pI, pRpG,pRpB,pRpI,pGpB,pGpI,pBpI, pR2,pG2,pB2,pI2T(23)
共 15 项, W \mathbf W W 为前 5 列 0、后 10 列 1。
5. 实验
5.1 色卡数据(理想条件)
训练集 = 测试集,噪声方差已知, σ R = σ G = σ B = σ \sigma_R=\sigma_G=\sigma_B=\sigma σR=σG=σB=σ。
图 3( σ = 4 \sigma=4 σ=4,扫 λ \lambda λ) :(a) 偏置误差随 λ \lambda λ 增大而下降 (PCC 的高阶项优势);(b) 标准差随 λ \lambda λ 增大而上升 (高阶项放大噪声);© RMSE 呈 U 形,存在唯一最优点。
表 1:96 块色卡的 RMSE
| σ \sigma σ | 0 | 2 | 4 | 6 | 8 | 10 |
|---|---|---|---|---|---|---|
| LCC | 6.37 | 9.91 | 16.45 | 23.62 | 31.00 | 38.43 |
| PCC | 4.81 | 9.24 | 16.49 | 24.17 | 31.99 | 39.88 |
| TCC | 4.81 | 9.17 | 16.13 | 23.41 | 30.81 | 38.23 |
读表要点:
- 交叉点在 σ ≈ 4 \sigma\approx 4 σ≈4 : σ ≤ 2 \sigma\le 2 σ≤2 时 PCC 优于 LCC; σ ≥ 4 \sigma\ge 4 σ≥4 时 PCC 反而劣于 LCC,且差距随噪声单调拉大( σ = 10 \sigma=10 σ=10 时 PCC 比 LCC 差 1.45);
- TCC 在所有噪声水平都不差于两者------无噪时等于 PCC,高噪时趋近 LCC;
- ⚠️ 但增益不大 :TCC 相对"LCC/PCC 中较优者"的改善只有 0.52%~1.95%(§6.1 的复算)。
5.2 高光谱数据集(现实条件)
更接近实用的设置:训练集与测试集不同 (40 景分成 20 训练 / 20 测试),噪声方差由输入含噪图像盲估计 (Liu et al. 2013)。光源 CIE A / D65 / F12,相机灵敏度 Olympus E-PL2。
对比方法共 8 种:LCC、PCC、二阶 RPCC 、HPPCC 、HoCC (color homography)、AMCC (angular minimization)、MICC(maximum ignorance),均来自公开的 colour correction toolbox。
论文的结论:
- mean RMSE:TCC 在几乎所有工况最优;
- median RMSE :TCC 在 18 种工况中的 9 种最优,其次是 HoCC(4 种);
- max RMSE :TCC 10 种 最优,其次是 RPCC(6 种)。
✅ 这三个计数我都复算过,与论文一致(§6.3)。论文报告得诚实。
5.3 RGB-NIR(多光谱)
表 3:RGB-NIR 的 RMSE
| σ \sigma σ | LCC (mean/median/max) | PCC | TCC |
|---|---|---|---|
| 0 | 15.94 / 14.74 / 25.45 | 14.55 / 12.94 / 27.48 | 14.54 / 12.93 / 27.46 |
| 2 | 30.44 / 29.83 / 36.32 | 32.58 / 31.62 / 40.57 | 29.66 / 29.41 / 35.66 |
| 4 | 54.12 / 53.95 / 57.85 | 61.11 / 59.45 / 71.81 | 53.40 / 53.24 / 57.22 |
| 10 | 128.30 / 129.71 / 132.04 | 165.99 / 164.76 / 194.76 | 127.22 / 128.47 / 131.09 |
最有说服力的一组数字 :RGB-NIR 下 PCC 彻底崩溃 ------ σ = 10 \sigma=10 σ=10 时 mean RMSE 165.99 vs LCC 128.30,max 高达 194.76 。原因是 4 波段 → 15 项 (比 RGB 的 10 项更多高阶项),噪声放大更严重。TCC 正确地退回到 ≈LCC。
📌 这条对多光谱/RGBW/RYYB 传感器很有参考价值 :波段越多,多项式项数增长越快,噪声放大越危险,盲目上高阶 PCC 的风险随波段数急剧上升。
5.4 论文自列的四条局限
- 只能在 XYZ/sRGB 空间优化 MSE,而非 LAB 。因为 XYZ→LAB 高度非线性,MSE 模型处理不了。作者试过线性化的 LAB 变换 (Barnhöfer et al.;Sharma & Trussell),但发现其近似误差对选取最优 λ \lambda λ 而言不可忽略;
- TCC 继承了 PCC 的全部缺点 ------辐照度依赖 (即曝光不变性缺失)与色相平面畸变 。"这无法避免,因为 TCC 本质上使用的就是 PCC 模型。"
- 假设信号无关高斯噪声,真实噪声更接近信号相关的泊松噪声。"噪声模型的精度与 MSE 计算模型的复杂度在 TCC 框架中可能是一个权衡。"
- 未考虑单传感器相机的 CFA 马赛克特性。未来工作考虑引入 Akiyama et al. 的伪四通道划分方式。
📌 第 2 条值得划重点 :TCC 与 RPCC 解决的是正交的两个问题 (噪声 vs 曝光),而且 TCC 明确没有解决曝光问题。两者可以互补但论文没做(§7.4 分析了为什么难做)。
6. 【核验】对论文数值的独立复算
本节为整理本文档时实际跑过的复算,结论可由 §7.5 的代码验证。
6.1 核验一:图 1 与表 1 自洽,但 TCC 的增益确实很小
图 1 的 bias 2 + std 2 \sqrt{\text{bias}^2+\text{std}^2} bias2+std2 与所给 RMSE 全部吻合(36.63 / 16.44 / 16.48,误差 < 0.01),确认式 (6) 的分解成立。
表 1 的增益复算:
| σ \sigma σ | LCC | PCC | TCC | PCC−LCC | TCC 比二者最优好 |
|---|---|---|---|---|---|
| 0 | 6.37 | 4.81 | 4.81 | −1.56 | 0.00% |
| 2 | 9.91 | 9.24 | 9.17 | −0.67 | 0.76% |
| 4 | 16.45 | 16.49 | 16.13 | +0.04 ← 交叉点 | 1.95% |
| 6 | 23.62 | 24.17 | 23.41 | +0.55 | 0.89% |
| 8 | 31.00 | 31.99 | 30.81 | +0.99 | 0.61% |
| 10 | 38.43 | 39.88 | 38.23 | +1.45 | 0.52% |
结论 :TCC 的价值集中在交叉点附近 ( σ ≈ 4 \sigma\approx 4 σ≈4,增益 1.95%)。远离交叉点时,TCC 基本退化成 LCC 或 PCC 中的那一个,增益降到 0.5% 量级。
📌 这是对该方法最公允的定位 :它不是"显著更好",而是"自动替你选对那一个,并在交界处多榨出一两个百分点 "。价值在于不用人工判断该用哪个模型,而不在于绝对精度。
6.2 核验二:中等噪声下 MSE 已由噪声主导
σ = 4 \sigma=4 σ=4 时 MSE 的构成:
| 偏置贡献 | 噪声贡献 | |
|---|---|---|
| LCC | 15.0% | 85.0% |
| PCC | 8.6% | 91.4% |
这解释了 §6.1 的小增益:既然 MSE 的 85%~91% 是噪声,那么在"偏置"这个只占 10% 左右的分量上做优化,总增益自然有限。
💡 更重要的工程推论 :在中等以上噪声下,降低 CCM 的噪声增益比提升它的色彩精度更有价值。这指向 §7.1 的那个工具。
6.3 核验三:论文的获胜计数准确,但 D65 的 max RMSE 有一处系统性短板
逐工况统计最优方法(18 种工况 = 3 光源 × 6 噪声水平):
mean RMSE:
| 光源 | σ=0 | σ=2 | σ=4 | σ=6 | σ=8 | σ=10 |
|---|---|---|---|---|---|---|
| A | PCC/TCC | TCC | TCC | TCC | TCC | TCC |
| D65 | PCC/TCC | TCC | TCC | TCC | TCC | TCC |
| F12 | PCC/TCC | TCC | TCC | TCC | HoCC | HoCC |
→ TCC 16 次最优,PCC 3 次(均为与 TCC 并列的 σ = 0 \sigma=0 σ=0),HoCC 2 次。论文"almost all"措辞准确。
max RMSE:
| 光源 | σ=0 | σ=2 | σ=4 | σ=6 | σ=8 | σ=10 |
|---|---|---|---|---|---|---|
| A | RPCC | RPCC | TCC | TCC | TCC | TCC |
| D65 | RPCC | RPCC | RPCC | RPCC | PCC | PCC |
| F12 | PCC/TCC | TCC | TCC | TCC | TCC | TCC |
→ TCC 10 次、RPCC 6 次、PCC 3 次,与论文给出的计数一致。
⚠️ 但论文没有讨论的一个模式 :在 D65 下,TCC 在 max RMSE 上一次都没赢过,而且 σ ≥ 2 \sigma\ge2 σ≥2 时每一档都劣于 PCC:
| σ \sigma σ | 2 | 4 | 6 | 8 | 10 |
|---|---|---|---|---|---|
| TCC | 26.24 | 28.69 | 31.15 | 33.84 | 36.81 |
| PCC | 26.20 | 27.57 | 29.69 | 32.41 | 35.49 |
| RPCC | 25.80 | 27.31 | 29.65 | 32.65 | 35.99 |
成因很清楚 :式 (11) 优化的是所有训练样本 MSE 之和 ,这是一个均值准则。最小化均值会牺牲尾部。
📌 这一点需要和 RPCC 论文 §6.4 对照着读 :RPCC 那篇专门强调"必须看 95 百分位,因为失败集中在少数色块上,而 10 ΔE 左右的差异肉眼易辨 "。按那个标准,TCC 在 D65 下的表现是倒退的。如果你的痛点是"个别颜色翻车",TCC 不是对症的药,RPCC 才是。
6.4 核验四:式 (19) 与附录推导一致
把附录 7.2~7.9 的每条结论逐一对回式 (19) 的矩阵元素(共 9×9 = 81 个位置,按对称性检查 45 个独立项):
| 检查项 | 公式 | 式 (19) 对应位置 | 结果 |
|---|---|---|---|
| V ( p R ) V(p_R) V(pR) | σ R 2 \sigma_R^2 σR2 | 0,0 | ✅ |
| C ( p R , p G ) C(p_R,p_G) C(pR,pG) | 0 0 0 | 0,1 | ✅ |
| C ( p R , p R G ) C(p_R,p_{RG}) C(pR,pRG) | g G σ R 2 g_G\sigma_R^2 gGσR2 | 0,3 | ✅ |
| C ( p R , p G B ) C(p_R,p_{GB}) C(pR,pGB) | 0 0 0(不共享通道) | 0,5 | ✅ |
| C ( p R , p R 2 ) C(p_R,p_{R^2}) C(pR,pR2) | 2 g R σ R 2 2g_R\sigma_R^2 2gRσR2 | 0,6 | ✅ |
| V ( p R G ) V(p_{RG}) V(pRG) | g R 2 σ G 2 + g G 2 σ R 2 + σ R 2 σ G 2 g_R^2\sigma_G^2+g_G^2\sigma_R^2+\sigma_R^2\sigma_G^2 gR2σG2+gG2σR2+σR2σG2 | 3,3 | ✅ |
| C ( p R G , p R B ) C(p_{RG},p_{RB}) C(pRG,pRB) | g G g B σ R 2 g_Gg_B\sigma_R^2 gGgBσR2(共享 R) | 3,4 | ✅ |
| C ( p R G , p R 2 ) C(p_{RG},p_{R^2}) C(pRG,pR2) | 2 g R g G σ R 2 2g_Rg_G\sigma_R^2 2gRgGσR2 | 3,6 | ✅ |
| C ( p R B , p G 2 ) C(p_{RB},p_{G^2}) C(pRB,pG2) | 0 0 0 | 4,7 | ✅ |
| V ( p R 2 ) V(p_{R^2}) V(pR2) | 4 g R 2 σ R 2 + 2 σ R 4 4g_R^2\sigma_R^2+2\sigma_R^4 4gR2σR2+2σR4 | 6,6 | ✅ |
| C ( p R 2 , p G 2 ) C(p_{R^2},p_{G^2}) C(pR2,pG2) | 0 0 0 | 6,7 | ✅ |
全部一致,未发现错误。 该推导质量很高,是本文最扎实的部分。
7. 【工程补充】可以直接拿来用的东西
以下为论文框架之上的提炼与落地,非论文原文内容。
7.1 ⭐ CCM 噪声增益 = Frobenius 范数(一行代码的健康检查)
式 (13) 的第二项对标准 3×3 LCC + 白噪声 σ 2 I \sigma^2\mathbf I σ2I 化简为:
t r M σ 2 I M T = σ 2 t r M M T = σ 2 ∥ M ∥ F 2 \mathrm{tr}\\mathbf M\\,\\sigma\^2\\mathbf I\\,\\mathbf M\^{\\mathsf T}=\sigma^2\,\mathrm{tr}\\mathbf M\\mathbf M\^{\\mathsf T}=\boxed{\ \sigma^2\|\mathbf M\|_F^2\ } trMσ2IMT=σ2trMMT= σ2∥M∥F2
(已数值验证,§7.5)
于是:
输出噪声幅度 = σ ∥ M ∥ F , 相对于不校色的噪声增益 = ∥ M ∥ F 3 \text{输出噪声幅度}=\sigma\|\mathbf M\|_F,\qquad \text{相对于不校色的噪声增益}=\frac{\|\mathbf M\|_F}{\sqrt 3} 输出噪声幅度=σ∥M∥F,相对于不校色的噪声增益=3 ∥M∥F
用法示例:典型 CCM
M = 1.8 − 0.7 − 0.1 − 0.3 1.6 − 0.3 0.1 − 0.6 1.5 , ∥ M ∥ F = 3.017 , 噪声增益 = 3.017 3 = 1.74 倍 \mathbf M=\begin{bmatrix}1.8&-0.7&-0.1\\-0.3&1.6&-0.3\\0.1&-0.6&1.5\end{bmatrix},\quad \|\mathbf M\|_F=3.017,\quad \text{噪声增益}=\frac{3.017}{\sqrt3}=\mathbf{1.74\ 倍} M= 1.8−0.30.1−0.71.6−0.6−0.1−0.31.5 ,∥M∥F=3.017,噪声增益=3 3.017=1.74 倍
📌 这是我在和你讨论上一篇时提到的"CCM 激进度"的精确定义 。之前只能定性地说"看基色色度落在光谱轨迹外多远",现在有了一个直接对应噪声代价的标量。
落地建议 :把
||M||_F / sqrt(3)作为 CCM tuning 的一项常规输出。经验上:
- < 1.5:保守,适合高 ISO 档
- 1.5 ~ 2.0:常规
- > 2.5:激进,高 ISO 下会明显放大噪声,应配合 §7.2 的收缩
7.2 ⭐ 把 TCC 的思想用在 3×3 CCM 上:按噪声收缩
TCC 需要 3×10 的硬件。但同样的偏置--方差框架可以直接用在你已有的 3×3 CCM 上 ------只要把"LCC↔PCC"这个轴换成"单位阵↔标定 CCM"这个轴:
M ( α ) = ( 1 − α ) I + α M LCC \mathbf M(\alpha)=(1-\alpha)\mathbf I+\alpha\mathbf M_{\text{LCC}} M(α)=(1−α)I+αMLCC
M S E ( α ) = 1 K ∑ k ∥ q k − M ( α ) g k ∥ 2 ⏟ 偏置 2 + σ 2 ∥ M ( α ) ∥ F 2 ⏟ 噪声(§7.1) \mathrm{MSE}(\alpha)=\underbrace{\tfrac{1}{K}\sum_k\|\mathbf q_k-\mathbf M(\alpha)\mathbf g_k\|^2}_{\text{偏置}^2}+\underbrace{\sigma^2\|\mathbf M(\alpha)\|F^2}{\text{噪声(§7.1)}} MSE(α)=偏置2 K1k∑∥qk−M(α)gk∥2+噪声(§7.1) σ2∥M(α)∥F2
这是 α \alpha α 的二次函数,有闭式最优解。仿真结果(24 块色卡,§7.5 的代码):
| σ \sigma σ | 最优 α \alpha α | RMSE@ α ∗ \alpha^* α∗ | RMSE@ α = 1 \alpha=1 α=1(标准 CCM) | 改善 | ∣ M ( α ∗ ) ∣ F |\mathbf M(\alpha^*)|_F ∣M(α∗)∣F |
|---|---|---|---|---|---|
| 0.00 | 1.000 | 0.0010 | 0.0010 | 0.0% | 2.910 |
| 0.02 | 0.991 | 0.0581 | 0.0582 | 0.2% | 2.898 |
| 0.04 | 0.964 | 0.1155 | 0.1164 | 0.8% | 2.864 |
| 0.08 | 0.862 | 0.2256 | 0.2328 | 3.1% | 2.735 |
| 0.15 | 0.587 | 0.3952 | 0.4365 | 9.5% | 2.397 |
行为完全符合预期 :低噪时 α → 1 \alpha\to1 α→1(用满 CCM),高噪时显著退让。
💡 这其实就是很多 ISP 已经在做的"CCM 强度随 ISO 衰减" ------但通常是手工调表 。本文的框架给了它一个可计算的最优值 :只要知道该 ISO 档的 σ \sigma σ(ISP 本来就有噪声模型), α ∗ \alpha^* α∗ 就能算出来,不用拍片试。
这比直接实现 TCC 更务实:无需 3×10 硬件,无需改 RTL,收益在高噪档反而更大(9.5%)。
7.3 式 (10) 可以简化
论文的式 (10) 用向量化形式解 3 N × 3 N 3N\times3N 3N×3N(二阶 PCC 为 30×30)的系统。但式 (7) 的两项按 M \mathbf M M 的行可分离:
∥ Q t − M P t ∥ F 2 = ∑ i = 1 3 ∥ q i − m i P t ∥ 2 , ∥ W ∘ M ∥ F 2 = ∑ i = 1 3 ∥ w i ∘ m i ∥ 2 \|\mathbf Q_t-\mathbf M\mathbf P_t\|F^2=\sum{i=1}^{3}\|\mathbf q_i-\mathbf m_i\mathbf P_t\|^2,\qquad \|\mathbf W\circ\mathbf M\|F^2=\sum{i=1}^3\|\mathbf w_i\circ\mathbf m_i\|^2 ∥Qt−MPt∥F2=i=1∑3∥qi−miPt∥2,∥W∘M∥F2=i=1∑3∥wi∘mi∥2
逐行求导得
m i = q i P t T ( P t P t T + 1 λ d i a g ( w i 2 ) ) − 1 \mathbf m_i=\mathbf q_i\mathbf P_t^{\mathsf T}\Bigl(\mathbf P_t\mathbf P_t^{\mathsf T}+\tfrac1\lambda\mathrm{diag}(\mathbf w_i^2)\Bigr)^{-1} mi=qiPtT(PtPtT+λ1diag(wi2))−1
而 W \mathbf W W 的三行完全相同 ,所以三行共用同一个逆矩阵------只需一次 N × N N\times N N×N(10×10)求逆 。相比 30×30 的系统,计算量约为 1 / 27 1/27 1/27。扫 λ \lambda λ 时这个差别很实在。
7.4 与 RPCC 结合为什么难
论文的局限 2 说得很直白:TCC 继承了 PCC 的曝光依赖与色相畸变。很自然的想法是把 TCC 的正则项用在 RPCC 的基上------这样同时拿到曝光不变性与噪声可控。
正则项这一侧没问题 :RPCC 的项也可以分成"线性项 + 高阶根项",同样的二值 W \mathbf W W 直接可用。
但 MSE 模型这一侧做不了 :模型需要 E p X p Y E\\sqrt{p_Xp_Y} EpXpY 与 C o v \mathrm{Cov} Cov。而含噪乘积的平方根没有闭式矩 ------ ( g X + n X ) ( g Y + n Y ) \sqrt{(g_X+n_X)(g_Y+n_Y)} (gX+nX)(gY+nY) 的期望不是初等函数,而且当 g → 0 g\to0 g→0 时展开发散(这恰好也是 RPCC 自身的暗部不稳定区,见 RPCC 文档 §10.3)。
可行的折中(研究方向,非论文内容):
- 用 delta method / 二阶泰勒展开近似矩------这正是 Burns & Berns (1997) 22 的路子,论文自己引了但没用;
- 对 λ \lambda λ 用交叉验证代替解析选择------放弃闭式,但框架仍可用;
- 蒙特卡洛 估计 μ p , Σ p \boldsymbol\mu_p,\boldsymbol\Sigma_p μp,Σp------离线标定阶段算一次,成本可接受。
📌 对 ISP 落地而言,方案 3 最现实 :标定是离线的,跑几千次采样估协方差完全可以接受,之后扫 λ \lambda λ 仍是闭式。
7.5 参考实现
python
import numpy as np
from itertools import combinations
# ---------- 二阶 PCC 的输入向量与权重 ----------
def pcc_expand(rgb):
"""rgb: (K,H) -> (K,N) 输入向量 [1, 线性项, 交叉项, 平方项]"""
rgb = np.asarray(rgb, dtype=np.float64)
K, H = rgb.shape
cols = [np.ones(K)]
cols += [rgb[:, i] for i in range(H)] # 线性
cols += [rgb[:, i] * rgb[:, j] for i, j in combinations(range(H), 2)] # 交叉
cols += [rgb[:, i] ** 2 for i in range(H)] # 平方
return np.column_stack(cols)
def pcc_weight(H):
"""论文式(8)/(24): 前 1+H 列(偏置+线性)为 0,其余为 1"""
N = 1 + H + H * (H - 1) // 2 + H
w = np.ones(N)
w[: 1 + H] = 0.0
return w
# ---------- TCC 矩阵 (论文式 7,按行可分离求解,见 §7.3) ----------
def tcc_matrix(P, Q, lam, w):
"""
P : (K,N) 输入向量矩阵 Q : (K,3) 目标色
lam : 调节参数 (lam->0 即 LCC, lam->inf 即 PCC)
返回 M : (3,N)
"""
N = P.shape[1]
D = np.diag(w ** 2)
reg = (np.inf if lam == 0 else 1.0 / lam)
A = P.T @ P + (1e18 if np.isinf(reg) else reg) * D # lam=0 用大数近似
return np.linalg.solve(A, P.T @ Q).T
# ---------- MSE 模型 (论文式 13/15/19) ----------
def pcc_mu_sigma(g, sig2):
"""
论文式(15)(19)(20)(21) 的通用实现。
g : (H,) 无噪潜在响应 sig2 : (H,) 各通道噪声方差
返回 mu (N,) 与 Sigma_tilde (N-1,N-1) ------ 后者已去掉偏置项所在行列
"""
g = np.asarray(g, float); sig2 = np.asarray(sig2, float); H = len(g)
pairs = list(combinations(range(H), 2))
# --- 期望向量: 只有平方项被噪声抬高 sigma^2 (式 15) ---
mu = np.concatenate([[1.0], g,
[g[i] * g[j] for i, j in pairs],
g ** 2 + sig2])
# --- 变量索引表: ('L',i) 线性, ('C',(i,j)) 交叉, ('S',i) 平方 ---
idx = [('L', i) for i in range(H)] + [('C', p) for p in pairs] + [('S', i) for i in range(H)]
n = len(idx)
S = np.zeros((n, n))
def ch(t): # 该项涉及的通道集合
return {t[1]} if t[0] in 'LS' else set(t[1])
for a in range(n):
for b in range(a, n):
ta, tb = idx[a], idx[b]
shared = ch(ta) & ch(tb)
v = 0.0
if a == b: # --- 方差 ---
if ta[0] == 'L': v = sig2[ta[1]]
elif ta[0] == 'C':
i, j = ta[1]; v = g[i]**2*sig2[j] + g[j]**2*sig2[i] + sig2[i]*sig2[j]
else: i = ta[1]; v = 4*g[i]**2*sig2[i] + 2*sig2[i]**2
elif shared: # --- 协方差(仅共享通道) ---
k = {'LL': 0, 'SS': 0}.get(ta[0] + tb[0], None)
key = ''.join(sorted(ta[0] + tb[0]))
if key == 'LL' or key == 'SS':
v = 0.0 # C(pX,pY)=0, C(pX²,pY²)=0
elif key == 'CL': # C(pX, pXY) = gY σX²
lin = ta if ta[0] == 'L' else tb
cr = tb if ta[0] == 'L' else ta
X = lin[1]; Y = [c for c in cr[1] if c != X][0]
v = g[Y] * sig2[X]
elif key == 'LS': # C(pX, pX²) = 2 gX σX²
X = list(shared)[0]; v = 2 * g[X] * sig2[X]
elif key == 'CC': # C(pXY,pXZ) = gY gZ σX²
X = list(shared)[0]
Y = [c for c in ta[1] if c != X][0]; Z = [c for c in tb[1] if c != X][0]
v = g[Y] * g[Z] * sig2[X]
elif key == 'CS': # C(pXY,pX²) = 2 gX gY σX²
sq = ta if ta[0] == 'S' else tb
cr = tb if ta[0] == 'S' else ta
X = sq[1]; Y = [c for c in cr[1] if c != X][0]
v = 2 * g[X] * g[Y] * sig2[X]
S[a, b] = S[b, a] = v
return mu, S
def tcc_select_lambda(P, Q, G, sig2, w, lams=None):
"""论文式(11): 扫 lambda,返回使 sum_k MSE_k 最小的那个"""
lams = np.logspace(-4, 9, 60) if lams is None else lams
mus, Sigs = zip(*[pcc_mu_sigma(g, sig2) for g in G])
best = (np.inf, None, None)
for lam in lams:
M = tcc_matrix(P, Q, lam, w)
Mt = M[:, 1:] # 去掉偏置列 (式 16)
tot = sum(np.sum((q - M @ mu) ** 2) + np.trace(Mt @ S @ Mt.T)
for q, mu, S in zip(Q, mus, Sigs))
if tot < best[0]:
best = (tot, lam, M)
return best[1], best[2]
# ---------- §7.1: CCM 噪声增益 ----------
def ccm_noise_gain(M3x3):
"""白噪声下 3x3 CCM 的相对噪声增益 = ||M||_F / sqrt(3)"""
return np.linalg.norm(M3x3) / np.sqrt(3)
# ---------- §7.2: 3x3 CCM 按噪声向单位阵收缩 ----------
def optimal_shrinkage(M_lcc, g, q, sigma):
"""返回使 MSE 最小的 alpha,M(a) = (1-a)I + a*M_lcc"""
al = np.linspace(0, 1, 2001)
f = lambda a: (np.mean(np.sum((q - g @ ((1-a)*np.eye(3) + a*M_lcc).T)**2, axis=1))
+ sigma**2 * np.sum(((1-a)*np.eye(3) + a*M_lcc)**2))
return al[int(np.argmin([f(a) for a in al]))]
if __name__ == "__main__":
rng = np.random.default_rng(0)
H, K = 3, 24
g = rng.uniform(0.05, 0.95, (K, H))
M_true = np.array([[1.75, -.62, -.13], [-.28, 1.55, -.27], [.06, -.52, 1.46]])
# 真实映射刻意含 PCC 张不出的非线性(幂次扭曲),迫使高阶项取大系数------
# 否则若真值恰好落在 PCC 张成的空间内,PCC 偏置≈0,看不到权衡。
q = (g ** 1.35) @ M_true.T * 0.9 + \
0.25 * np.sqrt(g) @ np.array([[.15, .05, .02], [.05, .15, .05], [.02, .05, .15]])
P, w = pcc_expand(g), pcc_weight(H)
print("N =", P.shape[1], " W =", w.astype(int))
# 1) 式(9) 的两个极限
M_lo, M_hi = tcc_matrix(P, q, 1e-12, w), tcc_matrix(P, q, 1e12, w)
M_lcc = np.linalg.lstsq(P[:, :1+H], q, rcond=None)[0].T
M_pcc = np.linalg.lstsq(P, q, rcond=None)[0].T
print(f"lam->0 : 高阶项系数最大绝对值 = {np.abs(M_lo[:, 1+H:]).max():.2e} (应 ->0)")
print(f" 与 LCC 的偏差 = {np.abs(M_lo[:, :1+H] - M_lcc).max():.2e}")
print(f"lam->inf: 与 PCC 的偏差 = {np.abs(M_hi - M_pcc).max():.2e}")
# 2) §7.1 噪声增益恒等式
s = 4.0
print(f"\ntr[MΣM^T] = {np.trace(M_true @ (s**2*np.eye(3)) @ M_true.T):.4f} ,"
f" σ²||M||_F² = {s**2*np.sum(M_true**2):.4f}")
print(f"典型 CCM 相对噪声增益 = {ccm_noise_gain(M_true):.3f} 倍")
# 3) 不同噪声下自动选 lambda,观察 TCC 在 LCC/PCC 之间滑动
hi_pcc = np.linalg.norm(M_pcc[:, 1+H:])
print(f"\nLCC 残差 = {np.sqrt(np.mean((q - P[:, :1+H] @ M_lcc.T)**2)):.5f}"
f" PCC 残差 = {np.sqrt(np.mean((q - P @ M_pcc.T)**2)):.5f}")
print(" σ 最优λ 高阶项范数 (λ小=偏LCC, λ大=偏PCC)")
for sg in [0.0, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1]:
lam, M = tcc_select_lambda(P, q, g, np.full(H, sg**2), w)
hi = np.linalg.norm(M[:, 1+H:])
tag = "≈PCC" if hi > .9*hi_pcc else ("≈LCC" if hi < .1*hi_pcc else "<<中间>>")
print(f" {sg:5.3f} {lam:9.2e} {hi:7.4f} {tag}")
# 4) §7.2 收缩
M_lcc3 = M_lcc[:, 1:] # 去掉偏置列,取 3x3 部分
print("\n σ 最优α (3x3 CCM 向单位阵收缩)")
for sg in [0.0, 0.02, 0.04, 0.08, 0.15]:
print(f" {sg:4.2f} {optimal_shrinkage(M_lcc3, g, q, sg):.3f}")
8. 【工程补充】批判性分析
8.1 λ \lambda λ 不是尺度不变的
惩罚项 ∥ W ∘ M ∥ F 2 \|\mathbf W\circ\mathbf M\|_F^2 ∥W∘M∥F2 作用在系数的原始数值 上。但高阶项与线性项的量纲不同 :若 p ∈ 0 , 1 p\in0,1 p∈0,1 则 p 2 ≤ p p^2\le p p2≤p,若 p ∈ 0 , 255 p\in0,255 p∈0,255 则 p 2 ≫ p p^2\gg p p2≫p。因此同一个 λ \lambda λ 在不同的 RGB 归一化约定下含义完全不同 , λ \lambda λ 的量级可能相差 10 4 10^4 104 以上。
论文全文没有说明输入 RGB 的归一化范围。
✅ 但这个问题是自愈的 :因为 λ \lambda λ 由 MSE 模型自动选取,不是人工设的。只要不跨工程硬编码 λ \lambda λ 值,就不会出问题。 复现时注意不要照搬图 3 横轴的 λ \lambda λ 范围( 10 − 3 ∼ 10 9 10^{-3}\sim10^{9} 10−3∼109 这个跨度本身就暗示了尺度问题)。
8.2 推广到泊松噪声比论文暗示的更难
论文局限 3 说"假设信号无关高斯噪声,真实噪声更接近泊松"。看起来只要把 σ 2 \sigma^2 σ2 换成信号相关的 σ 2 ( g ) = a g + b \sigma^2(g)=ag+b σ2(g)=ag+b 就行------但不止于此。
式 (19) 中 V ( p X 2 ) = 4 g X 2 σ X 2 + 2 σ X 4 V(p_{X^2})=4g_X^2\sigma_X^2+2\sigma_X^4 V(pX2)=4gX2σX2+2σX4 用到了
V ( n 2 ) = E n 4 − ( E n 2 ) 2 = 3 σ 4 − σ 4 = 2 σ 4 V(n^2)=En\^4-\bigl(En\^2\bigr)^2=3\sigma^4-\sigma^4=2\sigma^4 V(n2)=En4−(En2)2=3σ4−σ4=2σ4
3 σ 4 3\sigma^4 3σ4 是高斯的四阶矩 。对泊松分布(均值 Λ \Lambda Λ),中心矩为 μ 2 = Λ \mu_2=\Lambda μ2=Λ、 μ 4 = Λ + 3 Λ 2 \mu_4=\Lambda+3\Lambda^2 μ4=Λ+3Λ2,于是
V ( n 2 ) = μ 4 − μ 2 2 = Λ + 3 Λ 2 − Λ 2 = Λ + 2 Λ 2 V(n^2)=\mu_4-\mu_2^2=\Lambda+3\Lambda^2-\Lambda^2=\Lambda+2\Lambda^2 V(n2)=μ4−μ22=Λ+3Λ2−Λ2=Λ+2Λ2
多出一个 Λ \Lambda Λ 的线性项。 所以扩展到泊松噪声需要重做涉及四阶矩的全部推导 (平方项的方差、以及若干协方差),不是简单替换。论文把它列为局限是诚实的,但"精度与复杂度的权衡"这个措辞低估了工作量。
8.3 优化均值准则伤害尾部
§6.3 已给出证据:D65 下 TCC 的 max RMSE 全面劣于 PCC/RPCC。根源是式 (11) 最小化 ∑ k M S E k \sum_k \mathrm{MSE}_k ∑kMSEk。
可行的改法 (非论文内容):把式 (11) 换成加权和 或软最大:
λ ^ = arg min λ ∑ k v k M S E k ( λ ) 或 arg min λ s o f t m a x k ( M S E k ( λ ) ) \hat\lambda=\arg\min_\lambda\sum_k v_k\,\mathrm{MSE}k(\lambda)\quad\text{或}\quad \arg\min\lambda\ \mathrm{softmax}_k\bigl(\mathrm{MSE}_k(\lambda)\bigr) λ^=argλmink∑vkMSEk(λ)或argλmin softmaxk(MSEk(λ))
由于 MSE 模型是解析的、而 λ \lambda λ 只是一维扫描,改准则几乎零成本。给中性色/肤色加权(和 WPPLS 文档 §8.2 的软约束思路一致)也可以直接用。
8.4 本文的 LCC 既不保白点也不曝光不变
本文的 LCC 是 1 , p R , p G , p B 1, p_R, p_G, p_B 1,pR,pG,pB 的 3×4 形式------含偏置项。这意味着:
- 不满足行和为 1 (WPPLS 文档 §6.1 的 ISP 标准约束),灰阶不保证保持;
- 不是 1 次齐次 (RPCC 文档 §7.2), M ( k p ) ≠ k M p \mathbf M(k\mathbf p)\ne k\mathbf M\mathbf p M(kp)=kMp,连 LCC 自己都失去了曝光不变性。
论文全文未讨论偏置项的这些副作用。在 ISP 中加偏置项是危险的:它等价于给输出加一个与输入无关的常数偏移,会直接破坏黑电平。
📌 复现到 ISP 时应去掉偏置项 。去掉后式 (7)~(13) 的所有推导依然成立(只是 N N N 从 10 变成 9, μ , Σ \boldsymbol\mu,\boldsymbol\Sigma μ,Σ 相应去掉第一行列------论文式 (16) 本来就是这么处理协方差的)。
8.5 其他
- 需要 3×10 的硬件。若你的 ISP 只有 3×3 CCM,TCC 无从实现------此时用 §7.2 的收缩法;
- MSE 在哪个 sRGB 空间度量? 论文说"用 XYZ-to-sRGB 变换矩阵 "转到 sRGB,措辞暗示只做了线性变换、没加 sRGB Gamma 。若如此,MSE 在线性光 域度量,会严重偏向高光而忽视暗部------而暗部恰恰是噪声最成问题的地方。这一点论文没有澄清,复现时需确认;
- 需要逐图像盲估计噪声 (§5.2 用 Liu et al. 2013)。在 ISP 里这反而更简单:当前模拟增益/ISO 直接对应噪声模型,不必盲估;
- 增益与代价不成比例 :0.5%~3% 的 RMSE 改善,换 3×10 矩阵 + 逐帧 λ \lambda λ 选择的复杂度,单看这个收益不值。真正的价值是"自动化了 LCC/PCC 的选型决策"。
9. 论文小结与评价
9.1 贡献
- 把 CCM 的噪声问题从 LCC 推进到 PCC ,并且是闭式而非泰勒近似------填上了 RPCC 论文 明确承认的空白;
- TCC 正则项设计简洁有效 :二值 W \mathbf W W 只惩罚高阶项,使 λ \lambda λ 成为 LCC↔PCC 的连续旋钮,两个极限严格成立(式 9);
- 推导出二阶 PCC 输入向量在高斯噪声下的 μ p \boldsymbol\mu_p μp 与 Σ p \boldsymbol\Sigma_p Σp 闭式 (式 15、19),附录完整且经我逐项核验无误 。这是论文最扎实的部分,即使不用 TCC,这套矩也可以单独用来评估任何 PCC 的噪声增益;
- 揭示了"只有平方项被噪声抬高 σ 2 \sigma^2 σ2"(式 15)与**"只有共享通道的项之间才有协方差"**(式 19)两条清晰规律;
- 自然推广到多光谱 ,并用 RGB-NIR 给出了很有说服力的实证------波段增多时 PCC 的崩溃( σ = 10 \sigma=10 σ=10 时 max RMSE 194.76 vs LCC 132.04);
- 对比充分 :7 种对照方法(含 RPCC、HPPCC、HoCC、AMCC、MICC),3 种光源 × 6 种噪声 × 3 种统计量,且获胜计数报告诚实(§6.3 复算一致);
- 第 2 节的文献地图质量很高,把回归类 CCM 方法梳理得很清楚。
9.2 局限性
论文自列的四条(§5.4):无法在 LAB 空间优化;继承 PCC 的曝光依赖与色相畸变;高斯噪声假设;未考虑 CFA 马赛克。
本文档补充的:
- 🟠 增益很小(§6.1):相对 LCC/PCC 中较优者仅 0.5%~1.95%,且中等噪声下 MSE 的 85%~91% 本来就是噪声项(§6.2),留给优化的空间有限;
- 🟠 优化均值准则伤害尾部 (§6.3):D65 下 TCC 的 max RMSE 在 σ ≥ 2 \sigma\ge2 σ≥2 时每一档都劣于 PCC,一次都没赢过。按 RPCC 那篇强调的"看 95 百分位"标准,这是倒退。论文给出了计数但未讨论这个模式;
- 🟠 泊松扩展比暗示的更难 (§8.2):涉及四阶矩,不是替换 σ 2 ( g ) \sigma^2(g) σ2(g) 就行;
- 🟡 含偏置项的 LCC/PCC 破坏了白点保持与曝光不变性(§8.4),且论文未讨论------与本目录另外两篇论文的核心关切直接冲突;
- 🟡 λ \lambda λ 不是尺度不变的(§8.1),论文未说明 RGB 归一化范围;
- 🟡 MSE 度量空间可能是线性 sRGB(§8.5),若如此则严重偏向高光、忽视噪声最严重的暗部;
- 🟡 式 (10) 的求解形式不必要地复杂 (§7.3),可降到 1 / 27 1/27 1/27 的计算量。
9.3 实用价值评分
| 维度 | 评价 |
|---|---|
| 问题识别 | ⭐⭐⭐⭐⭐ 噪声放大是 CCM 最实际的痛点,且是前序工作公认的空白 |
| 方法新颖性 | ⭐⭐⭐ 正则项本身是标准岭回归;真正新的是解析的 λ \lambda λ 选择规则 |
| 理论完备性 | ⭐⭐⭐⭐ 推导扎实、附录完整、已逐项核验;但限于高斯噪声 |
| 实验充分性 | ⭐⭐⭐⭐ 对照方法多、训练/测试分离、盲噪声估计、多光谱推广 |
| 结论可靠性 | ⭐⭐⭐⭐⭐ 报告诚实,获胜计数准确,主动列出四条局限 |
| 工程可用性 | ⭐⭐⭐ 直接实现 TCC 需 3×10 硬件、收益偏小;但框架的衍生品(§7.1、§7.2)价值很高 |
| 启发性 | ⭐⭐⭐⭐⭐ 把 CCM 设计重新表述为偏置--方差权衡------这个视角比方法本身更有价值 |
9.4 一句话评价
TCC 这个方法本身我不会直接实现(3×10 硬件换 1% RMSE 不划算),但它把 CCM 从"色彩精度问题"重新表述成"偏置--方差权衡问题"这个视角,是这四篇里最有迁移价值的。
真正该带走的是两个衍生品:CCM 噪声增益 = ∥ M ∥ F / 3 \|\mathbf M\|_F/\sqrt3 ∥M∥F/3 (§7.1,一行代码的健康检查),和按噪声水平收缩 CCM 的最优强度(§7.2,把常见的"CCM 强度随 ISO 衰减"从手工调表变成可计算)。
10. 四篇 CCM 论文对照
| WPPLS (1997) | 本文 TCC (2020) | RPCC (2015) | 自适应白平衡标定 (2005) | |
|---|---|---|---|---|
| 解决的问题 | LS 不保证白点准 | 噪声放大 vs 色彩精度 | PCC 不曝光不变 | 每个白平衡档都要重标定 |
| 核心手段 | 加等式约束 | 加正则项 + 解析选 λ \lambda λ | 改造基函数(1 次齐次) | 分解 + 重组(右乘对角阵) |
| 注入的先验 | 白是特殊的 | 噪声统计已知 | 曝光缩放不改变颜色 | 换白平衡只改通道增益 |
| 先验是否成立 | ✅ 严格 | ⚠️ 高斯假设近似 | ✅ 严格 | ⚠️ 只是近似 |
| 代价 | 残差略增(可忽略) | 需 3×10 硬件 + 噪声估计 | 噪声放大、需开方 | 明度误差显著增加 |
| 典型增益 | 最大无知下 −45% | 0.5%~3% | 变曝光下 PCC 57→RPCC 3.5 | 负 |
| 对 ISP 的价值 | ⭐⭐⭐⭐⭐ 已是行业默认 | ⭐⭐⭐ 衍生工具 > 方法本身 | ⭐⭐⭐ 特定场景 | ⭐⭐ 主要作为反例 |
四篇连起来的方法论线索:
- WPPLS :纯数值优化会给出物理上不合理的解 → 把物理约束写成等式约束;
- RPCC :纯数值拟合会破坏物理不变性 → 把不变性写进基函数结构;
- 本文 TCC :纯数值拟合假设了输入无噪,而使用时有噪 → 把噪声统计写进目标函数;
- 自适应白平衡标定 :试图用物理先验替代测量 → 先验只是近似,代价直接变误差。
💡 前三篇的共性 :都在修正"标定条件 ≠ 使用条件"这个根本错配。
- WPPLS:标定用某个色卡,使用时遇到别的颜色 → 约束白点来保证泛化;
- RPCC:标定在某个曝光,使用时曝光在变 → 让模型对曝光不变;
- TCC:标定时假设无噪,使用时有噪 → 把噪声建进模型。
这三条是同一个诊断的三个面向,TCC 是其中最直接命中 ISP 实际痛点的那一个------因为真实相机永远有噪声,而标定永远是在低噪条件下做的。
11. 术语表
| 缩写 / 术语 | 全称 | 中文 |
|---|---|---|
| TCC | Tunable Color Correction | 可调颜色校正 |
| LCC | Linear Color Correction | 线性颜色校正 |
| PCC | Polynomial Color Correction | 多项式颜色校正(本文均指二阶) |
| RPCC | Root-Polynomial Color Correction | 根多项式颜色校正 |
| HPPCC | Hue Plane Preserving CC | 色相平面保持颜色校正 |
| HoCC | Homography Color Correction | 单应性颜色校正(Finlayson et al. 2019) |
| AMCC | Angular Minimization CC | 角度最小化颜色校正(Funt & Bastani 2014) |
| MICC | Maximum Ignorance CC | 最大无知颜色校正(Finlayson & Drew 1996) |
| MSE / RMSE | Mean Squared Error | 均方误差 / 其方根 |
| 偏置--方差分解 | bias--variance decomposition | MSE = 偏置² + 方差 |
| W \mathbf W W | binary weighting matrix | 二值加权矩阵(只惩罚高阶项) |
| λ \lambda λ | tuning parameter | 调节参数(注意是正则强度的倒数) |
| μ p \boldsymbol\mu_p μp / Σ p \boldsymbol\Sigma_p Σp | --- | 含噪输入向量的期望 / 协方差矩阵 |
| ∣ ⋅ ∣ F |\cdot|_F ∣⋅∣F | Frobenius norm | F 范数(§7.1:等于 CCM 的噪声增益) |
| RGB-NIR | --- | RGB + 近红外四波段传感器 |
| 泊松--高斯噪声 | Poisson--Gaussian noise | 真实传感器噪声模型(Foi et al. 2008) |
12. 参考文献(源论文引用,节选与 ISP 强相关者)
与本目录已有文档直接相关的:
- 5 G. Hong, M.R. Luo, P.A. Rhodes. A study of digital camera colorimetric characterisation based on polynomial modelling. Color Res. Appl. 26(1):76--84, 2001. ← PCC 的标准参考 ,也是自适应白平衡标定文档"60+ 样本"门槛的出处
- 6 G.D. Finlayson, M. Mackiewicz, A. Hurlbert. Colour correction using root-polynomial regression. IEEE TIP 24(5):1460--1470, 2015. ← CCM_根多项式颜色校正.md
- 24 G.D. Finlayson, M.S. Drew. Constrained least-squares regression in color spaces. JEI 6(4):484--493, 1997. ← CCM_白点保持的颜色校正.md(期刊版)
- 36 G.D. Finlayson, M.S. Drew. The maximum ignorance assumption with positivity. CIC 1996, pp. 202--205. ← 实验中的 MICC
噪声分析主线(本文的直接前驱):
- 17 Y.P. Tan, T. Acharya. Method for color correction with noise consideration. SPIE 3963:329--337, 2000.
- 18 U. Barnhöfer et al. Color estimation error trade-offs. SPIE 5017:263--273, 2003. ← RPCC 文档 §6.1 的分曝光策略也引了这篇
- 19 S. Quan. Analytical approach to the optimal linear matrix with comprehensive error metric. SPIE 5292:243--253, 2004. ← 泊松噪声下的 LCC
- 20 S. Lim, A. Silverstein. Spatially varying color correction (SVCC) matrices for reduced noise. CIC 2004, pp. 76--81. ← 空间自适应 CCM,ISP 落地可参考
- 21 H.J. Trussell, M.J. Vrhel. Color estimation under Poisson noise. ICASSP 2013, pp. 1914--1918.
- 22 P.D. Burns, R.S. Berns. Error propagation analysis in color measurement and imaging. Color Res. Appl. 22(4):280--289, 1997. ← 唯一分析非线性变换噪声的前驱;§7.4 建议的泰勒近似路线出自此
工程化噪声处理:
- 47 L. Kharitonenko, S. Twelves, C. Weerasinghe. Suppression of noise amplification during colour correction. IEEE TCE 48(2):229--233, 2002.
- 50 K. Takahashi et al. Effective color correction pipeline for a noisy image. ICIP 2016, pp. 4002--4006.
- 51 A. Foi et al. Practical Poissonian--Gaussian noise modeling and fitting for single-image raw-data. IEEE TIP 17(10):1737--1754, 2008. ← 真实噪声建模的标准参考,补 §8.2 的缺口
- 59 X. Liu, M. Tanaka, M. Okutomi. Single-image noise level estimation for blind denoising. IEEE TIP 22(12):5226--5237, 2013. ← 本文所用的盲噪声估计
其他:
- 60 F. Fang et al. Colour correction toolbox. AIC 2017, pp. 13--18. ← 本文对照方法的公开实现,复现时可直接用
- 53 Y. Monno et al. Single-sensor RGB-NIR imaging. IEEE Sensors J. 19(2):497--507, 2019. ← 高光谱数据集与 RGB-NIR 灵敏度来源
- 54 J. Jiang et al. What is the space of spectral sensitivity functions for digital color cameras? WACV 2013. ← Olympus E-PL2 等相机光谱灵敏度数据库