バイラテラルフィルタ; Bilateral Filter
概要
バイラテラルフィルタは平滑フィルタの一つで、ガウシアンフィルタに加え色距離による重み付けを加えたものである。アニメ調など輪郭がはっきりした画像のノイズを消すフィルタとしては非常に性能が良い。
空間フィルタについてはこちらを参照のこと。
重み
バイラテラルフィルタにおける重み\(w_{i j}\)は以下で与えられる。\(g_{x \ y}\)は座標\(x, y\)におけるピクセル、\(\sigma_1 \)が大きいほど位置に対するぼかしが大きくなり、\(\sigma_2 \)が大きいほど色差に対するぼかしが大きくなる。
\(\quad \displaystyle w_{i j} = exp \left( -\frac{i^2 + j^2}{2 \sigma_1} \right) exp \left( -\frac{{|g_{x \ y} - g_{x+i \ y+j}|}^2}{2 \sigma_2} \right) \)
結果
ソースコード
GraphicRGB src_graph, dst_graph;
ImageIO.Read(out src_graph, "graph/pepper.png");
var filter = new FilterAverage(3, (x, y) => Math.Exp(-(x * x + y * y) / 2.5));
Func<double, double> cr_weight = (dist) => Math.Exp(-dist / 0.25);
dst_graph = Filtering.SmoothWithColorWeightFiltering(src_graph, filter, cr_weight);
ImageIO.Write(dst_graph, "graph/pepper_bilateral.png");
関連項目
RGB空間
RGBグラフィックおよびその入出力
フィルタ
グレースケール
ガウシアンフィルタ
モーションブラーフィルタ
微分フィルタ
ソーベルフィルタ
鮮鋭化フィルタ