画像処理における非局所的平均フィルタ(Non-Local Means Filter, NLMフィルタ) の原理や計算式についてまとめました。
非局所的平均フィルタとは
非局所的平均フィルタ (Non-Local Means Filter, NLMフィルタ) は、画像のノイズ除去を行う空間フィルタの1つです。バイラテラルフィルタと同様、輪郭(エッジ)を保持しながらノイズを除去できる特徴があります。
計算方法
非局所的平均フィルタは、各画素に対して、類似する画素の重み付き平均を計算してノイズを除去します。具体的な手順は以下のとおりです。
① 注目画素とその周囲にある画素(ミニパッチ、部分画像)を取り出します。そして、その部分画像を中心とした局所的な領域を他の注目画素の部分画像と比較し、類似度を計算します。そして、類似度が高いほど、重みを大きくします。類似度は通常、部分画像間のユークリッド距離やガウシアン関数を使って計算します。以下はユークリッド距離を用いたときの類似度の計算式です。
$$ w(i, j) = \exp\left( -\frac{| I(i) – I(j) |^2}{h^2} \right) $$
- $ i $: 中心の画素の位置
- $ j $: 注目する近傍画素の位置
- $ I(i) $: 位置 ( i ) における画素値
- $ I(j) $: 位置 ( j ) における画素値
- $ h $: フィルタの類似度パラメータ(ノイズ除去の強度に影響)
- $ w(x, y) $: 位置$ x $ と $ y $ の画素間の重み
② 計算された重みを使って、中央の画素の値を他の画素の値の重み付き平均として更新します。更新された重みを用いて。フィルタ処理した後の位置 $ i $ における画素値$ \hat{I}(i) $は以下の式で計算できます。
$$ \hat{I}(i) = \frac{1}{\sum_{j \in \Omega} w(i, j)} \sum_{j \in \Omega} I(y) \cdot w(i, j) $$
ここで、$\Omega$は近傍領域です。
非局所的平均フィルタのパラメータ
- 近傍領域$\Omega$
- 比較する近傍画素の範囲を指定します。範囲を大きくするほど、より多くの周辺画素を考慮して計算するため、計算量が大きくなります。コストが増えます。
- 類似度パラメータ(h)
- 類似度を計算する際のスケール。大きな値ほど平滑化が強くなる反面、輪郭も失われやすくなる。
関連ページ
プログラミングによる実装例について以下ページで解説しています。

【Python/OpenCV】バイラテラルフィルタ(Bilateral Filter)でノイズ除去
Python版OpenCVでバイラテラルフィルタ(Bilateral Filter)を実装し、画像のノイズを除去する方法をソースコード付きで解説します。

【画像処理超入門】アルゴリズムの仕組みと実装方法を簡単に解説
画像処理超アルゴリズムの仕組みとプログラミングによる実装方法を簡単に解説します。
コメント