paper(在相關文件裡提供了)是:
Combining Sketch and Tone for Pencil Drawing Production
這裡主要介紹一下paper提出的鉛筆素描畫生成算法步驟,其他諸如相關工作之類的就不介紹了。而且這裡我假設想了解該算法原理的小夥伴是掌握圖像處理基礎知識的。
先放算法框架,然後再慢慢說:
該基於圖像的鉛筆素描畫生成算法主要分為兩個步驟:
前者的目標為表示圖像場景的一般結構(主要是繪製一些線條),後者則更專注於圖像內物體的形狀和產生的陰影等內容。下面分別詳細地介紹一下這兩個步驟。
1.pencil stroke generation
這個步驟的目標主要是通過一些線條來表示圖像場景的一般結構(也就是輪廓圖)。首先假設我們有輸入灰度圖I,於是我們可以獲得圖像的梯度圖G:
但顯然計算圖像梯度是很容易受到噪聲幹擾的,因此這樣生成的圖像輪廓圖效果肯定不好。為了得到更加穩定的結果,作者首先對G進行8個方向的卷積(例如0,22.5,...,157.5):
每個方向的卷積核為沿著該方向的值為1,其他方向的值為0。當然,實際應用中,考慮抗鋸齒問題,卷積核可以通過雙線性插值得到(類似於指定角度的運動模糊處理)。同時,在論文中,作者根據經驗認為卷積核大小一般取原圖大小的1/30。
得到各個方向的卷積結果後,對每個像素點,我們都有8個卷積響應值,每個響應值對應一個方向。由此,我們可以得到每個方向的卷積響應圖,其定義為(註:原文中給的公式是錯的,顯然是筆誤了):
這裡p代表像素點,G為之前獲得的圖像梯度圖。對得到的每個方向的卷積響應圖再次進行方向卷積:
然後對得到的S'進行像素值反轉和映射到[0, 1]操作就可以得到最終的圖像輪廓圖S了。作者畫了個圖更加形象直觀地說明了上述處理過程:
以及與直接使用G來生成圖像輪廓圖的對比:
2.pencil tone drawing
OK,接下來我們來介紹該算法的第二部分,也就是色調渲染,該部分主要包括以下兩個步驟:
(1)直方圖匹配
作者通過對真實的鉛筆素描畫的觀察發現,鉛筆畫的色調可以由三部分組成,如下圖所示:
可以看出,陰影部分很適合用正態分布來擬合,中間調很適合用均勻分布來擬合,而高光部分則很適合用拉普拉斯分布來擬合。具體而言,對於高光部分,使用以下函數來模擬(因為作圖用的紙張一般是白色的,所以在接近色階255時分布曲線很陡峭。):
對於中間調,則使用以下函數來模擬:
對於陰影部分,則使用以下函數來模擬:
由此,我們可以得到最終的鉛筆畫色調概率分布公式:
即對高光,陰影和中間調進行加權求和(權重係數可以根據不同的需要進行調節)並利用歸一化因子Z以保證:
上述公式中,v均代表色調值,未知的參數均為控制參數,它們決定了鉛筆畫最終的色調直方圖。這些未知的參數可以使用最大似然估計來求得。具體而言,這些控制參數的計算公式為:
其中m和s分別代表各層(高光,中間調,陰影)像素值的均值和方差。接下來的工作就是對每層進行直方圖匹配(核心思想就是使輸出圖像具有規定的直方圖形狀。)並對他們進行重組。
假設該步驟最終輸出的圖像為J。
(2)紋理渲染
簡單而言,就是模擬人反覆用鉛筆描的過程(在人類繪圖時,一般會通過在相同位置重複繪製來實現紋理渲染)。作者使用筆畫的乘法來模擬這一過程,表示成公式是這樣的:
即使用H進行β次渲染來逼近J。顯然,β越大,圖像越黑:
同時我們要求β局部平滑,因此問題等價於求解:
作者取λ為0.2。因此上述方程可以轉換為標準的線性方程並使用共軛梯度求解。於是我們獲得最終的鉛筆畫紋理圖為:
補充一下,H其實就是一張預先選好的真實場景下的鉛筆畫紋理圖,代表繪畫模式,網上可以找到很多,例如:
3.Overall Framework
通過前面兩個步驟,我們分別獲得圖像輪廓圖S和色調紋理圖T。因此,我們可以獲得最終的結果圖R=S·T。由此,只要我們輸入灰度圖像I,便可以輕鬆地獲得鉛筆素描畫R了。
4.Color Pencil Drawing
該算法可以很輕鬆地擴展到彩色圖像上。具體而言,就是把彩色圖像從RGB空間轉到YUV空間,把Y單獨拿出來看作灰度圖像進行上述變換後獲得新的YUV空間,最後將新的YUV空間重新映射到RGB空間即可。