バイラテラルフィルタ(英: Bilateral Filter)とは、画像処理における非線形フィルタの一種である。画像に写った被写体の輪郭などのパターンを保存しながら、細かな画素値の変化を平滑化してぼかすフィルタである。画像のノイズ除去をする目的で提案された。
定義 入力画像と出力画像とすると、バイラテラルフィルタは、以下のように定義される。
ここでとは平滑化パラメータである。 説明 はぼかす強さを決定するパラメータである。このパラメータを大きくするにつれて、出力画像のパターンが強くぼかされる。
はエッジパターン保存特性を決定するパラメータである。このパラメータを小さくするにつれて、出力画像において、エッジパターンがぼかされずに保存される。また、このパラメータを大きくするにつれて、エッジパターンが保存されなくなる。
特に、を非常に大きくした場合では
となることから、この項を無視することができ、
と近似することができる。これは、エッジパターン保存特性を持たないガウシアンフィルタのフィルタカーネルと一致する。
実装 バイラテラルフィルタの1ピクセルあたりの時間計算量はであるため、比較的実行に時間がかかってしまう。このため、計算時間を短縮させる手法が種々提案されている。
以下はnumpyライブラリを用いたpythonによる簡易的な実装例である。
import numpy as np
def BilateralFilter(img_i, img_o, sigma_d, sigma_r,r): n = 2*r+1 var_d = 2*sigma_d**2 var_r = 2*sigma_r**2 for i in range(n): for j in range(n): bilateral = np.zeros((n,n)) img_o[i,j] = 0 for k in range(n): for l in range(n): bilateral[k,l] = np.exp(-(k**2+l**2)/var_d - ((img_i[i,j]-img_i[i+k,j+l])**2)/var_r) img_o[i,j] += bilateral[k,l]*img_i[i+k,j+l] img_o[i,j] /= np.sum(bilateral)Adobe Photoshopでは、表面のぼかし(英:surface blur)という名前でバイラテラルフィルタが実装されている。
OpenCVでは、bilateralFilter(src,dst,d,,)という関数で高速化されたバイラテラルフィルタが実装されている。
関連項目
ガウシアンぼかし 中央値フィルタ ノイズリダクション ガウス雑音 画像処理
脚注 出典