Unsharp Masking the Depth Buffer with Nuke

Apr 8 2009

animation

這個舊玩意兒,套用在 depth map/buffer 上來做到 image enhancement。

這是個方法簡單到不行(只比 dilation/erosion 複雜一點點),效果還 ok(如果去看投稿論文裏頭的與官網上的影片時,會驚覺怎麼效果這麼好)的研究。工作的需要,我們有同事專職於了解現階段 SSAO 的技術,我們很快地就略過 unsharp masking 這篇論文,可以說根本就是提一下下就不去理會它了,覺得太過於簡單,對於 animation 來說不實用。但也因為另一個巧合,我又回來了,而且還是以 The FoundryNuke 當作測驗平台。

這是一張我自 Stanford 拿的 dragon model 的 rendering.

paper 的論述,他們最重要的發現即是把 unsharp masking 給套用在 depth map/buffer 上頭,透過 depth map 上的不連續性,間接地暗示了圖像中“前後景的關係“。接著就是看你怎麼去利用這個“前後景暗示“的資料了。拿個例子來說:

這裏是 dragon 的一張 depth map。

先對它套用一次 Gaussian Filter/Blur,於是我們得到一張 low-pass-filtered 圖,把這一張圖和原來的 depth map 做個簡單的比較,即會在前景物件與背景場景之間有了「暗示」。我這邊使用了與 paper 裏頭一樣的方法,把 importance map 的正負值以不同的顏色來表示(我使用的顏色好像剛好和 paper 裏的相反),可以很明顯看出透過這個 importance map,在前後景的邊緣有非常有趣的「暗示」。

上頭提及的 importance map,是我個人目前覺得,整篇 paper 的最大貢獻。怎麼說呢? unsharp masking 說穿了,就是把原圖去減掉經過 Gaussian filter 後所剩下的東西,換個說法,有點像是一張圖經過 high pass filter 的結果。因此很自然地在 frequency 比較高的地方(通俗點說法,就是變化大的地方。ex, 對比比較強的地方),就會留下一些東西。但是呢,作者們卻把這個源自 1930 或更早就有人在使用的技術,套用在 depth buffer 上頭,來獲得「深度上變化量大」的資訊,這點就很了不起了。

所以呢,我們如果把原來的圖片,屬於上圖的紅色部分的區域,給它變得稍為暗一些(Ambient Occlusion? Nope!),那就成了如下的樣貌:

換另一個方式來比較,我把原圖與經由處理過後的圖上下並排,可以稍稍看出一些差異來。仔細對照前前一張有紅藍標示的圖,可以更清楚抓出被變暗(darken)的區域即是紅色的區域。當然,我們也可以拿藍色的區域來做點手腳,不過不在目前的討論範圍內。

試驗後我突然注意到,拿這個 Stanford Dragon 來說,如果我有兩張圖,一張是前景去背,一張是只有背景,那麼我其實只要把它們 load 進 Adobe Photoshop 的兩個 layer 裏頭,然後在前景 layer 的 operator 那邊,使用 glow 加上 darken 之類的,就可以做出「前景物件的外圍有些微的變暗」這件事了。也就是說,這篇論文好像又回到「不值一文」的地步!!!

事實說這是個很有趣也可能很吊詭的事。在一些情況下,你是比較容易獲得一張沒有分前後景 layer 外加一張 depth map 的圖的,這個時候,這個方法就很實用。所以問題在於,什麼時候會有這個情況發生呢…?!

最後我放上一連兩張在 Nuke 裏頭的樣貌,以及使用到的 Nuke script

這邊我要再次特別感謝 The Foundry 的大力協助,透過 Joanna 與 Matt 不辭辛勞地一趟又一趟地前來太極影音,我們有機會一點一點了解 Nuke 這個軟體的特點,同時也加快了我了解它 programming 方面的特性,也才有了這次使用 Nuke 來實作這一篇論文的經驗。整個試驗非常成功且快速,我花了兩個小時就完成了需要的試驗,包括為了寫 blog 而刻意的兩三張圖。整體來說,Nuke 是一個高度自由化的軟體,有種“合成界的 Pixar’s RenderMan“的感覺,因為它的高效能、高自由度與經得起 animation/film production 的考驗。太極影音還沒有機會實際證實 Nuke 的能力,不過我們正一步一步探索與接近中,我相信很快,未來的案子就會有它派上用場的地方。

comments powered by Disqus