使用兩張角度不同的靜態圖像合成連貫的動畫,難度有多大?

一張從左邊拍,一張從右邊拍,通過內插法和外插法合成連貫的動畫。如圖所示:
左邊

右邊

合成結果
http://ww3.sinaimg.cn/large/6cbb8645gw1egn8tn4bxgg206t08c1ky.gif

這是一位日本研究生的論文研究成果,圖像處理方面的,原文地址研究 - いもす研 (imos laboratory)
我知道一兩句話說不清楚,我只想知道大概是什麼原理?或者難度有多大?


首先, 這不是使用內插法或者外插法可以得到的.
要從動態的2維圖像中提取出三維信息, 通常要用到
optical flow演算法, 這個演算法也廣泛地被用在表情識別, 動作捕捉等應用領域.

圖1, Optical flow的一個典型求解結果。

簡單地說, 給定兩張連續的圖片,
optical flow的目的是找出一個合理的速度場V, S.T. 這兩張圖片滿足
此速度的一個convection方程
frac{partial I}{partial t}+Vcdot
abla I= frac{D I}{D t} = 0epsilon_a

就是說, 我們希望找出一個速度場, 使得圖片2可以通過按照這個速度場
來位移圖片1得到.


這只是問題的定義, 那麼該如何求解呢? 簡單的說, 我們希望找到這樣一
組在圖像I1 裡頭的點, 以及它們經過某個速度場移動後對應到的I2裡頭的
點, 最小化在這些點處採集到的像素顏色值的差.
這樣的速度場, 該滿足什麼約束條件呢?
1. 如果這個運動只是發生在平移, 旋轉等情況下的, 速度場V滿足

abla^2 V = 0epsilon_b
或者
u_{x}^{2}+u_{y}^{2} + v_{x}^{2} + v_{y}^{2} = 0epsilon_b
所以, 我們想最小化誤差1加誤差2 在整個域內的積分:
min epsilon = intint (epsilon_a + alphaepsilon_b) dOmega

變分(calculus of variation) 告訴我們,
I_{x}^{2}u+I_x I_y v = alpha^{2} 
abla^2 u - I_x I_t
I_{x}I_{y}u+ I_y ^2 v = alpha^{2} 
abla^2 v - I_y I_t

到此為止, 我們用有限差分方法來離散Laplace運算元和整個計算域,
已經有足夠的能力求解出所想要的u和v了.
我們可以使用迭代法來求解出這個方程組, 比如(Gauss - Seidel,
Conjugate gradient...(這個係數矩陣應該是對稱的) )

在得到速度場V之後, 我們就可以按照速度場去移動I1 的像素, 然後得到
動畫序列了.

同樣的原理, 在motion/expression capture中, 我們就能用得到的速度場來估算綁定
在人身上的那些點的運動了.

also, 在這裡附上一個關於optical flow的課程.
https://www.youtube.com/watch?v=5VyLAH8BhF8


步驟三、假設你知道場景中每一個點的顏色和三維位置,你只需要設置一台不斷移動的(虛擬)相機,然後把這些點投影到相機上,注意遠處的點可能被近處的點遮住,就生成了樓主所說的動畫。因為每一個點的位置都在沿著攝像機光心和圖像上那個點的連線延長線上,但是不知道具體往外走多少,因此實際上缺乏的是每一點的深度。

步驟二、假如知道每一個相機的位置和朝向以及相機參數,可以通過三角定位演算法恢復出兩幅圖像公共部分上的一些點的三維位置,其他的點的三維位置可以由這些先被求出的點的位置插值獲得。也可以通過雙目視覺的標準演算法獲得每一點的深度,其原理是:如果當前點的深度正確,那麼在兩個攝像頭的成像下應該位置和兩幅圖片上一樣,否則就把當前點朝前或朝後移動一些。然後回到步驟三。

步驟一、如果只有兩幅圖像,沒有相機的位置信息和相機參數,那麼仍然可以通過一些複雜的演算法,估計出兩個相機的參數和它們之間的朝向變化,這種估計是不準確的。可以近似把兩個攝像機(虛擬地)校正到朝向相同。

可以看出,整個流程最關鍵的就是給每一個點找一個深度值。一種偷懶但效果異常好的方法是是通過人為畫一幅深度圖。比如用黑色表示離攝像頭最遠、白色表示最近,因為由近及遠依次是:小圓的劉海、鼻子、眼睛,丘比的眼睛、耳朵,小圓的萌辮,就把它們依次從白色漸變塗成黑色。這幅圖就是深度圖,如果你畫的足夠好,那麼出來的三維成像結果也很棒。

下面給你展示一下我用最笨的視覺方法全自動完成整個過程的結果:
一、校正,讓左圖中每一個點在右圖上也在同一行上。

二、算雙目視差圖,也就是深度圖。這樣就可以知道每一點離攝像機有多遠,一般顏色越白離相機越近。好的視差圖生成演算法生成的深度圖是連續的,並且能夠把洞補上。樓上所述的光流法就是用在這一步,Horn和Schunck在1981最早在計算機視覺領域提出光流法,是相關領域最重大的進展之一。

三、重建。這一步就是要把各個像素點朝後移動到它的深度圖所指定的位置上,然後就可以隨意拍攝照片或視頻了。想獲得較好的效果可以從原始圖像上提取一系列小三角形面片貼到空間三角形網格上(本示例中只是把所有像素點挪到合適的位置)。從左邊看丘比應該被小圓擋著,從右邊看恰好相反。

從正面看:

從右邊看:

從左面看:

完全自動地執行這一過程有些複雜,但它的原理和後續改進也正是這二十年來計算機視覺領域最突出的成就之一。即使在現在,如果去翻閱最新的計算機視覺領域頂級期刊比如IJCV、PAMI、依然能經常看到計算視差圖的改進演算法。

遺憾的是,即使是最好的演算法,也無法解決生成的重建圖上有洞這一缺陷,因為原始圖像中原本就缺乏足夠的信息。如果仍然想自動生成,可以圍著場景拍攝一系列圖像然後用多視圖幾何理論重建。


很容易,我只是已純屌絲的角度去做的。費時5分鐘。插入10個幀,然後複製到2張照片分別到每個幀里。結果就出來了。(貌似這裡的上傳組件不支持GIF).

http://ww3.sinaimg.cn/bmiddle/83f9baeegw1egt83cajm7g206t08cqbo.gif


這應該算是個典型的Image Based Rendering問題,受 @王小龍 答案的啟發,貢獻個基於光場(Light Field)的辦法,和基於Optical Flow的辦法比起來,光場重現的三維場景會更準確(如果你注意看日本人原文的動圖,左辮子的末梢,左肩旁的黃帶,雙腳的位置等在三維場景中的運動都是不正常的),和 @王小龍 提到的基於Stereo Matching重建三維模型再渲染的辦法比起來光場重建的成像質量會略好一些。先上結果(知乎何時才能支持GIF這種直觀的方式):
http://images.cnitblog.com/blog/609274/201501/201825462357268.gif
再附帶一個現實的例子,用手機採樣的9個不同角度照片

光場插值後的一個移動觀察角度產生的動畫:
http://images.cnitblog.com/blog/609274/201501/201302332192560.gif
詳細些的原理我寫在
漫談計算攝像學 (一):直觀理解光場(Light Field)
這裡也大概提一提:

光場,顧名思義就是光的場。。兩個不同角度拍攝的照片就相當於在兩個不同的位置上採集了兩部分光場,就上圖的例子而言,綠色物體成的像在x軸上,相機在u軸上,兩根綠色實線分別是綠色物體發出的進入兩個相機的光線。所以如果有個虛擬的相機在兩個相機之間的話,只需要把這兩條綠色實線對應的值用插值的方法計算出來賦給入射到虛擬位置的那條光線就可以了。不過為了做到這點有一個問題就是場景中每一個像素對應的深度需要知道,這就是 @王小龍 答案里說的事情。
當然了,答案開頭只說了優點,缺點是和Optical Flow辦法比起來對Occlusion的處理會不好,尤其是需要插值的圖像採樣位置在已有採樣位置「外面」的時候,比如題目里最後動畫的例子。因為光場的辦法是需要考慮三維信息的(深度圖),而深度圖本身在Image Based Rendering範疇就是個不容易的問題。順帶提一句Optical Flow其實也是可以用於深度圖估計的,效果也不好。。


具體原理大家都說了很多。
單就兩張圖片合成連貫動畫來講,AE就能實現這個功能。
下面是我做的一個gif

http://ww4.sinaimg.cn/large/742f9681jw1egu01kjsb3g206t08c4qp.gif

更新:
實現方式是AE里的frame-blending,也就是幀融合。類似於flash里的關鍵幀動畫,詳細可以去google一下,不是很複雜。
這個功能也能將 多張連續拍攝的照片 幀數不高的視頻 做出高速攝影的效果。
簡單易學效果好,讃!


這不是標準的雙目立體視覺進行三維重建?


其實樓主的那個實例視頻是用很多張照片合成的對不,單從樓主提供的兩張感覺根本不可能實現實例視頻啊


應該是用光流法,三維重建的方法生成的動畫會有洞。


雙目三維重建,一二樓都講的很好了啊


3維重建,單獨這兩張圖肯定無法提供有效信息,百度百科和騰訊地圖的3D街景也是全景拍攝合成的,至於重建演算法,應該有很多文獻,了解不多。


這是structure from motion的問題,提供一個google的開源庫:
libmv -

a structure from motion library


樓上說的是光流法,我覺得用三維重建的方法也可以,但我不是做這方面的。。


由於無法到達相關鏈接 所以我的闡述角度 只能從我自己淺薄的知識闡述 從兩張圖結合我們常規性的大概可以測出它的相對空間關係 或者不測也無所謂 在後期軟體中 可以畫出它的一個相對性的三維空間結構位置關係(影視後期這種事情常做) 但是做出題主的GIF動畫就得進行相應的補圖 然後就是進行攝像機動畫 但是角度不能太大 因為進行補圖緣於對素材的理解 好比轉過的角度 頭部遮擋的頭髮 轉過來時應該是個什麼樣子 處理不好就會穿幫 舉個極端的例子就是 這貨轉360度 想不穿幫都費勁(解決辦法是重建模型 但離題就遠了) 而且素材也應該是相對的規則 得能「猜」出來 而且合理 題主如果仔細的看GIF動畫的話 持有白色動物一側的頭髮 臨結束時頭髮拉伸加速 腳也莫名的變形 如果兩張圖拍攝角度差更大的話可能感覺好一些(因為細節信息更多 更好補圖) 這個思路和題主所需要的答案是有區別的 但是我想原理總該是相通的 題主可以從這個角度切入 再看張心欣的回答 也許能更好的理解 他的闡述挺深奧(因為那些式子我不懂啊連怎麼打出來都不知道 讓大方之家笑話了)


推薦閱讀:

如何通過自己的努力進入微軟亞洲研究院工作?
如何把真人照片處理成 GTA 5 的風格?
同一張圖,同樣的寬度和高度,如何分辨圖片質量?
在一個成像系統中,視角和焦距的關係是什麼?視角和空間解析度的關係是什麼?

TAG:動畫 | 圖像處理 | 計算機視覺 |