PythonでOpenCVを使ってHDR画像を生成する
複数のLDR画像からHDR画像を生成する
Python3でOpenCVを使って,複数のLDR画像からHDR画像を生成する.
B4ゼミでやったことのメモ書き的なの.
以下の書いたことの上位互換がOpenCVのtutorial.
一応,Debevecさんの論文読んだ時のメモ.
環境
処理
自分がやった時は,先輩にもらった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();
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')
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)
結果
ちょっとトーンマップのパラメータを調整した結果.