Bilateral Solverをソルブする(第1回)
2月になりましてようやくの更新です。
前回の流れでBilateral Solverの最適化問題を解きたいところですが、ほとんど話が進んでません泣
まず第一にやる気の問題です笑
第二に論文が引用に次ぐ引用となっているのでさっぱり笑
引用の川に流されて漂着した先には「Bilateral grid」の文字が・・・!
(追記:Bilateral gridの全貌は第2回に記載しています。本記事は筆者がアルゴリズムを理解しきれていない時の話です。)
Bilateral gridってなんなのん?
引用先の論文は以下です。
Real-time Edge-Aware Image Processing with the Bilateral Grid
内容としては、バイラテラルフィルタの応用みたいな感じですかね(適当)。
A:ところでバイラテラルフィルタて・・・?
B:スッ「http://imagingsolution.net/imaging/bilateralfilter/」
A:え・・・?
B:・・・・・。
(ここが一番わかりやすいと思います。説明がめんどいしー)
Bilaterarl Gridは3つのフェイズでもって、入力信号(画像)に対してエッジ保持型平滑処理を適用します。
- splat:処理対象の信号を変換して、Bilateral Grid空間上で表す。
- blur:Bilateral Grid上の信号をボカす。
- slice:信号を逆変換(Bailateral Grid空間→元の空間)して、出力を得る。
splat→blur→sliceの流れを1次元信号で説明すると以下の図になります(論文から)。
特にblueでガウシアンフィルタを使う場合、Bilateral Gridはバイラテラルフィルタと同様の特性を持ちます。各フェイズの数式は以下の通り。
splat: 入力画像 I(x,y)をBilateral Grid上の座標 Γ(i,j,k)に変換する。
ここで[a]はaから一番近い整数の値、とは制御パラメータです。
blur: ボカシ関数f(x)でぼかす。
slice: 元画像とBilateral Gridの情報から、出力画像を復元する。
(式が書いていないだと・・・!?)
シミュレーションをやってみた
slice処理以外をね!だってわかんないし。
splatとblurだけを試してみました。
1、一次元の入力信号を用意(0~255の値をとるデータを500個)。gnuplotでグラフを表示したのが下。
2、入力信号をBilateral Grid上で表現してみる(splat)。二次元の画像です。としたので1列には最大で5個の黒い点があります。(今は全部黒色になっていますが、本当は間違っています。点の分布を確かめるための簡易的な表現です。)またとしました。
3、ぼかす(blur)。ガウシアンフィルタをかけました。
本当はこの後にslice処理が続きますが、前述の通りわかりません泣。
以上は、C++言語とopencvでテストしてみました。プログラムに触ったのが実に1月ぶりぐらいということで、コードは晒しません。普段使わないので、コーティングが汚いのです。
今回はここまで
slice処理がわかればエッジ保持型平滑化処理ができそうですが・・・どうなんだろう?ここまでは本当にあっているのか?
次回はこの続きを書いてみます!