
梵高有一幅油畫叫 Starry Night,也就是《星空》。我常常想,梵高在精神病院完成這幅名作時,他眼里看到(或者腦海中)的星空浩瀚的全局究竟該有多美,或者究竟該有多悲傷??上覀冇肋h(yuǎn)都只能看到畫框中那一小方天地。
最近劍橋大學(xué)工程系辦了個年度攝影大賽“工程的藝術(shù):來自科技前沿的圖像”。大賽的二等獎最后被來自機器學(xué)習(xí)小組的 Yarin Gal 博士生獲得,而他做的事情很有意思:利用機器學(xué)習(xí)算法擴展梵高的名畫 Starry Night,如下圖。

Gal 還建了一個專門的網(wǎng)站,用來展示這種 Extrapolated Art,即利用機器學(xué)習(xí)+圖像處理來擴展整幅畫的全局景象,因為畫往往只提供了一個局部影像。
數(shù)字修補技術(shù)(digital inpainting)第一次被提出是在 2000 年SIGGRAPH大會上,一篇名為圖像修補(Image Inpainting)的文章里。這一技術(shù)主要是為了修補那些年代久遠(yuǎn)的名古畫,但在其他圖像領(lǐng)域也有廣泛的應(yīng)用。還有一種圖像修補算法叫 Patch Match,是專門用來創(chuàng)作機器藝術(shù)(machine art)的。
接下來我們不妨來看一個實現(xiàn)這種名作擴展的編程例子,這個例子將使用Wolfram語言。在 Wolfram 語言里,inpaint 是一個內(nèi)建函數(shù),需要修補的圖像區(qū)域可以被三種對象賦值:圖像、圖形對象、矩陣。

inpaint 里有 5 種不同的方法(method)選項,用來實現(xiàn)不同的圖像處理算法:“Diffusion,” “Total Variation,” “Fast Marching,” “Navier Stokes,” 以及 “Texture Synthesis”。其中最后一種方法 Texture Synthesis 是系統(tǒng)默認(rèn)的,Texture Synthesis 跟其他算法不同的點在于,它不會單獨操控每個色彩通道,并且它不會增加新的像素值。也就是說,每一個修補像素值都是從輸入圖像的某些部分里直接獲得的,在下面這張圖里,你可以很清楚的看到,利用 Texture Synthesis 可以讓圖像中的比較大的物體直接“消失”。

Texture Synthesis 這種方法是基于一種改良后的最優(yōu)解算法,該算法在 P. Harrison 的博士論文Image Texture Tools里曾被介紹過。Texture Synthesis 有兩個參數(shù),第一個參數(shù)是用來做比較的臨近像素的數(shù)量(Neighbor Count),第二個參數(shù)是用來尋找最優(yōu)圖像紋理的采樣率大?。∕ax Samples)。
回到梵高的畫來。首先我們導(dǎo)入梵高的 Starry Night,去掉邊框。

然后,我們需要先用白色的像素來擴充圖像,擴展出后面可以用來修補的空白區(qū)域。

然后就可以使用 Texture Synthesis 方法生成最優(yōu)的臨近圖像紋理,修補并擴展圖像的全景。

效果還不錯吧。通過調(diào)整 Neighbor Count 和 Max Samples 的值,還可以有不同的擴展效果。有安裝 Wolfram 語言開發(fā)軟件的同學(xué)可以點這里下載工程文件,沒有安裝軟件的同學(xué)還可以在Wolfram Programming Cloud里試試。