图像主结构的提取方法
介紹
本節(jié)主要由學(xué)習(xí)論文Structure Extraction from Texture via Relative Total Variation一文中的內(nèi)容而來。我們知道,很多自然場景和人工藝術(shù)品都包含紋理(如,墻上,火車和地鐵表面上的涂鴉和圖案。像地毯,毛衣,和其他一些精美的工藝品包含格式各樣的幾何圖案)。在人類歷史中,馬賽克被視為一種藝術(shù)形式,它可以表示人和動物這類復(fù)雜的場景,并可以用石頭,玻璃,陶瓷和其他一些材料模仿油畫。當(dāng)用Bing或Google收索這些圖像的時(shí)候,你可以很快的找到成千上萬類似圖片。
下圖所示展示了一些代表不同形式場景的實(shí)例。他們有一個(gè)共同的特征:圖像中有意義的結(jié)構(gòu)和紋理單元融合在一起。所以我們通常稱這類圖片為“結(jié)構(gòu)+紋理”圖片。一個(gè)很有意思的現(xiàn)象:在不去除紋理的前提下,人類的視覺感知系統(tǒng)完全有能力理解這些圖像。從心里學(xué)角度分析,圖像的整體結(jié)構(gòu)特才是人類視覺感知的主要數(shù)據(jù),而不是那些個(gè)體細(xì)節(jié)(紋理)。因此從圖像中提取那些有意義的結(jié)構(gòu)數(shù)據(jù)是一項(xiàng)具有意義的工作,同時(shí)對于計(jì)算機(jī)來說也是非常有挑戰(zhàn)性的。
理論描述
在這篇論文一文中,提出了一種基于總變差形式新模型,該模型可以有效的分解圖像中的結(jié)構(gòu)信息和紋理,并且無需特別指定紋理是否規(guī)則或者對稱。換言之,該方法具有一般性和隨意性,它適用于非統(tǒng)一的或各向異性的紋理。下面介紹一下該方法。
上式為總變差模型, I代表輸入圖像,p代表2D圖像像素的索引,S代表輸出結(jié)構(gòu)圖像。其中可以寫成如下各向異性的形式:
改進(jìn)的模型如下
其中:
q為以p點(diǎn)為中心的一個(gè)正方形區(qū)域內(nèi)所有的像素點(diǎn)的索引,g為高斯核函數(shù):
我們看一幅包含紋理的圖像。如下圖所示:
其中圖(a)所示是一幅包含紋理的圖像。(b)則反映了紋理和結(jié)構(gòu)像素點(diǎn)都會產(chǎn)生比較大的D(D值大反應(yīng)在圖像中也就是對應(yīng)像素點(diǎn)的亮度高);(c)可以看出結(jié)構(gòu)部分中的L(L值大反應(yīng)在圖像中也就是對應(yīng)像素點(diǎn)的亮度高)值大于紋理部分的L值,造成這種現(xiàn)象的一種直覺上的解釋為:在包含在一個(gè)局部的小窗口中主要結(jié)構(gòu)往往產(chǎn)生比包含在另一個(gè)窗口的復(fù)雜紋理具有更多相似方向的梯度。(d)為 (也就是(3)式中的規(guī)則項(xiàng))的映射,而這個(gè)規(guī)則項(xiàng)讓主要結(jié)構(gòu)部分更加突出。(e)則是(a)用式(3)去除紋理后的結(jié)構(gòu)圖像。
現(xiàn)在,我們介紹怎么樣求解公式(3): 先討論X方向,Y方向的計(jì)算類似。
由于引入了小上述公式的第二行實(shí)際是一個(gè)近似計(jì)算。同時(shí)重新構(gòu)造二次項(xiàng)和非線性部分。它們可以分別表示為如下形式:
上式中為標(biāo)準(zhǔn)差為的高斯核函數(shù),*為卷積符號。Y方向上的求解類似:
其中
有了這些算子可以將公式(3)寫成如下矩陣的形式:
其中是vs和vi代表S和I的兩個(gè)列矢量。Cx和Cy是向前差分梯度算子的Toeplitz Matrices.都為對角矩陣,他們對線線上的值分別為:。然后,對矩陣(4)求導(dǎo)得到如下線性方程:
上公式可以至直接求矩陣的逆運(yùn)算,或者用預(yù)處理共軛梯度法來求解。
編碼實(shí)現(xiàn)
function S = tsmooth(I,lambda,sigma,sharpness,maxIter)if (~exist('lambda','var'))lambda=0.01;end if (~exist('sigma','var'))sigma=3.0;end if (~exist('sharpness','var'))sharpness = 0.02;endif (~exist('maxIter','var'))maxIter=4;end I = im2double(I);x = I;sigma_iter = sigma;lambda = lambda/2.0;dec=2.0;for iter = 1:maxIter[wx, wy] = computeTextureWeights(x, sigma_iter, sharpness);x = solveLinearEquation(I, wx, wy, lambda);sigma_iter = sigma_iter/dec;if sigma_iter < 0.5sigma_iter = 0.5;endendS = x; endfunction [retx, rety] = computeTextureWeights(fin, sigma,sharpness)fx = diff(fin,1,2);fx = padarray(fx, [0 1 0], 'post');fy = diff(fin,1,1);fy = padarray(fy, [1 0 0], 'post');vareps_s = sharpness;vareps = 0.001;wto = max(sum(sqrt(fx.^2+fy.^2),3)/size(fin,3),vareps_s).^(-1); fbin = lpfilter(fin, sigma);gfx = diff(fbin,1,2);gfx = padarray(gfx, [0 1], 'post');gfy = diff(fbin,1,1);gfy = padarray(gfy, [1 0], 'post'); wtbx = max(sum(abs(gfx),3)/size(fin,3),vareps).^(-1); wtby = max(sum(abs(gfy),3)/size(fin,3),vareps).^(-1); retx = wtbx.*wto;rety = wtby.*wto;retx(:,end) = 0;rety(end,:) = 0;endfunction ret = conv2_sep(im, sigma)ksize = bitor(round(5*sigma),1);g = fspecial('gaussian', [1,ksize], sigma); ret = conv2(im,g,'same');ret = conv2(ret,g','same'); endfunction FBImg = lpfilter(FImg, sigma) FBImg = FImg;for ic = 1:size(FBImg,3)FBImg(:,:,ic) = conv2_sep(FImg(:,:,ic), sigma);end endfunction OUT = solveLinearEquation(IN, wx, wy, lambda)[r,c,ch] = size(IN);k = r*c;dx = -lambda*wx(:);dy = -lambda*wy(:);B(:,1) = dx;B(:,2) = dy;d = [-r,-1];A = spdiags(B,d,k,k);e = dx;w = padarray(dx, r, 'pre'); w = w(1:end-r);s = dy;n = padarray(dy, 1, 'pre'); n = n(1:end-1);D = 1-(e+w+s+n);A = A + A' + spdiags(D, 0, k, k); if exist('ichol','builtin')L = ichol(A,struct('michol','on')); OUT = IN;for ii=1:chtin = IN(:,:,ii);[tout, flag] = pcg(A, tin(:),0.1,100, L, L'); OUT(:,:,ii) = reshape(tout, r, c);end elseOUT = IN;for ii=1:chtin = IN(:,:,ii);tout = A\tin(:);OUT(:,:,ii) = reshape(tout, r, c);end endend實(shí)驗(yàn)結(jié)果與分析
實(shí)驗(yàn)中ε和εs是2個(gè)小正值用來避免分母出現(xiàn)0的情況。其中ε固定為0.001. 而εs稍微大點(diǎn)會幫助保持光滑變化的結(jié)構(gòu)部分,通常設(shè)定為0.02。公式(5)中的λ是一個(gè)不可或缺的權(quán)重它用來控制圖像的光滑程度,但是僅僅調(diào)節(jié)它不會使紋理分離太多。而增加λ也會造成圖像的模糊并且紋理反而保留下來。 一般λ選取為0.01到0.03之間。圖1表示不同迭代步數(shù)顯示的結(jié)果,實(shí)驗(yàn)發(fā)現(xiàn)該算法3-5步就可以達(dá)到收斂狀態(tài)。
空間尺度參數(shù)σ控制了公式(4)中窗口的大小,它的選取取決于紋理的尺度大小并且在結(jié)構(gòu)紋理分離過程中至關(guān)重要,經(jīng)驗(yàn)的選取σ為0到8之間,圖2說明了增強(qiáng)σ可以很好地抑制紋理。并且實(shí)驗(yàn)中發(fā)現(xiàn)在每一次迭代時(shí)成倍的減小,可以起到銳化邊緣的效果,同時(shí)不會減弱紋理去除的能力.
當(dāng)一幅物體的表面包含多重紋理形式或者可以看成非正面方向,紋理單元就可以認(rèn)為是不同變化尺度的。圖2和圖3就是這樣一類圖像。因?yàn)樵谠撍惴ㄖ行∮谙鄬τ诔叨葏?shù) 那些紋理都得到了有效的懲罰,所以文章的提出模型可以很好的處理這種類型的圖像。當(dāng)然,如果遠(yuǎn)處的結(jié)構(gòu)和近處的紋理相似,他們也都會被去除。因?yàn)樵撍惴ㄒ蕾囉诰植康臄?shù)據(jù),所以我們不需要認(rèn)為局部的梯度是各項(xiàng)同性的。只要在一個(gè)局部窗口中方向相反的梯度相互抵消,該方法就能生效,而不管梯度模式是不是各項(xiàng)同性的或是異性的。
圖像矢量化就是把一個(gè)像素圖像轉(zhuǎn)化為一個(gè)矢量圖。矢量圖可以任意的放大和縮小而不會丟失細(xì)節(jié)部分,然而大多數(shù)矢量化的方法都不能表示好的細(xì)節(jié)部分。由于復(fù)雜的紋理模式和局部像素點(diǎn)的不斷震蕩的普遍存性,矢量化“結(jié)構(gòu)+紋理”這一類圖像變的更加困難。觀察如下圖所示:
圖8(c)和(e),經(jīng)典的矢量化軟件Vector Magic也不能很好地完成矢量化。在本文中,我們開始先分解紋理和結(jié)構(gòu),分解的結(jié)構(gòu)圖為圖8(b),然后矢量化就可以很好地運(yùn)用了。在矢量化的過程中,結(jié)構(gòu)圖像(b)直接被放大。于此同時(shí),紋理圖像可以用雙線性插值作為一個(gè)位圖重新被放大。最后合成這兩層圖像獲得圖8(f)。相對于傳統(tǒng)的方法,該矢量化算法可以產(chǎn)生更好地效果:不丟失邊緣和細(xì)節(jié)信息。
本文的算法還可以用于邊緣提取。如下圖所示,展示了一個(gè)例子,該幅圖像中包含很明顯的前景和背景的紋理,這往往導(dǎo)致邊緣提取的失敗。圖9(b)和(c)使用不同參數(shù)的額Canny邊緣檢測提取的邊緣。很明顯這樣的邊緣是不令人滿意的。該方法可以先獲得好的結(jié)構(gòu)圖像(d),然后再檢測該結(jié)構(gòu)圖像的邊緣得到(e)。圖(6)說明了一樣的道理。
由于源紋理和目標(biāo)紋理的不兼容性,有時(shí)涂鴉圖像,油畫,和素描不能直接運(yùn)用到圖像融合中。圖11和圖12就是一個(gè)很好的例子。
直接將圖11(a)和圖12(a)融入目標(biāo)場景中得到圖11(c)和圖12(e),不難發(fā)現(xiàn)融合的圖像很不自然。然而將紋理分離后的圖11(b)和圖12(b)融入相同場景得到的圖11(d)和圖12(d)卻很自然。改組實(shí)驗(yàn)說明了本文算法可以很好運(yùn)用到圖像融合中。
補(bǔ)充說明
一般來說,我們知道Matlab只適合于科研。如果想做成產(chǎn)品,需要用其他的比如C/C++之類的實(shí)現(xiàn)該算法,對于這點(diǎn),這個(gè)程序可能有點(diǎn)困難,主要的困難在于其中的解線性方程組。因?yàn)樵诒舅惴ㄖ?#xff0c;方程組的系數(shù)矩陣式一個(gè)很大的稀疏矩陣,有多大呢,比如如果圖像時(shí)600x600的,那么這個(gè)矩陣的大小就是500000x500000,因此,直接的實(shí)現(xiàn)對于內(nèi)存等方面肯定不現(xiàn)實(shí),必須研究稀疏矩陣的存儲方式,另外,解方程所用的共軛梯度法也不是一下子就能實(shí)現(xiàn)的,正在研究......同時(shí),關(guān)于C/C++版本程序也還在研究中......(^_^)。但是,此算法由于占用太多內(nèi)存,那Android手機(jī)上更不用說了。不過,如果有時(shí)間還是可以好好優(yōu)化一下。呵呵......參考文獻(xiàn)
[1] Li Xu, Qiong Yan, Yang Xia, Jiaya Jia, "Structure Extraction from Texture via Relative Total Variation", ACM Transactions on Graphics (TOG), 31(6), 139, Proceedings of ACM SIGGRAPH Asia 2012.
關(guān)于Image Engineering & Computer Vision的更多討論與交流,敬請關(guān)注本博和新浪微博songzi_tea.
總結(jié)
以上是生活随笔為你收集整理的图像主结构的提取方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下使用苹果Monaco字体
- 下一篇: 编译原理-陈火旺-第三版-课后习题第八章