[論文閱讀] 顏色遷移-Correlated Color Space
文章: Color transfer in correlated color space, [paper], [matlab code], [opencv code]
1-演算法原理
本文演算法比較簡單, 其原理是把原始影像本身的空間分佈進行歸一化, 然後透過旋轉平移縮放等變換, 變換到目標影像的空間分佈, 如下所示:
T表示平移, R表示旋轉, S表示縮放. 下標t表示目標影像, 下標s表示原始影像, 文中的原始公式存在問題, 我這裡進行了調整.
因而本文就是尋找這個變換矩陣, 使用的方法是使用SVD分解(關於SVD演算法, 可以戳這裡: 奇異值分解(SVD) - 知乎 (zhihu.com).)
具體地, 本文演算法步驟為:
- 計算影像每個顏色通道的均值, 及影像的協方差矩陣
- 對協方差矩陣進行SVD分解
- 構建變換需要的矩陣
- 使用公式對影像進行顏色遷移
2-演算法核心
對於n維顏色空間, 為了方便處理, 可以調整為n+1維的齊次座標標示. 對於本文, 使用的是RGB 3維顏色空間, 齊次座標維4維的.
對於上述幾個變換矩陣, 平移矩陣T很容易想到, 可以使用各顏色通道的均值來表示. 但對於旋轉矩陣R和縮放矩陣S就需要用到SVD分解矩陣的性質了: \(U\) 表示旋轉, \(\Lambda\) 表示縮放拉伸.
因而所需變換矩陣如下:
式中, ci表示顏色通道, \(s^{ci}=\sqrt{\lambda^{ci}}\). 這裡取了根號, 如果不取根號是不是也可以???
本文演算法是對3個通道一起處理, 如果每個通道單獨處理, 上述公式可以等效為:
式中, i表示通道.
3-演算法效果
如下所示為文中給出的一組結果:
4-補充說明
作者在自己給出的matlab程式碼中指出了本文演算法存在的一個問題, 我們先來看看實際的情況, 如下所示為一組影像的測試結果.
可以看到, 結果出現了異常. 作者給出的分析是:
- SVD生成的\(\Lambda\) 矩陣中對角線上的值, 是由特徵值從大到小排列的, 源影像和目標影像的這個排列可能不匹配
- 如源影像排列為c1, c2, c3, 目標影像排列為c2, c1, c3
- 即使排列相同, 它們的方向可能相反, 如目標影像排列為c1, -c2, c3
針對這個問題, 作者程式碼實現中給出瞭解決方案, 進行列匹配(matchColumns):
- 對旋轉矩陣\(U_t\) 的所有列進行排列組合, 與\(U_s\) 對應的列求點積和
- 找到和最大的一個組合為最優匹配
- 根據組合中座標軸的順序, 對\(\Lambda_t\) 的順序進行調整, 同時調整方向
下面是調整後的結果: