利用OpenCV進行Tonemapping


背景

最近學習深度學習涉及到了一些HDR圖片的讀取,HDR全稱是High-Dynamic Range,在顯示HDR圖片的時候,如果不進行色調映射,也就是Tone map的話,那顯示出來的HDR圖片就會很暗,所以我們需要映射之后再進行顯示。

方法

方法1

在現有的論文中,一般會有一個tone map公式,這個公式的描述如下:

其中Ih是需要tone map的圖片,μ是一個壓縮的參數,在一般情況下取到5000,這個方法用代碼寫出來就是下面這樣

def tonemapping(pic):
    return np.log(1. + 5000. * pic) / np.log(1. + 5000.)

沒有進行tone map前的HDR圖:

原始HDR圖片

可以看到HDR圖片擁有很多細節,但是不進行映射的話,更本無法展示出來

利用這個方法進行tone map后的效果如圖:

映射后的結果

可以看到圖片的細節已經展示了出來,但是這時候也發現了一個問題,圖片的顏色偏淡,感覺霧蒙蒙的,這和論文里面經過色調映射后的效果有很大的差別,這時候我就開始尋找怎樣進行映射可以展示出圖片的細節,同時圖片的顏色也盡可能的豐富。

方法2

我在尋找的時候,發現了OpenCV在內部已經實現了幾種ToneMap的操作,分別是以下的五種:

cv2.createTonemapDrago()

cv2.createTonemapDurand{}

cv2.createTonemapReinhard{}

cv2.createTonemapMantiuk{}

cv2.createTonemap{}

這幾個函數的關系如下:

這里參考了https://github.com/spmallick/learnopencv/blob/master/hdr/hdr.py里的tone map代碼

# Tonemap using Drago's method to obtain 24-bit color image
print("Tonemaping using Drago's method ... ")
tonemapDrago = cv2.createTonemapDrago(1.0, 0.7)
ldrDrago = tonemapDrago.process(hdrDebevec)
ldrDrago = 3 * ldrDrago
cv2.imwrite("ldr-Drago.jpg", ldrDrago * 255)
print("saved ldr-Drago.jpg")

# Tonemap using Durand's method obtain 24-bit color image
print("Tonemaping using Durand's method ... ")
tonemapDurand = cv2.createTonemapDurand(1.5, 4, 1.0, 1, 1)
ldrDurand = tonemapDurand.process(hdrDebevec)
ldrDurand = 3 * ldrDurand
cv2.imwrite("ldr-Durand.jpg", ldrDurand * 255)
print("saved ldr-Durand.jpg")

# Tonemap using Reinhard's method to obtain 24-bit color image
print("Tonemaping using Reinhard's method ... ")
tonemapReinhard = cv2.createTonemapReinhard(1.5, 0, 0, 0)
ldrReinhard = tonemapReinhard.process(hdrDebevec)
cv2.imwrite("ldr-Reinhard.jpg", ldrReinhard * 255)
print("saved ldr-Reinhard.jpg")

# Tonemap using Mantiuk's method to obtain 24-bit color image
print("Tonemaping using Mantiuk's method ... ")
tonemapMantiuk = cv2.createTonemapMantiuk(2.2, 0.85, 1.2)
ldrMantiuk = tonemapMantiuk.process(hdrDebevec)
ldrMantiuk = 3 * ldrMantiuk
cv2.imwrite("ldr-Mantiuk.jpg", ldrMantiuk * 255)
print("saved ldr-Mantiuk.jpg")

結果如下:

createTonemapDrago

createTonemapMantiuk

createTonemapReinhard

可以看到經過不同的tone map算法,相同的HDR圖片可以產生不同的圖片,相較於上面的方法一,可以看到顏色會相較方法一會豐富很多

想法

為什么論文里面需要使用方法一這樣的tone map方法呢?我的想法是這樣,因為方法一是使用在計算Loss前的,GT和預測值都使用同樣的的公式,所以這個Tonemap公式的作用其實是讓網絡的收斂更加的迅速,因為HDR圖片的范圍是比較窄的,不映射的話計算的Loss就會比較小,網絡的收斂也會比較慢,這一點在論文里面也得到了體現。

所以方法一其實主要的作用是讓計算更加的有效率,而不是最終展示的作用,那么如果需要將結果進行展示的話,可以使用其他的ToneMap方法或者直接使用OpenCV已經實現好的方法。

最后

如果大家有疑問或者發現我的文章有錯誤,都歡迎指出~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM