台灣大學 數位視覺效果 Project 1 High Dynamic Range Imaging
R03631012 黃揚文 R03631014 徐嘉君
雖然HDR的照片應為相機在同樣地點、情況下拍攝多組曝光時間不同的照片,但因為仍會有手震和快門造成的些微震動,所以藉由Alignment可以將這些些微的震動經由稍微移動照片來消除。本專題採用的為上課介紹的MTB ( Median Threshold Bitmap ) 作校準,本演算法利用影像金字塔的方式(每層圖片都為上一層的四倍)從最小的開始比對,在九宮格內做移動如下圖所示,累計個方向的誤差選擇最小的方向移動之。相較於 尋找Gradient 的作法,較不容易受到不同曝光時間所影像edge的截取。
使用相機
本專題使用的相機為Nikon D3200,鏡頭為kit鏡 (AF-S NIKKOR 18-55mm 1:3.5-5.6G)
開發環境
- Visual Studio 2013 Pro
- Qt 5.4
- OpenCV 3.0 Beta
實作方法
事前校準
雖然HDR的照片因為相機在同樣地點、情況下拍攝不同的多組曝光時間不同的照片,但因為仍會有手震和快門造成的些微動作,所以藉由Alignment可以將這些些微的震動經由稍微移動照片來消除。本專題採用的為上課介紹的Median Threshold Bitmap作校準,本演算法利用影像金字塔的方式(每層圖片都為上一層的四倍)從最小的開始比對,在九宮格內做移動如下圖所示,累計個方向的誤差選擇最小的方向移動之。
(-1, -1) | (0, -1) | (1, -1) |
---|---|---|
(-1, 0) | (0, 0) | (1, 0) |
(-1, 1 ) | (0, 1) | (1, 1) |
建立HDR影像
在建立HDR影像以前利用easyexif (https://github.com/mayanklahiri/easyexif )網路的現成函式庫直接讀取影像的曝光時間。本專題建立HDR影像的方法為上課介紹的Debevec方法,並且將以論文的gsolve MatLab Code為基底轉成C++程式碼,再利用OpenCV提供的 cv::solve()
SVD解 Ax = b 方程解,得到響應曲線 (Recovering response curve)。最後再將所有輸入影像的每個點代入該曲線並乘上權重,最後得到radiance map。
Tone Mapping
因為HDR影像不一定為一般影像中0-255的範圍區間,因此需要轉換成一般圖片格式,許多演算法都要求必須先算出其亮度(intensity),再算出答案。本專題採用兩種方法做試驗,第一個為Durand,另一個為Reinhard
Reinhard
Reinhard先計算了該HDR影像的亮度平均,再套用自定義的白平衡修正,最後再將修正過後的與亮度相除得到一個scale factor,最後再將此矩陣與HDR影像相乘即可得到答案。
Durand
Durand在其個人網頁中有很詳細的步驟
input intensity= 0.2126 * R + 0.7152 * G + 0.0722 * 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)
output = r*log_absolute_scale*10^(log(output intensity))
//Parameters
compressionfactor = (log(5) / log(10.0)) /(max(log(base)) - min(log(base)))
log_absolute_scale = 1.0 / pow(10.0, compression_factor * max_log);
其中的雙線濾波器 (Bilinear filter),我們使用的是OpenCV提供的雙線濾波,並使用作者提供的參數做設定取出圖片的細節,在計算過顏色後,再將細節還原回去。
結果
以下為利用本專題撰寫程式之結果
Reinhard | Durand |
---|---|
![]() |
![]() |
![]() |
![]() |
第一張圖由於日光燈的資訊在下面原始十張圖片中都未有太大變動,因此在重建HDR影像時出現嚴重破損,也對影像重建帶來一定量的影響
原始檔案
1
![]() |
![]() |
![]() |
![]() |
![]() |
---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
2
![]() |
![]() |
![]() |
![]() |
![]() |
---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
作者
黃揚文 (@KKyang) 徐嘉君 (@Chia-ChunHsu)
Support or Contact
可以利用Github提供的issues功能提供我們意見,謝謝!
Reference
- Paul E. Debevec, Jitendra Malik, Recovering High Dynamic Range Radiance Maps from Photographs, SIGGRAPH 1997
- Fredo Durand, Julie Dorsey, Fast Bilateral Filtering for the Display of High Dynamic Range Images, SIGGRAPH 2002
- Reinhard, E., Stark, M., Shirley, P., and Ferwerda, J.A. Photographic tone reproduction for digital images, SIGGRAPH 2002
- 課程講義(MTB, HDR, Tone mapping)