大概從20世紀90年代中期起,紋理合成引起了大家的關注。在計算機圖形學中,圖形表面的任何表現都可以作為紋理,包括幾何信息、材質信息、顏色信息等。
一般,認為紋理在視覺上具有重復的結構單元(紋元),並且伴隨着一定的隨機變化,即具有結構性和隨機性。所以可將紋理分成:結構性紋理、隨機性紋理和既有結構性又有隨機性紋理三類。根據這樣的特性,產生了很多紋理合成的方法。
這些方法大致可分為兩類:過程紋理合成、基於樣圖的紋理合成。其中,過程紋理通過對物理生成過程的仿真直接在曲面上合成紋理,雖然可能獲得非常逼真的紋理效果,但普適性差,操作復雜,對不同的紋理,需要反復調參才可能獲得好的結果;而基於樣圖的紋理合成,只需根據一小塊樣本紋理,便可以合成較大的相似紋理圖片,適用性廣,也易實現。基於樣圖的紋理合成中的主要問題可總結為:1、如何采樣(確定紋元);2、建立模型,確定紋元之間的關系;3、提高合成紋理的質量和效率。其中,第1點,不同的方法采樣的方式可能不同,但基本上,隨着采樣單元的size增大,能更好的保持紋理的結構性,相反,采樣單元的size越小,合成的紋理隨機性越大。第2點,建立的模型基本上都是MRF(馬爾科夫隨機場)模型,在圖像中的表現是:(1)每點的像素值只與其周圍點的像素值有關,與圖像的其他區域值無關;(2)每點像素的具體取值有一定的隨機變化。這兩條性質恰好吻合了紋理的特性,因而MRF模型在紋理合成中得到了廣泛應用。第3點,會在具體的文章中提到。 基於樣本圖像的紋理合成方法很多,可分為Pixel-based和Patch-based兩種,下面僅從最開始幾篇比較經典的文章進行學習,做些筆記。
Texture Synthesis by Non-parametric, ICCV 1999.
屬於Pixel-based的方法,即每一次只合成一個紋理像素,逐點合成整幅紋理圖。是紋理合成經典算法中最早的一個,具體如下:
1、 在給出紋理樣本后,我們假設,當某個要合成像素點的周圍像素點都已經合成,那么以該點為中心選取大小為nxn(如5x5,11x11等)的Patch;
2、 遍歷紋理樣本中所有大小為nxn的Patch,選取與上步Patch最相似的;
3、 將最相似的Patch中心點的顏色值賦給要合成的紋理像素點。
即除要合成的像素點外,對應Patch各對應像素RGB差異之和。其中,p、q是對應Patch N1、N2中對應位置的像素點。SSD error越小,說明Patch越相似。另外,為了區分Patch中各點對結果的影響大小,通常在求相似性時會采用加權距離,如乘以一個高斯核,使得離中心點越近的像素對應的權重越大(影響越大),越遠越小(影響越小),從而強調了局部結構性。公式修改如下:
然而,除非要合成的紋理只有一個像素,否則上面的假設是不成立的。一般情況下,要合成的該點周圍只有部分像素已知。針對一般情況,本文在計算Patch間的相似性時,只比較已知像素之間的差異之和,並選擇最相似的,或者設定一個閾值,取得一些差異小於閾值的較相似的Patch,取加權平均值或者隨機選取(增加紋理的隨機性)以獲得最終合成的紋理值。這樣的做法看似不是很合理,但實驗結果還是令人滿意的。原因應該是每個像素值跟它鄰域像素的相關性很大,使得部分信息就具有代表性吧。
實驗結果如下:
Window size: 5x5 11x11 15x15 23x23
討論:
1、 算法簡單容易實現,但逐點合成的效率低。
2、 當取較大Patch時,能較好地保持紋理的結構性,提高合成紋理的質量,但大大加大了計算量,降低了效率。
Fast Texture Synthesis using Tree-structured Vector Quantization,SIGGRAPH 2000.
也屬於Pixel-based的方法,搜索匹配過程和前面類似,也是通過對應Patch的SSD error來衡量相似性,只不過鄰域選取不再是nxn的方形Patch,而是L型Patch。具體過程如下圖所示(1)→(2)→(3)→(4)→(5):
(1) (2)
(3) (4)
(5)
特別地,在開始合成之前,該方法給出帶有隨機噪聲的紋理作為初始結果,而這些噪聲將在邊緣處的匹配合成時用到。如下圖所示:
輸入:樣本紋理 輸入:隨機噪聲 輸出:合成紋理
同樣地,鄰域Patch的大小直接影響了合成紋理的結果和效率,如下圖顯示:
在本文中,首先利用“Multiresolution Pyramid”的方法對樣本圖和合成圖進行下采樣,再利用類似於Kd Tree的TSVQ(Tree-structured vector quantization)方法加速匹配查找,大大提高了效率。結果對比如下:
Image Quilting for Texture Synthesis and Transfer, SIGGRAPH 2001.
經典的Patch-based方法,同樣是比較Patch間的相似性,不過Patch-based方法每次合成的不是一個像素,而是一塊紋理。首先,任取樣本中的一塊nxn紋理放置在要合成的紋理圖的左上角,然后依次平移Patch(有重合),從樣本中尋找最相似(重合部分差異最小)的Patch,將不重合的部分填充到要合成的紋理圖中,依次進行下去。大致過程如下圖做所示:
![]() |
![]() |
![]() |
當然,如果直接這樣簡單地張貼,會使得每兩個Patch接縫比較明顯,該文中采取“動態規划”的方法找到一條能量最小(這條線上兩個Patch之間的差異最小)的接縫。具體實現時,類似於貪心算法,假設以前的路徑能量最小,那么只要考慮下一步也使得能量最小即可,而下一步只有三種情況(因為接縫是連續的,像素是離散的),以豎直方向的路徑為例,公式如下:
同理,水平方向上也能找到這樣一條能量最小的接縫,並與水平方向上的相交,如下圖所示:
藍色的交叉點為兩方向接縫的交點,黃色接縫左邊的區域取左邊Patch的像素,右邊的區域取右邊Patch的像素。合成結果如下:
另外,在計算相似性進行匹配時,如果還考慮亮度等差異,該方法還可以應用到紋理遷移上,文章中給出了一個示例效果,如下圖:
最后,該方法也可利用如ANN進行加速查詢匹配,效率高,並且合成的紋理質量好。
Graphcut Textures:Image and Video Synthesis Using Graph Cuts, SIGGRAPH 2003.
Patch-based方法,它的靈活性在於張貼Patch的大小和形狀不是先驗性的,而是根據graph-cut方法計算出最佳接縫來確定最終張貼的區域。主要過程分為兩步:
1、Patch選取、放置、匹配:
根據不同紋理的情況,文章提出了三種不同的方法篩選Patch,即隨機放置、整體匹配、子像素塊匹配。其中:
(1)隨機放置:將整個輸入圖(原始的sample texture)隨機放置到要合成的紋理圖像中的某個位置(之后通過graph-cut計算挑選其中某部分區域放置到要合成的圖像中,作為輸出,並重復這樣的過程)。這種方法快速,且能獲得較好的隨機紋理。
(2)整體匹配:將整個輸入圖(原始的sample texture)不斷平移合成到輸出圖中,過程應該像Image Quilting那樣,從上到下,從左到右,只不過每次平移多少是根據重合像素的cost function(平均后的SSD error)以及概率函數確定(先篩選出error值小於閾值的平移情況;然后根據概率函數隨機選取其中一種,確定Patch位置;最后利用graph-cut確定新的合成區域)。該方法能很好的保持紋理圖內在的周期規律,適用於結構性紋理和半結構性紋理的合成。
(3)子像素塊匹配:從輸出紋理中選擇一小塊子紋理,根據cost function在輸入中(原始的sample texture)找與之相匹配的子紋理塊。這種方法適合隨機紋理合成,也適用視頻序列的合成。
2、 Graph-cut計算接縫,挑選最優的不規則區域用於合成:
把紋理Patch重疊區域的每個像素當作一個節點,給連接相鄰像素點s和t的弧賦值,該值表示匹配質量(程度),值越小匹配程度越高,越可能從這里切割。這樣便構成一個圖,用最小割算法來求解出最優的接縫。
假設s、t是來自Patch A、Patch B重合部分的兩相鄰像素點,則s、t間弧的權值為M(s,t,A,B)可以簡單地定義為:
即對應點像素差之和。這里,||.||表示某種合適的范數,如2范數。
通過graph-cuts方法計算最佳接縫,如下圖所示,豎直方向的紅色接縫,重合區域的左邊取Patch A中的像素值,右邊取Patch B中的像素值。
同理,會有水平方向上的接縫,環形的接縫等等。隨着不斷地合成新紋理,這些接縫也會被不斷更新,以獲得最佳的匹配。
由於出現在圖像的低頻區(平緩區)的接縫(接縫)會比出現在高頻區的接縫在視覺上更明顯,文中提出調整匹配成本函數M(s,t,A,B)、加入梯度約束來優化接縫的選擇。即使這樣,可能還存在視覺上比較明顯的接縫,這時可采用“羽化和多分辨率”的方法淡化接縫。最后,用基於FFT的方法在計算SSD時進行加速,大大提高合成效率。大致過程及結果如下圖:
該方法還可以用於視頻合成,此時的“Patch”為視頻的3D空間-時間塊(3D spatio-temporal block),接縫為分割block的面。
PS:只是做了紋理合成的一個初步調研,更多內容還沒有涉及,更多細節也得去看文章。如果有哪里寫得不對的地方,請指正,謝謝!
本文為原創,轉載請注明出處:http://www.cnblogs.com/dongdu
參考文獻:
[1] Efros A, Leung T K. Texture synthesis by non-parametric sampling[C]//Computer Vision, 1999. The Proceedings of the Seventh IEEE International Conference on. IEEE, 1999, 2: 1033-1038.
[2] Wei L Y, Levoy M. Fast texture synthesis using tree-structured vector quantization[C]//Proceedings of the 27th annual conference on Computer graphics and interactive techniques. ACM Press/Addison-Wesley Publishing Co., 2000: 479-488.
[3] Efros A A, Freeman W T. Image quilting for texture synthesis and transfer[C]//Proceedings of the 28th annual conference on Computer graphics and interactive techniques. ACM, 2001: 341-346.
[4] Kwatra V, Schödl A, Essa I, et al. Graphcut textures: image and video synthesis using graph cuts[C]//ACM Transactions on Graphics (ToG). ACM, 2003, 22(3): 277-286.
[5] 博客:http://www.tuicool.com/articles/2qyAriZ

















