喬岸紅
摘要:紋理綜合是根據(jù)現(xiàn)有的一塊小的輸入紋理,然后通過某種算法,使之生成與小紋理類似的一塊大紋理。一般要求兩塊紋理有較高的相似度,并且在視覺上沒有生硬的拼接的感覺。此外還要求算法能有比較快的速度,有較強(qiáng)的實(shí)用性。圖像縫合是一種快速的紋理綜合算法,現(xiàn)在已經(jīng)有一些成熟的算法,它是在把輸入紋理分塊之后,然后在目標(biāo)圖像上根據(jù)相似度進(jìn)行貼圖,在貼圖完成之后,再對(duì)塊與塊之間的邊界進(jìn)行調(diào)整,使之實(shí)現(xiàn)自然過渡。該文研究的是在VC++6.0環(huán)境下通過面向?qū)ο缶幊逃脠D像縫合技術(shù)實(shí)現(xiàn)快速紋理綜合。自己設(shè)計(jì)并實(shí)現(xiàn)了實(shí)驗(yàn)系統(tǒng),驗(yàn)證了Alexei A. Efros和William T. Freeman的紋理縫合算法,取得比較好的實(shí)驗(yàn)結(jié)果。
關(guān)鍵詞:紋理綜合;圖像縫合;算法;平滑過渡
中圖分類號(hào):TP393文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)20-4974-03
An the Design and Implementation of the Algorithm of Image Quilting for Texture Synthesis
QIAO An-hong
(College of Mathematics and Information Engineering,Jiaxing University, Jiaxing 314001,China)
Abstract:According to a piece of the existing small input texture, use some sort of algorithm to generate a big texture similar as the small input texture. It generally requires that the two textures are with high texture similarity. The result texture should be without the visual sense of blunt splicing, and the algorithm can also achieve a relatively fast speed. Image quilting is a fast texture synthesis algorithm. There are a number of sophisticated algorithms about texture synthesis. The procedure is like that: dividing the input texture into the blocks, and then mapping in the target image according the similarity between the target image and the block. After completion of mapping, adjusts the boundary between the two conjoint blocks to achieve a natural transition. This study was conducted in VC + +6.0 environments using the object-oriented programming to test Alexei A. Efros and William T. Freemanalgorithm“Image Quilting for Texture Synthesis and Transfer”. The experimental results show a relatively good effect.
Key words: database connection; pop-up menu; dynamic data window; information feedback
紋理綜合是為了解決紋理映射中存在的接縫走樣等問題而提出的,目前紋理合成方法可分為兩類:
一類為過程紋理合成(PTS)。過程紋理合成通過對(duì)物理生成過程的仿真直接在曲面上生成紋理,如毛發(fā)、云霧、木紋等,從而避免了紋理映射帶來的失真。這種方法可以獲得非常逼真的紋理,但對(duì)每一種新的紋理,卻需要調(diào)整參數(shù)反復(fù)測(cè)試,非常不便,有的甚至無法得到有效的參數(shù)。另一類為基于樣圖的紋理合成(texture synthesis from samples,TSFS)。TSFS技術(shù)是近幾年迅速發(fā)展起來的一種新的紋理拼接技術(shù),它基于給定的小區(qū)域紋理樣本,按照表面的幾何形狀,拼合生成整個(gè)曲面的紋理,它在視覺上是相似而連續(xù)的。TSFS技術(shù)可以克服傳統(tǒng)紋理映射方法的缺點(diǎn),又避免了過程紋理合成調(diào)整參數(shù)的繁瑣,因而受到越來越多研究人員的關(guān)注,成為計(jì)算機(jī)圖形學(xué)、計(jì)算機(jī)視覺和圖像處理領(lǐng)域的研究熱點(diǎn)之一。利用TSFS技術(shù)還可以進(jìn)行紋理填充(如修補(bǔ)破損的圖片,重現(xiàn)原有圖片效果),紋理傳輸,擴(kuò)展到時(shí)域則可以用一短段視頻圖像,生成任意長(zhǎng)度的非重復(fù)的視頻動(dòng)畫等。
紋理技術(shù)作為數(shù)字圖像處理的一個(gè)重要分支,不斷與其它學(xué)科結(jié)合,發(fā)展速度日新月異。在圖像編輯、數(shù)據(jù)壓縮、網(wǎng)絡(luò)數(shù)據(jù)的快速傳輸、大規(guī)模場(chǎng)景的生成以及真實(shí)感和非真實(shí)感繪制、檔案的數(shù)字化保存、視頻的索引和檢索、物體3 D重建、軍事偵察和公安取證、數(shù)碼相機(jī)的超分辨處理等方面具有廣泛的應(yīng)用前景。具體表現(xiàn)如下:
1)基于顏色和紋理綜合特征的車牌定位新方法。首先進(jìn)行色彩分割,然后進(jìn)行區(qū)域生成,最后從中分割出車牌。實(shí)驗(yàn)結(jié)果表明算法效果好、速度高,而且適用于對(duì)有噪聲及復(fù)雜背景的車牌圖像進(jìn)行分割。
2)基于內(nèi)容的圖像檢索。其主要是利用圖像的特征,如:顏色直方圖、紋理、形狀等來進(jìn)行檢索,這種方式能夠提高檢索的效率與準(zhǔn)確率。利用圖像的顏色信息與利用快速傅立葉變換來提取紋理特征相結(jié)合的方法來進(jìn)行圖像檢索,該方法一方面可以反映圖像的全局特征,另一方面又反映了圖像的局部特征,且具有對(duì)圖像檢索的旋轉(zhuǎn)不變性。
1紋理常見算法
1.1紋理算法的發(fā)展
Efros等在1999年首先提出了基于鄰域匹配的逐點(diǎn)合成方法之后,Wei等和Ashikhmn對(duì)該方法進(jìn)行了改進(jìn)。雖然逐點(diǎn)合成的方式對(duì)于隨機(jī)性較強(qiáng)的紋理達(dá)到了滿意的合成效果,但它卻難以有效合成結(jié)構(gòu)性較強(qiáng)的紋理,合成速度也比較慢。
Xu等在2000年提出了隨機(jī)塊拼接的合成方法,即按塊進(jìn)行紋理合成,很好地提高了速度。Efros等在2001年提出了一種紋理的逐塊合成方法,根據(jù)待合成塊的鄰域區(qū)搜索匹配塊,采用最小誤差路徑法來實(shí)現(xiàn)各塊的拼接。
Liang等也提出了類似的方法,只不過采用了“羽化”的方式來處理塊與塊問的重疊區(qū)。相比于逐點(diǎn)合成法,逐塊合成法不但提高了速度,而且改善了對(duì)結(jié)構(gòu)性較強(qiáng)紋理的合成效果。
1.2紋理常見算法
近幾年,基于樣圖的紋理合成方法得到了迅速發(fā)展,它基于給定的小區(qū)域紋理樣本,按照表面的幾何形狀,生成大范圍的紋理,它在視覺上是相似而連續(xù)的。基于樣圖的紋理合成技術(shù)避免了過程紋理合成調(diào)整參數(shù)的繁瑣,而且速度更快,適用的范圍更廣,已成為計(jì)算機(jī)圖形學(xué)、計(jì)算機(jī)視覺和圖像處理領(lǐng)域的研究熱點(diǎn)之一,其算法也層出不窮。
1)基于特征提取的紋理合成算法,該算法將紋理樣圖進(jìn)行分層處理,一層是紋理上具有明顯邊界和完整形狀的特征對(duì)象,一層是除去特征對(duì)象的背景。首先將紋理上的特征對(duì)象提取出來,然后用剩下的紋理合成背景,最后將提取的對(duì)象按照樣本中的分布規(guī)律撒播在背景上來生成紋理。實(shí)驗(yàn)表明,這種算法能夠較好地保證樣本紋理中特征對(duì)象的完整性,合成效果比較理想。
2)基于不規(guī)則塊的紋理合成方法。為了很好地保持紋理的邊界結(jié)構(gòu)特征,提出了一種利用人眼的視覺特性,采用不規(guī)則塊、隨機(jī)覆蓋法和曲線最優(yōu)匹配的紋理合成新方法。此方法分兩個(gè)步驟:首先根據(jù)人眼的視覺特性,采用智能選擇工具從樣本紋理中抽取出具有明顯邊界特征的不規(guī)則塊,然后采用隨機(jī)覆蓋法和曲線最優(yōu)匹配法來決定如何把不規(guī)則塊拷貝到目標(biāo)紋理中和已有的合成方法相比,新方法能更好地保持紋理的邊界結(jié)構(gòu)特征。實(shí)驗(yàn)表明該方法可以快速高效地合成高質(zhì)量的紋元式紋理。
2 BMP圖片及24位真彩色
2.1 BMP圖片
BMP是一種與硬件設(shè)備無關(guān)的圖像文件格式,使用非常廣。它采用位映射存儲(chǔ)格式,除了圖像深度可選以外,不采用其他任何壓縮。因此,BMP文件所占用的空間很大。BMP文件的圖像深度可選lbit、4bit、8bit及24bit。BMP文件存儲(chǔ)數(shù)據(jù)時(shí),圖像的掃描方式是按從左到右、從下到上的順序。
2.2 24位真彩色
一個(gè)顏色可以拆分成紅綠藍(lán)三元色,24真彩色就是依據(jù)這個(gè)劃分,每種顏色用一個(gè)字節(jié)來表示.3*8=24 (16777216種顏色)。所以一個(gè)象素需要3個(gè)字節(jié)來表示,存儲(chǔ)數(shù)據(jù)量應(yīng)該是256色圖片的3倍。即1406.25KB=1.3733MB左右?,F(xiàn)在大多數(shù)的數(shù)字顯示技術(shù)(如液晶顯示屏)均采用24位色彩。在傳輸數(shù)據(jù)時(shí)是3個(gè)8位為一個(gè)紅,綠,藍(lán)組成的點(diǎn)傳輸?shù)?然后每個(gè)點(diǎn)根據(jù)這些數(shù)字來產(chǎn)生不同的電壓,由此產(chǎn)生豐富多彩的圖像。
3算法實(shí)現(xiàn)工具
3.1 Visual c++6.0
Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。雖然微軟公司推出了Visual C++.NET(Visual C++7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C++6.0為平臺(tái)。
Visual C++6.0不僅是一個(gè)C++編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated development envi ronment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。這些組件通過一個(gè)名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。
3.2 C++語言
C++的設(shè)計(jì)目標(biāo),就是要讓C++既具有適合于系統(tǒng)程序設(shè)計(jì)的C語言所具有的可適應(yīng)性和高效性,又能在其程序組織結(jié)構(gòu)方面具有像Simula那樣的語言設(shè)施(Simula所支持的這種程序組織結(jié)構(gòu)通常被稱為面向?qū)ο蟪绦蛟O(shè)計(jì)風(fēng)格)。在設(shè)計(jì)的時(shí)候,還做了很大的努力,使得引借自Simula的高層次的程序設(shè)計(jì)技術(shù)能夠應(yīng)用于系統(tǒng)程序設(shè)計(jì)之中。這即是說,C++所提供的抽象機(jī)制能夠被應(yīng)用于那些對(duì)效率和可適應(yīng)性具有極高要求的程序設(shè)計(jì)任務(wù)之中。
C++的設(shè)計(jì)原則,C++的設(shè)計(jì)規(guī)則被分為基本規(guī)則、基于設(shè)計(jì)的規(guī)則、語言的技術(shù)性規(guī)則以及基于低層次程序設(shè)計(jì)的規(guī)則四個(gè)方面。
4實(shí)驗(yàn)與實(shí)現(xiàn)
4.1算法驗(yàn)證
此次實(shí)驗(yàn)驗(yàn)證的是Alexei A. Efros和William T. Freeman圖像縫合和遷移算法。此算法的特點(diǎn)是高效、快速、有較強(qiáng)的實(shí)用性。
4.2實(shí)驗(yàn)步驟
1)導(dǎo)入小塊的紋理圖像(24位真彩色、bmp格式圖片、90*90(為了方便處理選取30的倍數(shù)))。
2)將此紋理圖片裁成等大小的若干塊小紋理。
3)隨機(jī)選擇一塊紋理,作為目標(biāo)大紋理的起始?jí)K。
4)選取和第一塊邊緣相似度最高的紋理塊,進(jìn)行部分重疊貼圖。
5)如此循環(huán)產(chǎn)生目標(biāo)紋理。
4.3核心代碼
1)導(dǎo)入及顯示圖片:
HANDLE CDib::LoadDIB(LPCTSTR lpFileName)//導(dǎo)入紋理圖片
{
HANDLE hDIB; //圖像句柄
HANDLE hFile; //文件句柄
if((hFile = CreateFile(lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NOR MAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL))!= INVALID_HANDLE_VALUE)
{
hDIB = ReadDIBFile(hFile); //讀取DIB文件
if(!hDIB)
AfxMessageBox("Read File Error"); //出錯(cuò)處理
CloseHandle(hFile); //關(guān)閉文件句柄
return hDIB; //返回包含文件信息頭和數(shù)據(jù)區(qū)的圖像句柄
}
return NULL;//返回空值
}
2)生成目標(biāo)紋理:
//hSample為紋理樣本,height,width為合成圖像的高和寬
HANDLE CDib::ImgQuilting(HANDLE hSample,int height,int width) //樣本紋理的高和寬
//由于下文將樣本切分尺寸設(shè)定為30*30。所以為了方便切分,樣本紋理尺寸最好取30的整數(shù)倍。
{
if(!hSample || height <0 || width <0) //出錯(cuò)處理
return NULL; //返回空值
//樣本切分的尺度設(shè)定為W和H
const int W = 30;//寬:30px
const int H = 30;//高:30px
HANDLE hDst; //保存結(jié)果的圖像句柄
LPBITMAPINFOHEADER lpbi; //信息頭指針
LPBYTE lpS = this→FindDIBBits(hSample);//定義紋理樣本數(shù)據(jù)段起始位置
int bytesPerLineS = this→BytePerLine(hSample);//紋理樣本每行像素占用字節(jié)數(shù)
int w,h; //樣本圖像的寬和高
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hSample);//鎖定(lpbi指向文件信息頭的內(nèi)存中的地址)w = lpbi→biWidth;//給寬度賦值h = lpbi→biHeight; //給高度賦值
GlobalUnlock(hSample);//接觸紋理樣本鎖定GlobalUnlock(hDst);//解除圖像鎖定return hDst;//返回圖像句柄
5結(jié)束語
本次實(shí)驗(yàn)以bmp圖像為例實(shí)現(xiàn)紋理縫合。通過導(dǎo)入不同的紋理圖片,產(chǎn)生了和符合預(yù)期的目標(biāo)紋理。充分驗(yàn)證了Alexei A. Efros和William T. Freeman圖像縫合和遷移算法快速、高效和實(shí)用性。
參考文獻(xiàn):
[1]侯捷.深入淺出MFC[M].2版.華中科技大學(xué)出版社,2001.
[2]周長(zhǎng)發(fā).精通VC++圖像處理編程[M].2版.北京:電子工業(yè)出版社,2004.10.01
[3] Andrew Nealen,and Marc Alexa. Hybrid Texture Synthesis. Eurographics Symposium on Rendering 2003.
[4] Algorithms for solid noise synthesis. Computer Graphics (SIGGRAPH 89 Proc.), 1989,23(3):263-270.
[5] William T. Freeman. Image Quilting for Texture Synthesis and Transfer. Proceedings SIGGRAPH 01, In Computer Graphics, Annual Con ference Series,2001.