VFX Project 1: High Dynamic Range Imaging

B95902001 資工四 黃昱翔
B95902006 資工四 屠 愚

[Part 1: Taking Photographs]  [Part 2: Image Alignment]  [Part 3: HDR Assembling]  [Part 4: Tone Mapping]  [Downloads]  [References]


Our best result!

Part 1: Taking Photographs

我們使用的是實驗室提供的Canon PowerShot G7,並使用PSRemote來用電腦控制拍攝。


Part 2: Image Alignment (BONUS)

Why alignment?

HDR所需的Source Images必須都是同一場景,一個Pixel的偏移都會造成結果得不理想。Alignment的功用在於將人為(Ex:手震)或者機器(Ex:快門的震動)所造成的影像偏移給調整回來。

Implementation

(a)輸入影像的資訊(另外寫在一個txt檔中)

格式: 第一行是一個整數n(幾張圖片)、第二行是Source image資料夾、第三行是out存到哪個資料夾、再來有n行是檔名(要有附檔名)

(b)跑迴圈,用第i+1張圖片去對齊第i張圖片

(c)對齊的演算法

參考[1]的做法,使用MTB(Median Threshold Bitmap) 的方法做Alignment。

這個演算法是用遞迴的方式做的,每次都把圖片縮小成1/2倍。從底層(最小)開始,往{(-1, -1),(-1, 0), (-1, 1), (0,-1), (0, 0), (0, 1), (1,-1), (1, 0), (1, 1)} 這九個方向做移動,找出其中最”符合”的一個移動方向調整之。傳回上層。

判定”符合”的方法:將img2的threshold bitmap移動過後,與img1的threshold bitmap做XOR。因為XOR代表「相異」,所以此時1的個數加總越小代表越”符合”。由於MTB會有些許誤差導致Thresholding後有些模稜兩可的pixels會被binarize到相反的值影響結果。所以用兩個步驟修正,將上一步的結果與img1’s exclusion bitmap, img2’s shifted exclusion bitmap做AND。此步可另模稜兩可的pixels不被採計。 Exclusion Bitmap定義是將模稜兩可的區域(Pixel Intensity ? Threshold +- N | N=User Define)另為0,其餘為1。

Results

請連到這裡看~

Part 3: HDR Assembling

Implementation

基本上就是根據上課slide和[2]所介紹的演算法去實作。

首先我們也是從一個txt檔去讀入圖片的資訊,格式是圖片張數n、再來n行是檔名和快門時間、最後一行是結果的radiance map的檔名。再來我們用OpenCV 2.0製作GUI,用人工的方式去挑取值用的pixel。然後就是最重要的填Ax=b的矩陣們,我們是對RGB分別去做的,weighting function和填矩陣的方式都是按照上課slide和[2]定義的。用SVD解Ax=b是使用OpenCV 2.0的cvSolve()涵式。最後可以分別得到RGB的x矩陣,他們的前256項就是g(Z)。經過normalize之後就可以重建一張HDR的radiance map。


Part 4: Tone Mapping (BONUS)

Why tone mapping?

因為HDR的圖片範圍通常遠超過一般圖片的0~255的範圍,故需要做一些轉換。大意上就像是(R',G',B') = (L'*(R/L), L'*(G/L), L'*(B/L)),加'的表示是新的,L表示luminance,或者說是intensity。我們這裡是使用XYZ color space的Y項來做為L的值。所以這部份的目標就是要算出新的L'去轉換part 3的radiance map來用0~255呈現HDR的效果。

Implementation

我們實作的是利用bilateral filter的方法,也就是在[3]中提到的方法。

利用Part 3產生的radiance map,我們先計算出intensity,如上面所提到的,使用XYZ中的Y項作為intensity。high level概念如下[5]:

input intensity = 0.212671 * R + 0.715160 * G + 0.072169 * B;
r=R/(input intensity), g=G/input intensity, B=B/input intensity
log(base) = Bilateral(log(input intensity))
log(detail) = log(input intensity) - log(base)
log(output intensity) = log(base) * compressionfactor + log(detail) - log(absolute_scale)
R output = r*10^(log(output intensity)), G output = g*10^(log(output intensity)), B output = b*10^(log(output intensity))

其中compressionfactor = log(targetContrast)/(max(log(base)) - min(log(base)))
absolute_scaletargetContrast是可變的參數,在[3]中作者建議targetContrast用5,而log(absolute_scale)則用max(log(base))*compressionfactorn。target contrast是控制結果的contrast(愈大對比愈大),而absolute scale會影響整體亮度(愈大整體愈暗)。

Results

在我們的幾個結果中,在光源(尤其是太陽)部分會有錯誤,後來發現其實[3]好像是處理diffuse部分,所以強光和specular就會有問題(我們的猜測...)。我們有試過修改weighting function,讓255和0不會是0(就是都加1),結果其實沒差多少,因為像太陽最亮的部分都是(255, 255, 255), 所以weight就會比旁邊(250, 250, 250)的小很多,所以還是沒有辦法修正。

然後我們的bilateral filter是陽春版的filter,非常非常的慢orz。所以我們使用小的spatial sigma(因為這關係到filter的kernel大小,且kernel大小影響非常大),並將原照片(1600x1200)縮小成1/4(800x600)再去做(大圖放在下面每個作品download連結的original_size資料夾內)。spatial sigma的部分我們大多使用5或7,結果相差不太大。此外以下結果我們的targetContrast和absolute_scale都是用預設值。


* Our Best Result * [download]

Other Results
[download]

[download]

[download]

[download]

Downloads

所有程式皆在Windows環境下,使用Dev C++開發,利用到了gil2、OpenCV 2.0、GSL(測試用)

Part 2

Source code: alignment.cpp
Executable: alignment.exe
Input: alignment list檔名(內容範例)
Output: shift好的圖檔

Part 3

Source code: hdr.cpp
Executable: hdr.exe
Input: (a)img_list.txt 圖片資訊(input/output檔名, 快門時間)(範例); (b)nPixels以及手動選nPixels個pixel來取值;
Output: (a)r_curve.txt, g_curve.txt, b_curve.txt(RGB的分別g(Z) curve); (b)一張.hdr格式的radiance map

Part 4

Source code: tonemapping.cpp
Executable: tonemapping.exe
Input: (a)radiance map檔名; (b)result檔名(.hdr和.jpg); (c)color sigma; (d)spatial sigma; (e)targetContrast; (f)absolute_scale
Output: (a)一張.hdr格式的result; (b)一張.jpg的result

References

  1. Greg Ward, Fast, Robust Image Registration for Compositing High Dynamic Range Photographs from Handheld Exposures, 2003
  2. Paul E. Debevec, Jitendra Malik, Recovering High Dynamic Range Radiance Maps from Photographs, SIGGRAPH 1997
  3. Fredo Durand, Julie Dorsey, Fast Bilateral Filtering for the Display of High Dynamic Range Images, SIGGRAPH 2002
  4. Jack Tumblin, Greg Turk, LCIS: A Boundary Hierarchy for Detail-Preserving Contrast Reduction, SIGGRAPH 1999
  5. http://people.csail.mit.edu/fredo/PUBLI/Siggraph2002/ FAQ and corrigendum
  6. Course slides(High dynamic range images, Tone mapping)