標籤:style blog http io ar 使用 sp strong on
原文地址
編者按:原文作者Piotr Wendykier,專註於 mathematica 演算法編程及研發。(根據本地閱讀習慣略有刪改,英文好的同學建議閱讀原文)。
梵谷有一幅油畫叫 Starry Night,也就是《星空》。我常常想,梵谷在精神病院完成這幅名作時,他眼裡看到(或腦海中)浩瀚星空的全域究竟該有多美,或者究竟該有多悲傷。可惜我們永遠都只能看到畫框中那一小方天地。
最近,劍橋大學工程系辦了個年度攝影大賽“工程的藝術:來自科技前沿的映像”。大賽的二等獎最後被來自機器學習小組的 Yarin Gal 博士生獲得,而他做的事情很有意思:利用機器學習演算法擴充梵谷的名畫 Starry Night,如。
Gal 還建了一個專門的網站,用來展示這種 Extrapolated Art,即利用機器學習+影像處理來擴充整幅畫的全域景象,因為畫往往只提供了一個局部影像。
數字修補技術(digital inpainting)第一次被提出是在 2000 年SIGGRAPH大會上,一篇名為映像修補(Image Inpainting)的文章裡。這一技術主要是為了修補那些年代久遠的名古畫,但在其他映像領域也有廣泛的應用。還有一種映像修補演算法叫 PatchMatch,是專門用來創作機器藝術(machine art)的。
接下來我們不妨來看一個實現這種名作擴充的編程例子,這個例子將使用Wolfram語言。在 Wolfram 語言裡,inpaint 是一個內建函數,需要修補的映像地區可以被三種對象賦值:映像、繪圖物件、矩陣。
inpaint 裡有 5 種不同的方法(method)選項,用來實現不同的影像處理演算法:“Diffusion,” “TotalVariation,” “FastMarching,” “NavierStokes,” 以及 “TextureSynthesis”。其中最後一種方法 TextureSynthesis 是系統預設的,TextureSynthesis 跟其他演算法不同的點在於,它不會單獨操控每個色彩通道,並且它不會增加新的像素值。也就是說,每一個修補像素值都是從輸入映像的某些部分裡直接獲得的,在下面這張圖裡,你可以很清楚的看到,利用 TextureSynthesis 可以讓映像中的比較大的物體直接“消失”。
TextureSynthesis 這種方法是基於一種改良後的最優解演算法,該演算法在 P. Harrison 的博士論文Image Texture Tools裡曾被介紹過。TextureSynthesis 有兩個參數,第一個參數是用來做比較的臨近像素的數量(NeighborCount),第二個參數是用來尋找最優映像紋理的採樣率大小(MaxSamples)。
回到梵谷的畫來。首先我們匯入梵谷的 Starry Night,去掉邊框。
然後,我們需要先用白色的像素來擴充映像,擴充出後面可以用來修補的空白地區。
然後就可以使用 TextureSynthesis 方法產生最優的臨近映像紋理,修補並擴充映像的全景。
效果還不錯吧。通過調整 NeighborCount 和 MaxSamples 的值,還可以有不同的擴充效果。有安裝 Wolfram 語言開發軟體的同學可以點這裡下載工程檔案,沒有安裝軟體的同學還可以在Wolfram Programming Cloud裡試試。
梵谷眼裡的《星空》究竟有多美,利用機器學習和影像處理來擴充整幅畫的全域景象~