論文引用
Shared Sampling for Real-Time Alpha Matting. Eduardo S. L. Gastal and Manuel M. Oliveira, Computer Graphics Forum. Volume 29 (2010), Number 2. Proceedings of Eurographics 2010, pp. 575-584.
1. 序言
這篇論文的入門學習是通過這篇博客: 圖像摳圖算法學習 - Shared Sampling for Real-Time Alpha Matting, 熟悉了其中的大致原理之後纔到原文中深入研究, 同時在這篇博客中也引用了文中的一些效果圖. 感謝 Imageshop 大神的博客專欄: https://www.cnblogs.com/Imageshop, 在這裏學到了很多, 希望跟隨大神的腳步不斷成長.
關於這篇論文, 有一個專門的主頁: http://www.inf.ufrgs.br/~eslgastal/SharedMatting/, 其中包含了論文 pdf 下載和論文中使用的數據集的下載, github 中有實現代碼: https://github.com/np-csu/AlphaMatting.
論文的題目中最大的亮點是實時性, 但是文中也重點說明實時性的前提條件是: 必須依賴於 GPU 的並行編程優化.
另外一個限制是針對算法本身的. 在總結部分會提到.
2. 算法細節
接下來根據論文的算法流程依次描述.
總的來說, 這篇文章還是屬於 Alpha Matting 的範疇. 因此這篇文章要解決的問題依然是 Alpha Matting 的經典方程:
式中: 是我們觀察到的圖像的顏色, 式子右側的左右變量: 均是未知量, 分別表示 未知區域 的透明度, 前景及背景.
鑑於未知量數目過多, 必須增加一些附加的約束才能求解這個方程. 常用的約束是是:
(1) 和源圖像大小相同的 TriMap 圖;
(2) 用戶手工畫出的草圖形式.
如下兩圖所示:
TriMap 圖像的像素值只有三個, 即 0, 128, 255, 如未特別說明, 一般白色部分 (255) 表示前景, 黑色 (0) 表示背景, 灰色 (128) 表示待識別的部分.
TriMap 圖像作爲約束條件明確了屬於前景 () 和背景 () 區域, 求解方程就只針對那些未知區域的 值.
這裏明確一下, 求解方程最終會得到一個 matte 圖, 即提取前景所用的 mask 圖.
論文中提到, 在 2010 年前後解決 matting 問題的主要方法是基於 sampling, pixel affinities 或者兩者的結合 (sampling + pixel affinities), 特別是 pixel affinities 和兩者的結合( sampling + pixel affinities) 是主流的方式. local affinities 被用在求解或精修 matte 圖的場景下, 但是這兩種方法都需要求解一個大型的線性系統, 系統的大小和未知區域的像素點個數成正比, 因此對於 1MB 左右大小的圖, 求解時間在幾秒到幾分鐘不等. 因此, 限制了其在實際中的使用.
這篇論文提出的算法是基於 sampling 技術的, 充分利用 相鄰像素之間的相似性 和 算法內在的並行性, 結合 GPU 編程實現了實時的摳圖算法.
另外, 論文中反覆提到的一個前提: 在一個小的鄰域內的像素值的 值是相似的, 既然是相似的那就可以先確定該鄰域內的一組 值, 然後使用這個值計算鄰域內其他像素的 matte 值, 利用這種相似性可以大幅度降低算法的計算複雜度.
總的來說, 論文提出的算法可以分成 4 個步驟:
-
第一步: Expansion - 針對用戶的輸入, 對已知區域進行小規模的縮小, 即擴展對應的背景或前景區域;
-
第二步: Sample and Gather - 對剩餘的未知區域內的每個點按一定的規則取樣, 並選擇出最佳的一對前景和背景取樣點, 並計算 值;
-
第三步: Refinement - 在一定的鄰域範圍內, 使用 若干個最佳採樣點對的平均值來計算未知區域內的每個像素點的 值 ;
-
第四步: Local Smoothing - 對得到的前景和背景對以及透明度值進行局部平滑, 以減少噪音.
除非特別聲明, 否則本文提到的所有鄰域均在未知區域內.
2.1 Expansion
這一步的作用就是減少未知點的個數, 可能在一定程度上減小後期的計算量. 原理也很簡單:
對一個未知點 , 如果在其一定的鄰域半徑內 (文中推薦值 10 pixel, 並且是圓形半徑) 有已知的背景點或前景點 , 計算未知點 和 的顏色距離 (用 RGB 空間的歐氏距離度量, 表示爲: ) 滿足 (文中推薦 爲 5/256), 則把這個未知點 歸屬於 所在的區域 (前景或背景).
TODO: 在 github 提供的參考代碼中, 這一部分的編碼其實寫的還是很有特色的, 他的循環方式不同於我們普通的鄰域編碼, 他是從像素點逐漸向外部循環開來, 有點類似左圖的這種循環方式 (實際上還是有點區別的, 實際是上下兩行一起處理, 在左右兩列處理, 然後再向外層擴散) , 這種處理方式的明顯好處就是, 只要找到某個點顏色距離小於設定的值, 就可以停止循環了, 因爲這個點肯定是第一個符合顏色距離條件又同時符合物理距離最小的要求的.
我們最終的目的是: 對於未知區域的一個像素點, 找到一個 滿足方程(1). 論文中反覆提到的一個前提: 在一個小的鄰域內的像素值的 值是相似的, 利用這種相似性可以大幅度降低計算複雜度.
現在採用以下策略: (1) 將任務劃分爲不同的鄰域 - Sample Gathering, (2) 然後再共享並精修結果 - Sample Refinement.
2.2 Sample Gathering
這一步的作用是: 從每個未知區域的像素點 所在鄰域的採樣點集合對中選擇最優的一對採樣點, 所在鄰域的若干採樣點是通過下面的方式來保證這些採樣點對來自不相鄰的鄰域內.
這一步是算法的核心部分, 先看下圖:
在這個圖中, 和 點都處在未知區域, 我們需要通過一定的原則在已知區域爲其取得一定的採樣點, 論文中提出的採樣方法是:
設定一個參數 , 表示一個未知像素點最多可能取樣的前景點和背景點的個數, 因此取樣點可以組成的點對數目最多爲 對, 論文建議 值取 4 就可以取得很好的效果, 越大則程序越耗時.
這樣對於每個未知點, 從該點出發引出 條路徑, 每個路徑之間成 的夾角, 記錄下每條路徑經過的路線中首次遇到的前景或背景點, 直到超出圖像的邊緣.
爲了算法的穩定性, 每 3x3 的矩形區域內 (也可以是 4x4 或者 5x5, 當然會更耗時), 起始路徑的角度 (和水平線的夾角) 會週期性的改變, 這樣相鄰像素的 條路徑經過的區域的覆蓋面就比較豐富, 最終得到的採樣點對集合中的點也就有一定的差異性, 這樣的採樣點對集合更爲有效.
例如在上圖中, 點對應的 條路徑用紅色表示, 其最終得到的採樣點爲 1 個背景點, 2 個前景點; 點對應的 條路徑用藍色表示, 其最終得到的採樣點爲 1 個背景點, 3 個前景點.
由上圖可以看到, 在不少情況下, 未知點的前景和背景取樣數並不能達到 個, 甚至極端情況下, 找不到任何一個取樣點, 這樣該點就無法進行 的計算了, 這就要靠後面的過程了.
在取樣完成後, 需要找出這些取樣點集合中最佳的一個點對組合, 既然是最優化問題, 就需要一個目標函數. 在這篇論文中, 目標函數用了四個小函數 (考慮了空間距離, 光學和空間概率信息) 的乘積來計算.
從採樣結合中選擇一組前景點和背景點: , 其 color 分別爲: .
最小化色彩失真
準則 1: 最優的採樣點對應該使色彩失真最小化;
其中:
- 表示色彩失真程度;
- 是 的 color 值;
- 是 的不透明度的估計值, 可通過將 在顏色空間投影到 定義的直線上計算出來;
直觀的理解就是: 對於給定的採樣點對, 帶入公式 (1) 可以計算得到 , 就是衡量 點真實的 color 值 和 之間的誤差;
需要明白的是: 最優採樣點對可以計算得到小的 值, 但是小的 值並不是選擇最優採樣點對的充分條件.
基於上述原因, 文中提出了一種新的顏色度量方式.
(1) 對於小鄰域內的像素在顏色空間內很容易局部聚類, 特別是小鄰域內包含有邊緣部分時;
(2) 如果背景和前景的梯度範數 和 遠小於 , 那麼圖像的梯度 就和 成正比;
TODO: 上面的論述是爲了什麼?
最優採樣點對不僅可以使可以使 最小, 同時也可以使 所在的小鄰域內的所有像素的 最小. 因此有:
其中:
- 表示 的像素鄰域, 大小爲 3x3, 爲鄰域中心;
- 即 (公式 2) 的色彩失真;
公式 (2) 的道理很爲明顯, 用一對 F/B 算出的 α 值如果很合理的話, 那麼用 α 結合 F/B 重新計算出的顏色應該和原始顏色的差距很小. 公式 (3) 在表明在一定的鄰域內, 由於像素一般不會有突變, 差值的平均值也應該很小.
圖像空間統計信息
文中使用圖像空間統計信息來估計像素點 屬於前景的概率, 這個概率是爲了糾正之前得到的 值.
圖像空間定義爲: .
定義一個能量函數 , 表示從點 到一個前景或背景採樣點所需要的能量:
公式 (4) 的直觀理解是, 和 在向量 法線方向上的投影長度成正比. 因此, 如果 到 形成的路徑穿過了圖像中 值較大的區域 (如邊緣區域), 此時就需要更大的能量.
這時就可以估計像素點 屬於前景的概率:
公式 (5) 的直觀理解是: 如果到達前景採樣點所需的最小能量遠小於到達背景採樣點所需的能量, , 也就是說像素 屬於前景的概率非常大.
因此, 可以利用公式 (5) 得到的 中蘊含的空間統計信息來校正公式 (2) 中計算得到的 值. 因此, 最優的採樣點對應該使以下函數最小化:
對上述公式直觀的理解就是: 對於給定的採樣點對 $\mathbf f_i, \mathbf b_j) $,
- 當 時, , 因此, 最小化 $A_p(\mathbf f_i, \mathbf b_j) $ 的值其實就是最小化 ;
- 當 時, , 因此, 最小化 $A_p(\mathbf f_i, \mathbf b_j) $ 的值其實就是最大化 ;
- 當 時, , 此時 對 $A_p(\mathbf f_i, \mathbf b_j) $ 的最小化過程無影響;
目標函數
終於到了 主角一號(目標函數) 出場的時刻.
考慮在未知點到取樣的前景和背景點之間的直線路徑上, 應該儘量要少有像素的突變. 如果這條路徑需要經過圖像的邊緣區域, 則應該設計一個函數使得該函數的返回值較大, 於是作者使用公式(4), 這樣就避開了穿越邊界區域的採樣點, 比如圖 (2) 中的 點就具有這樣一個點.
考慮未知點和前景點之間的物理距離, 一個好的組合中的前景點應該要儘量靠近未知點;
考慮未知點和背景點之間的物理距離, 一個好的組合中的背景點也應該要儘量靠近未知點;
目標函數考慮了像素的空間距離特徵, 光學特徵和空間統計信息來選擇最優的採樣點對. 其形式如下:
其中:
- $ N_p(\mathbf f_i, \mathbf b_j)$ 在 3x3 鄰域內最小化色彩失真;
- $ A_p(\mathbf f_i, \mathbf b_j)$ 使用前景概率來校正 \hat{\alpha}_p$;
- $ D_p(\mathbf f_i)$ 和 $ D_p(\mathbf b_i)$ 在空間上保證採樣點對中的點儘可能的靠近點 ;
- 常數 是懲罰因子, 目的是放大最終的函數值最小化程度. 文中推薦取值 .
因此, 最優採樣點對通過最小化函數 得到:
假設我們已經得到了最優採樣點對: , 是在 gathering 階段求出的點 的顏色值. 可以計算 和 :
其中:
- 和 分別是以 爲中心的 5x5 鄰域; 因此 N = 25.
假設: 點鄰域內的顏色分佈符合單變量高斯分佈, 和 測量的是 點所在鄰域的局部 color 的方差,
爲方便理解, 我貼出計算α的部分代碼:
/**
* \brief: 通過當前點、前景點以及背景點的顏色值計算對應的 Alpha 值, 對應論文的公式 (12) .
*
* \param "BC、GC、RC"> 當前點的 BGR 顏色分量值.
* "BF、GF、RF"> 前景點的 BGR 顏色分量值.
* "BF、GF、RF"> 背景點的 BGR 顏色分量值.
*
* Alpha 會出現不在 [0,1] 區間的情況, 因此需要限制範圍.
*/
double CalcAlpha(int BC, int GC, int RC, int BF, int GF, int RF, int BB, int GB, int RB)
{
double fen = (double) ((BC - BB) * (BF - BB) + (GC - GB) * (GF - GB) + (RC - RB) * (RF - RB));
double den = ((BF - BB) * (BF - BB) + (GF - GB) * (GF - GB) + (RF - RB) * (RF - RB) + 0.0000001);
double Alpha = fen / den;
return min(1, max(0, Alpha));
}
2.3 Sample Refinement
初步的 gathering 處理後, 正如前文所說, 得到的結果還不夠細膩, 並且有些未知點由於採樣的過程未收集到有效的前景和背景數據, 造成該點無法進行處理, 因此, 在 Refinement 階段需要進一步解決這個問題.
這裏就到了 主角二號(shared sampling) 出場的時刻, 也就是論文標題中的 shared sampling, 即共享像素點 周圍鄰域內所有像素的最優採樣點對.
具體做法是: 計算像素點 鄰域內所有點的最優採樣點對, 每個像素點 都可以得到一組 使得其對應的 最小, 然後選擇使 最小的 組 , 使用這 組 (文中推薦值爲 5) 數據的平均值來計算 的 . 上述平均值操作可以抑制 matte 圖中的噪聲.
然後按照下面這些公式計算新的前景、背景、透明度及可信度, 即 .
其中:
- r 上標表示 refinement 階段;
關於 的直觀理解就是: 如果像素點 的顏色值 和平均顏色值 非常相似, 那麼 就使用像素點的顏色值, 否則繼續使用平均顏色值;
和 是類似的;
的物理意義是 在 向量方向上的投影長度, 即表示像素點 的不透明度;
表示像素點 的候選前景值和背景值 準確性的置信度; 如果候選前景值和背景值不能很好的表示 , 那麼對應的置信度值應該會變小(但是不會急劇變小). 文中 推薦取值爲 10. 特別地, 當前景值和背景值很相似時, 也就不能準確估計 的值, 因此將其設置爲一個很小的值 .
置信度的計算是爲下一步的局部平滑做準備的, 它反應了我們在這一步確定的取樣點是否合理程度的一個度量, 經由此步驟, 我們可得到的 matte 圖和合成圖如下所示:
可見在這一步得到的結果對於上圖來說已經相當完美了.
2.4 Local Smoothing
TODO.
3. 算法的效果
按照論文提供的相關資料集我自己蒐集的一些圖及配套的 Trimap 測試了該算法的一些結果, 現貼出如下所示:
4. 總結
另外一個限制是針對算法本身的. 因爲文中提出的算法是以一個假設爲前提展開的, 也就是假設未知區域的前景色和背景色可以通過分析其鄰域像素來顯式估計出來. 因此, 對於那些前景完全透明, 或前景色和背景色存在嚴重重疊的圖片就會出現問題.