らんらん技術日記

日々の学習メモに

Bilateral Solverをソルブする(第1回)

2月になりましてようやくの更新です。
前回の流れでBilateral Solverの最適化問題を解きたいところですが、ほとんど話が進んでません泣
まず第一にやる気の問題です笑
第二に論文が引用に次ぐ引用となっているのでさっぱり笑
引用の川に流されて漂着した先には「Bilateral grid」の文字が・・・!

(追記:Bilateral gridの全貌は第2回に記載しています。本記事は筆者がアルゴリズムを理解しきれていない時の話です。)

Bilateral gridってなんなのん?

引用先の論文は以下です。

Jiawen Chen著
Real-time Edge-Aware Image Processing with the Bilateral Grid

内容としては、バイラテラルフィルタの応用みたいな感じですかね(適当)。

 A:ところでバイラテラルフィルタて・・・?
 B:スッ「http://imagingsolution.net/imaging/bilateralfilter/
 A:え・・・?
 B:・・・・・。
 (ここが一番わかりやすいと思います。説明がめんどいしー)

 

Bilaterarl Gridは3つのフェイズでもって、入力信号(画像)に対してエッジ保持型平滑処理を適用します。

  1. splat:処理対象の信号を変換して、Bilateral Grid空間上で表す。
  2. blur:Bilateral Grid上の信号をボカす。
  3. slice:信号を逆変換(Bailateral Grid空間→元の空間)して、出力を得る。

splat→blur→sliceの流れを1次元信号で説明すると以下の図になります(論文から)。

f:id:yukirunrun:20160208000106p:plain

特にblueでガウシアンフィルタを使う場合、Bilateral Gridはバイラテラルフィルタと同様の特性を持ちます。各フェイズの数式は以下の通り。

splat:  入力画像 I(x,y)をBilateral Grid上の座標 Γ(i,j,k)に変換する。

     { \displaystyle {\Gamma([x/s_s],[y/s_s],[I(x,y)/s_r]) += (I(x,y),1)}}

ここで[a]はaから一番近い整数の値、{ \displaystyle {s_s}}{ \displaystyle {s_r}}は制御パラメータです。

blur:  ボカシ関数f(x)でぼかす。

     { \displaystyle {\Gamma = f(\Gamma)}}

slice:  元画像とBilateral Gridの情報から、出力画像を復元する。

    (式が書いていないだと・・・!?)

シミュレーションをやってみた

slice処理以外をね!だってわかんないし。
splatとblurだけを試してみました。

1、一次元の入力信号を用意(0~255の値をとるデータを500個)。gnuplotでグラフを表示したのが下。

f:id:yukirunrun:20160208003430p:plain

2、入力信号をBilateral Grid上で表現してみる(splat)。二次元の画像です。{ \displaystyle {s_s=5}}としたので1列には最大で5個の黒い点があります。(今は全部黒色になっていますが、本当は間違っています。点の分布を確かめるための簡易的な表現です。)また{ \displaystyle {s_r=4}}としました。

f:id:yukirunrun:20160208003947p:plain

3、ぼかす(blur)。ガウシアンフィルタをかけました。

f:id:yukirunrun:20160208004554p:plain

本当はこの後にslice処理が続きますが、前述の通りわかりません泣。
以上は、C++言語とopencvでテストしてみました。プログラムに触ったのが実に1月ぶりぐらいということで、コードは晒しません。普段使わないので、コーティングが汚いのです。

今回はここまで

slice処理がわかればエッジ保持型平滑化処理ができそうですが・・・どうなんだろう?ここまでは本当にあっているのか?
次回はこの続きを書いてみます!