バイラテラルフィルタの原理・特徴・計算式

画像処理におけるバイラテラルフィルタ(Bilateral Filter)の原理や計算式についてまとめました。

バイラテラルフィルタとは

バイラテラルフィルタ(Bilateral Filter)は、画像のノイズ除去に用いられる空間フィルタの1つです。ノイズ除去を行いつつ輪郭を保持する優れた特性があります。これを実現するために、「空間的な距離」と「画素値の差」の両方に基づいて重み付けを行います。つまり、「画素値の差」が大きいところは、重みを小さくすることで、輪郭部分を保持します。

以下は、天体写真(オリオン大星雲、M42)に対してバイラテラルフィルタを適用した結果です。

■入力画像(左)と出力画像(右)

背景ノイズを除去しつつ、星雲の輪郭は保持されています。

カーネルと計算式

バイラテラルフィルタのカーネルは、「空間的な距離の差」と「画素値の差(明るさの差)」の両方に基づいて重み付けを行い、それらの2つの重みを掛け合わせて最終的な重みとします。具体的な計算方法は以下のとおりです。

① 「空間的な距離の差」に基づくガウス分布で重みを計算します。

ws(i,j)=e(xixj)2+(yiyj)22σs2 w_{s}(i,j) = e^{-\frac{(x_i – x_j)^2 + (y_i – y_j)^2}{2\sigma_s^2}}

ここで、(xi,yi)(x_i, y_i)(xj,yj)(x_j, y_j)は注目画素i i と その近傍にある画素j j のxy座標、σs \sigma_s は空間フィルタの標準偏差です。これにより、注目画素との距離が近い画素ほど強調されます。

② 「画素値の差」に基づくガウス分布で重みを計算します。

wr(i,j)=e(IiIj)22σr2 w_{r}(i,j) = e^{-\frac{(I_i – I_j)^2}{2\sigma_r^2}}

ここで、 Ii I_i Ij I_j は注目画素 i i とその近傍にある画素 j j の画素値、 σr \sigma_r は輝度フィルタの標準偏差です。これにより、注目画素との画素値の差が大きい(輪郭部分)ほど重みが小さくなります。

③ 最終的なバイラテラルフィルタのカーネの要素w(i,j)w(i,j)は、これら2つの重みの積で計算されます。

w(i,j)=ws(i,j)wr(i,j) w(i,j) = w_{s}(i,j) \cdot w_{r}(i,j)

これにより、注目画素との距離が近く、かつ画素値の差が小さい画素に対してぼかし効果が強くなり、ノイズ除去の効果が大きくなります。つまり、輪郭部分はぼかし効果を弱めることで、輪郭部分を保持しながらノイズ除去を行うことができます。

関連ページ

プログラミングによる実装例について以下ページで解説しています。

【Python/OpenCV】バイラテラルフィルタ(Bilateral Filter)でノイズ除去
Python版OpenCVでバイラテラルフィルタ(Bilateral Filter)を実装し、画像のノイズを除去する方法をソースコード付きで解説します。
【画像処理超入門】アルゴリズムの仕組みと実装方法を簡単に解説
画像処理超アルゴリズムの仕組みとプログラミングによる実装方法を簡単に解説します。
この記事を書いた人
西住技研

在学中はシステム制御理論や画像処理、機械学習を専攻分野として研究していました。就職後は、プログラミング(Python)を活用したデータ分析や作業自動化に取り組み、現在に至ります。そこで得たノウハウをブログで発信しています。
YoutubeX(旧Twitter)でも情報発信中です

西住技研をフォローする
画像処理

コメント