2019.12.16 日更正:本文最後有說起本算法不合適C語言實現,可是可在【算法隨記六】一段Matlab版本的Total Variation(TV)去噪算法的C語言翻譯 一文中找到替代算法。html
本文主要由Structure Extraction from Texture via Relative Total Variation一文中的內容翻譯而來,做者又是香港中文大學的一批牛人。算法
一:問題由來編程
不少天然場景和人工藝術品都包含紋理。好比,牆上,火車和地鐵表面上的塗鴉和圖案。像地毯,毛衣,和其餘一些精美的工藝品包含格式各樣的幾何圖案。在人類歷史中,馬賽克被視爲一種藝術形式,它能夠表示人和動物這類複雜的場景,並能夠用石頭,玻璃,陶瓷和其餘一些材料模仿油畫。當用Google收索這些圖像的時候,你能夠很快的找到成千上萬相似圖片。下圖展現了一些表明不一樣形式場景的實例。他們有一個共同的特徵:圖像中有意義的結構和紋理單元融合在一塊兒。因此咱們一般稱這類圖片爲「結構+紋理」圖片。一個頗有意思的現象:在不去除紋理的前提下,人類的視覺感知系統徹底有能力理解這些圖像。從內心學角度分析,圖像的總體結構特纔是人類視覺感知的主要數據,而不是那些個體細節(紋理)。所以從圖像中提取那些有意義的結構數據是一項具備意義的工做,同時對於計算機來講也是很是有挑戰性的。函數
二:算法描述post
在《Structure Extraction from Texture via Relative Total Variation》一文中提出了一種基於總變差形式新模型,該模型能夠有效的分解圖像中的結構信息和紋理,而且無需特別指定紋理是否規則或者對稱。換言之,該方法具備通常性和隨意性,它適用於非統一的或各向異性的紋理。下面介紹一下該方法。 google
上式爲總變差模型, I表明輸入圖像,p表明2D圖像像素的索引,S表明輸出結構圖像。其中能夠寫成以下各向異性的形式:url
改進的模型以下spa
其中翻譯
q爲以p點爲中心的一個正方形區域內全部的像素點的索引,g爲高斯核函數:3d
下圖(a)是一幅包含紋理的圖像。(b)則反映了紋理和結構像素點都會產生比較大的D(D值大反應在圖像中也就是對應像素點的亮度高);(c)能夠看出結構部分中的L(L值大反應在圖像中也就是對應像素點的亮度高)值大於紋理部分的L值,形成這種現象的一種直覺上的解釋爲:在包含在一個局部的小窗口中主要結構每每產生比包含在另外一個窗口的複雜紋理具備更多類似方向的梯度。(d)爲 (也就是(3)式中的規則項)的映射,而這個規則項讓主要結構部分更加突出。(e)則是(a)用式(3)去除紋理後的結構圖像。
下面介紹怎麼樣求解公式(3): 先討論X方向,Y方向的計算相似。
公式(9)能夠至直接求矩陣的逆運算,或者用預處理共軛梯度法來求解。
三:實驗結果
實驗中ε和εs是2個小正值用來避免分母出現0的狀況。其中ε固定爲0.001. 而εs稍微大點會幫助保持光滑變化的結構部分,一般設定爲0.02。公式(5)中的λ是一個不可或缺的權重它用來控制圖像的光滑程度,可是僅僅調節它不會使紋理分離太多。而增長λ也會形成圖像的模糊而且紋理反而保留下來。 通常λ選取爲0.01到0.03之間。圖1表示不一樣迭代步數顯示的結果,實驗發現該算法3-5步就能夠達到收斂狀態。
空間尺度參數σ控制了公式(4)中窗口的大小,它的選取取決於紋理的尺度大小而且在結構紋理分離過程當中相當重要,經驗的選取σ爲0到8之間,圖2說明了加強σ能夠很好地抑制紋理。而且實驗中發如今每一次迭代時成倍的減少,能夠起到銳化邊緣的效果,同時不會減弱紋理去除的能力.
當一幅物體的表面包含多重紋理形式或者能夠當作非正面方向,紋理單元就能夠認爲是不一樣變化尺度的。圖2和圖3就是這樣一類圖像。由於在該算法中小於相對於尺度參數 那些紋理都獲得了有效的懲罰,因此文章的提出模型能夠很好的處理這種類型的圖像。固然,若是遠處的結構和近處的紋理類似,他們也都會被去除。由於該算法依賴於局部的數據,因此咱們不須要認爲局部的梯度是各項同性的。只要在一個局部窗口中方向相反的梯度相互抵消,該方法就能生效,而無論梯度模式是否是各項同性的或是異性的。
圖像矢量化就是把一個像素圖像轉化爲一個矢量圖。矢量圖能夠任意的放大和縮小而不會丟失細節部分,然而大多數矢量化的方法都不能表示好的細節部分。因爲複雜的紋理模式和局部像素點的不斷震盪的廣泛存性,矢量化「結構+紋理」這一類圖像變的更加困難。觀察圖8(c)和(e),經典的矢量化軟件Vector Magic也不能很好地完成矢量化。在本文中,咱們開始先分解紋理和結構,分解的結構圖爲圖8(b),而後矢量化就能夠很好地運用了。在矢量化的過程當中,結構圖像(b)直接被放大。於此同時,紋理圖像能夠用雙線性插值做爲一個位圖從新被放大。最後合成這兩層圖像得到圖8(f)。相對於傳統的方法,該矢量化算法能夠產生更好地效果:不丟失邊緣和細節信息。
本文的算法還能夠用於邊緣提取。圖9展現了一個例子,該幅圖像中包含很明顯的前景和背景的紋理,這每每致使邊緣提取的失敗。圖9(b)和(c)使用不一樣參數的額Canny邊緣檢測提取的邊緣。很明顯這樣的邊緣是不使人滿意的。該方法能夠先得到好的結構圖像(d),而後再檢測該結構圖像的邊緣獲得(e)。圖(6)說明了同樣的道理。
因爲源紋理和目標紋理的不兼容性,有時塗鴉圖像,油畫,和素描不能直接運用到圖像融合中。圖11和圖12就是一個很好的例子。直接將圖11(a)和圖12(a)融入目標場景中獲得圖11(c)和圖12(e),不難發現融合的圖像很不天然。然而將紋理分離後的圖11(b)和圖12(b)融入相同場景獲得的圖11(d)和圖12(d)卻很天然。改組實驗說明了本文算法能夠很好運用到圖像融合中。
4、編程實現
原文件提供了相關算法的matlab代碼,能夠從這裏下載:http://www.cse.cuhk.edu.hk/~leojia/projects/texturesep/tsmoothing.zip
關於這個源代碼,我看了好久的,有不少地方是和文章的公式不是徹底對應的,因此研究的時候仍是要有所注意。
通常來講,matlab只適合於科研,若是想作成產品,須要用其餘的好比C之類的實現該算法,對於這點,這個程序可能有點困難,主要的困難在於其中的解線性方程組。由於在本算法中,方程組的係數矩陣式一個很大的稀疏矩陣,有多大呢,好比若是圖像時500*600的,那麼這個矩陣的大小就是300000*300000,所以,直接的實現對於內存等方面確定不現實,必須研究稀疏矩陣的存儲方式,另外,解方程所用的共軛梯度法也不是一會兒就能實現的。 目前個人C版本程序還在研究中。
五:說明
這種論文其實直接看英文的是最好的方式嗎,博客中因爲編輯、書寫等方面的不便,有的時候就是隨便表達下,文中有不少翻譯和編輯的不當之處,請真正有性卻的朋友下載後看英文。
因爲原始論文的大小大於10MB,沒法上傳,敬請各位有興趣的朋友在google搜索該論文。
特別緻謝西西網友的大力支持。
*********************************做者: laviewpbt 時間: 2013.10.10 聯繫QQ: 33184777 轉載請保留本行信息************************