PythonでOpenCVを使ってHDR画像を生成する

複数のLDR画像からHDR画像を生成する

Python3でOpenCVを使って,複数のLDR画像からHDR画像を生成する.
B4ゼミでやったことのメモ書き的なの.
以下の書いたことの上位互換がOpenCVのtutorial
一応,Debevecさんの論文読んだ時のメモ

環境

  • Python 3.6.8
  • OpenCV 3.3.1
  • NumPy 1.16.2
  • 一応,Jupyterでやっています

処理

自分がやった時は,先輩にもらった3枚のLDR画像を合成した.

モジュールの読み込み

import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams["font.size"] = 18

画像の読み込み

最初に,露出を変えて撮影された3枚の画像を読み込む.
後で,逆露光時間(inverce exposure time)が必要になるのでexifで確認しておく.
windowsであれば,エクスプローラーの表示タブの詳細ウィンドウから露出時間を確認する.(プロパティの詳細からでも見れます)

露出時間
露出時間

ldr1_img = cv2.imread(input_dir + "1_window_evaluative_m1EV.JPG")
ldr2_img = cv2.imread(input_dir + "2_window_evaluative_0EV.JPG")
ldr3_img = cv2.imread(input_dir + "3_window_evaluative_p1EV.JPG")
images = [ldr1_img, ldr2_img, ldr3_img]

IETs = np.asarray([1/80, 1/40, 1/20], dtype=np.float32)

CRFの予測・HDRIの生成

HDRI生成アルゴリズムはカメラ応答関数(CRF: camera response function)を使用する.
今回はDebevecのアルゴリズムを使ってCRFを予測する.

calibrate = cv2.createCalibrateDebevec()
response = calibrate.process(images, IETs)

plt.plot(response[:, 0, 0], color="blue", label="blue")
plt.plot(response[:, 0, 1], color="green", label="green")
plt.plot(response[:, 0, 2], color="red", label="red")
plt.legend();

camera response function
camera response function

merge_debevec = cv2.createMergeDebevec()
hdr_img = merge_debevec.process(images, IETs, response)

Tonemapping

HDR画像をそのまま見ても綺麗に見れない.
なので,LDRの環境でHDRの広いレンジを自然に見れるようにトーンマッピングする.
トーンマッピングも色々な方法が考えられていて,OpenCVにも複数パターン実装されている.

  • 一番単純なやつ
tonemap = cv2.createTonemap(2.2)
ldr_img = tonemap.process(hdr_img)
ldr_img = np.clip(ldr_img*255, 0, 255).astype('uint8')
  • Reinhardさんが考案したやつ(論文)
    createTonemapReinhardドキュメント
    一つ目の引数はgamma値だけど,2.2位が多くのディスプレイに合うらしい.
tonemap = cv2.createTonemapReinhard(2.0, 1.0, 0, 0)
ldr_reinhard_img = tonemap.process(hdr_img)
ldr_reinhard_img = np.clip(ldr_reinhard_img*255, 0, 255).astype('uint8')

一応,保存

cv2.imwrite(output_dir + 'ldr.png', ldr_img)
cv2.imwrite(output_dir + "ldr_reinhard.png", ldr_reinhard_img)

結果

ちょっとトーンマップのパラメータを調整した結果.

result
result