2017-06-24 - 2018-05-30 (update) |
|
|
*guided filter とは
エッジを残したまま画像を平滑化するためのフィルタです.同系統の効果のあるbilateral filterに比べ,高速に処理を行うことができます.図1は,guided filterを適応した例を示します.
[img:j9wx]
{{small:図1 左から,入力画像,gaussian filterの結果,guided filterの結果}}
文献[1][2]ではアルゴリズムと実験結果,[3]では処理をより高速にするための方法が解説されています.
{{small:[1]K.He, J.Sun, and X.Tang, "Guided Image Filtering", European Conference on Computer Vision (ECCV), 2010}}
{{small:[link:http://kaiminghe.com/publications/eccv10guidedfilter.pdf] }}
{{small:[2]K.He, J.Sun, and X.Tang, "Guided Image Filtering", IEEE Transactions on Pattern Analysis and Machine Intelligence(PAMI), 2013}}
{{small:[link:http://kaiminghe.com/publications/pami12guidedfilter.pdf] }}
{{small:[3]K.He, J.Sun, "Fast Guided Filter", arXiv, 2015}}
{{small:[link:https://arxiv.org/abs/1505.00996] }}
*サンプルコード (C++)
ライブラリ:[link:simplesp]
サンプルコード:simplesp/sample/sp/filter
Lennaの画像に対して,guided filterを含む各種フィルタを適応します.
*ガイド画像
guided filterでは,まずガイド画像{$I$}というものを定義します.ガイド画像{$I$}は,各部の平滑化の程度を決める画像で,そこでは強く平滑化したい部分が似た画素値になっていることを期待します.ほとんどの場合,元の画像をガイド画像{$I$}と設定します.
入力画像とガイド画像の例を図2と図3に示します.
[img:lhz3]
{{small:図2 入力画像{$p$}=ガイド画像{$I$} }}
[img:krcj]
{{small:図3 入力画像{$p$}≠ガイド画像{$I$} }}
図3の例では,2値のマスク画像を入力画像{$p$}として設定します.こうすることで,境界部分の数値を調整した出力画像を作りだすこともできます.
マスク画像は背景差分や手動で設定する方法がありますが,例えば羽毛の部分などのよに単純な2値化がむつかしい箇所があります.そのような場合,まずは概略的にマスク画像を設定して,次にGuided Filterを使って調整する手順が有効です.
bilateral filterでも同じようなことができますが,こちらは処理時間が掛かります.実験結果の比較は文献[1][2]にいくつか説明されていますので参考にしてください.
*アルゴリズム
ガイド画像{$I$}と出力画像{$q$}の関係は,2つのパラメータ{$a_k$}と{$b_k$}を使って次のように表現できると仮定します.
{$q_i = a_k I_i + b_k, \forall i \in \omega_k$}
ここで,{$i$}は各画素の番号,{$w_k$}は{$i$}の周辺領域のブロックを表します.guided filterでは,この式の{$a_k$}と{$b_k$}を求めることで,出力画像を計算します.
{$a_k$}と{$b_k$}を求めるために,入力画像{$p_i$}と出力画像{$p_i$}の差を表現する次のような目的関数を考えます.
{$ E(a_k, b_k)=\sum_{i \in \omega_k} ((q_i - p_i)^2 + \epsilon a_k^2) = \sum_{i \in \omega_k} ((a_k I_i + b_k - p_i)^2 + \epsilon a_k^2) \tag{1} $}
ここで,{$\epsilon$}は,正則化のための係数で,{$a_k$}が大きくなりすぎないように調整します.式(1)を,正則化最小二乗法に基づいて解くと,次の解が得られます.
{$$a_k = \frac{\frac{1}{|\omega|}\sum_{i \in \omega_k} I_i p_i + \mu_k \bar{p}_k}{\sigma _k^2 + \epsilon}$$}
{$$b_k = \bar{p}_k - a_k \mu_k$$}
ここで,{$\mu_k$}と{$\sigma_k$}は,ガイド画像のブロック内の平均と分散で,次の式で計算できます.
{$ \mu_k = \frac{1}{|\omega|} \sum_{i \in \omega_k} I_i $}
{$ \sigma_k^2 = \frac{1}{|\omega|} \sum_{i \in \omega_k} (I_i - \mu_k) ^2 $}
なお,求めた{$a_k$}と{$b_k$}に含まれるノイズの程度を抑えるため,平均化した{$\bar{a}_k$}と{$\bar{b}$}を利用して出力を求めます.
{$$ q_i = \bar{a}_k I_i + \bar{b}_k, \forall i \in \omega_k $$}
{$ \bar{a}_k = \frac{1}{|\omega|} \sum_{k \in \omega_i} a_k, \bar{b}_k = \frac{1}{|\omega|} \sum_{k \in \omega_i} b_k $}
以上の計算は,box filterと画素の加減算と乗算でできていて,これが高速な処理を可能にします.
{{small:box filterはブロック内の平均値を計算します.この計算はintegral imageと呼ばれるデータ構造を利用することで,高速に計算することも可能です}}
>> ご意見・ご質問など お気軽にご連絡ください.info