CCM-可调颜色校正与噪声权衡

可调颜色校正与噪声权衡(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

论文给了两条理由:

  1. 更高阶的 PCC 不一定给出更低的比色误差 ------训练样本与测试样本的统计差异会引起过拟合(引 Cheung et al. 2004、Bianco & Schettini 2014);
  2. 更高阶的 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

读表要点:

  1. 交叉点在 σ ≈ 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);
  2. TCC 在所有噪声水平都不差于两者------无噪时等于 PCC,高噪时趋近 LCC;
  3. ⚠️ 但增益不大 :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 论文自列的四条局限

  1. 只能在 XYZ/sRGB 空间优化 MSE,而非 LAB 。因为 XYZ→LAB 高度非线性,MSE 模型处理不了。作者试过线性化的 LAB 变换 (Barnhöfer et al.;Sharma & Trussell),但发现其近似误差对选取最优 λ \lambda λ 而言不可忽略;
  2. TCC 继承了 PCC 的全部缺点 ------辐照度依赖 (即曝光不变性缺失)与色相平面畸变 。"这无法避免,因为 TCC 本质上使用的就是 PCC 模型。"
  3. 假设信号无关高斯噪声,真实噪声更接近信号相关的泊松噪声。"噪声模型的精度与 MSE 计算模型的复杂度在 TCC 框架中可能是一个权衡。"
  4. 未考虑单传感器相机的 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)。

可行的折中(研究方向,非论文内容):

  1. 用 delta method / 二阶泰勒展开近似矩------这正是 Burns & Berns (1997) 22 的路子,论文自己引了但没用;
  2. 对 λ \lambda λ 用交叉验证代替解析选择------放弃闭式,但框架仍可用;
  3. 蒙特卡洛 估计 μ 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 贡献

  1. 把 CCM 的噪声问题从 LCC 推进到 PCC ,并且是闭式而非泰勒近似------填上了 RPCC 论文 明确承认的空白;
  2. TCC 正则项设计简洁有效 :二值 W \mathbf W W 只惩罚高阶项,使 λ \lambda λ 成为 LCC↔PCC 的连续旋钮,两个极限严格成立(式 9);
  3. 推导出二阶 PCC 输入向量在高斯噪声下的 μ p \boldsymbol\mu_p μp 与 Σ p \boldsymbol\Sigma_p Σp 闭式 (式 15、19),附录完整且经我逐项核验无误 。这是论文最扎实的部分,即使不用 TCC,这套矩也可以单独用来评估任何 PCC 的噪声增益;
  4. 揭示了"只有平方项被噪声抬高 σ 2 \sigma^2 σ2"(式 15)与**"只有共享通道的项之间才有协方差"**(式 19)两条清晰规律;
  5. 自然推广到多光谱 ,并用 RGB-NIR 给出了很有说服力的实证------波段增多时 PCC 的崩溃( σ = 10 \sigma=10 σ=10 时 max RMSE 194.76 vs LCC 132.04);
  6. 对比充分 :7 种对照方法(含 RPCC、HPPCC、HoCC、AMCC、MICC),3 种光源 × 6 种噪声 × 3 种统计量,且获胜计数报告诚实(§6.3 复算一致);
  7. 第 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 的价值 ⭐⭐⭐⭐⭐ 已是行业默认 ⭐⭐⭐ 衍生工具 > 方法本身 ⭐⭐⭐ 特定场景 ⭐⭐ 主要作为反例

四篇连起来的方法论线索:

  1. WPPLS :纯数值优化会给出物理上不合理的解 → 把物理约束写成等式约束;
  2. RPCC :纯数值拟合会破坏物理不变性 → 把不变性写进基函数结构;
  3. 本文 TCC :纯数值拟合假设了输入无噪,而使用时有噪 → 把噪声统计写进目标函数;
  4. 自适应白平衡标定 :试图用物理先验替代测量 → 先验只是近似,代价直接变误差。

💡 前三篇的共性 :都在修正"标定条件 ≠ 使用条件"这个根本错配。

  • 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 等相机光谱灵敏度数据库
相关推荐
在所不辞兄1 小时前
选择隐式方法求解刚性ODE
算法
码爸1 小时前
贪心算法介绍与示例
算法·贪心算法
-dzk-2 小时前
【多维动态规划】LC 64.最小路径和
算法·动态规划
垆边人似月.3 小时前
华为机试题 :字符串压缩
算法·华为
ggb喔3 小时前
52pojie 的图片工具:为什么无损转换后体积涨了 6 倍、照片方向还是歪的
图像处理·python·算法·计算机视觉·图形渲染·媒体
菜鸟~noob2333 小时前
【电子战】第25篇:自由空间、双射线与菲涅尔区【含matlab代码】
开发语言·算法·matlab
地平线开发者3 小时前
地平线征程6M YOLOv8s 部署
算法·自动驾驶
Run_Teenage3 小时前
算法:Manacher(马拉车)算法、中心扩展算法
算法
Tisfy4 小时前
LeetCode 0301.删除无效的括号:二进制枚举 / 回溯
算法·leetcode·字符串·题解·回溯·括号匹配·二进制枚举