実装内容:
- Bilateral Filter
- Bilateral Grid を使用した Bilateral Filter の高速化
- 元の画像の各座標とその座標における輝度の3次元からなる Bilateral Grid を構成
- 輝度は人の視覚特性に応じて重み付けした \(\frac{77r+151g+28b}{256}\) を使用
- 座標を sigma_space で割り,輝度を sigma_range で割った座標が Bilateral Grid 上での座標に対応
- Bilateral Grid 上で最も近い格子点に輝度の値を足し合わせ,いくつの点が足し合わされたのかも記録
- こうしてできた Bilateral Grid 上でいくつの点が足し合わされているのかも考慮して,半径1の Gaussian Filter を適用
- 元の画像の各座標に対応する Bilateral Grid 上の座標の値を周囲8つの格子点の trilinear interpolation により求める
- 輝度が何倍になったかを計算し,元の座標の RGB それぞれに掛ける
- (20,0,0)のような画素値のときに輝度が5倍されたりすると,(100,0,0)になって元とかなり違う色が表示されてしまうことがある
- Bilateral Filter を使用した Stylization
- Bilateral Filter を適用し,得られた画像に DoG (Difference of Gauusian) で検出したエッジを追加
- Bilateral Filter を使用した Tone Mapping
- HDR 画像を入力として受け取る
- 複数の画像から合成するわけではないので,すでに情報は失われてしまっている
- 本当は露光時間のわかる複数の画像から Debevec 法や Robertson 法を用いて合成し,浮動小数点で表された HDR 画像を使用するべきだが,それらの手法の実装が難しく断念した
- 入力画像に Bilateral Filter をかけて smooth 画像を求め,それを元の画像から引いて detail 画像を得る
- smooth 画像にガンマ補正を適用し,detail 画像と足し合わせて出力
- Rolling Guidance Filter
- 元の画像に Gaussian Filter を適用
- 元の画像の色調とぼかした画像の模様を Joint Bilateral Filter で合成
- 繰り返し元の画像と合成された画像を Joint Bilateral Filter で合成
- Non-Local Means Filter
- 注目画素の周囲 \(7 \times 7\) の領域の画素値を並べた \(7 \times 7 \times 3 = 147\) 次元の特徴ベクトルを定義
- この特徴ベクトルの差の2ノルムの大きさに応じて重み付けをして畳み込む
備考:
- パラメータは基本的にいじらない状態である程度 "いい" 画像が生成可能
- 処理にかかった時間が下に表示されるので,特に Bilateral Grid を使用した Bilateral Filter の処理時間確認などに使用可能
- デフォルトの画像は授業に従い,Man は Stylization,HDR は Tone Mapping,Dog と House は Rolling Guidance Filter,Rock はその他で使用すると良い