Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

imnlmfilt

イメージの非局所平均フィルター処理

説明

J = imnlmfilt(I) は、非局所平均ベースのフィルターをグレースケール イメージまたはカラー イメージ I に適用し、結果のイメージを J に返します。

J = imnlmfilt(I,Name,Value) は、名前と値のペアを使用して、非局所平均フィルターの動作を変更します。

[J,estDoS] = imnlmfilt(___) はノイズ除去後のピクセル値の推定に使用される平滑化の度合い estDoS も返します。

すべて折りたたむ

グレースケール イメージを読み取ります。

I = imread('cameraman.tif');

関数 imnoise を使用して、分散 0.0015 のゼロ平均のガウス ホワイト ノイズをイメージに追加します。

noisyImage = imnoise(I,'gaussian',0,0.0015);

非局所平均フィルター処理によりイメージからノイズを除去します。関数 imnlmfilt は、イメージ内のノイズの標準偏差に基づいて平滑化の度合いを推定します。

[filteredImage,estDoS] = imnlmfilt(noisyImage);

ノイズを含むイメージ (左) と非局所平均フィルター済みのイメージ (右) をモンタージュとして表示します。推定した平滑化の度合い estDoS を Figure のタイトルに表示します。

非局所平均フィルターは入力イメージからノイズを除去しますが、人物や建物のシルエットのような強いエッジの鮮鋭度は保たれます。この関数はイメージの前景にある芝生のようなテクスチャ領域も平滑化します。ノイズを含むイメージに比べると細部が失われます。

montage({noisyImage,filteredImage})
title(['Estimated Degree of Smoothing, ', 'estDoS = ',num2str(estDoS)])

カラー イメージを読み取ります。

imRGB = imread('peppers.png');

関数imnoiseを使用して、ゼロ平均で分散 0.0015 のガウス ホワイト ノイズをイメージに追加します。ノイズを含む RGB イメージを表示します。

noisyRGB = imnoise(imRGB,'gaussian',0,0.0015);
imshow(noisyRGB)

ノイズを含む RGB イメージを L*a*b 色空間に変換します。非局所平均フィルターが知覚的に類似した色を平滑化します。

noisyLAB = rgb2lab(noisyRGB);

ノイズを含む背景から均一な L*a*b パッチを抽出し、ノイズ標準偏差を計算します。

roi = [210,24,52,41];
patch = imcrop(noisyLAB,roi);

この L*a*b パッチで、原点からのユークリッド距離 edist を計算します。その後、edist の標準偏差を計算し、ノイズを推定します。

patchSq = patch.^2;
edist = sqrt(sum(patchSq,3));
patchSigma = sqrt(var(edist(:)));

'DegreeOfSmoothing' 値をパッチの標準偏差よりも大きくなるように設定します。非局所平均フィルター処理を使用してノイズを含む L*a*b* イメージをフィルター処理します。

DoS = 1.5*patchSigma;
denoisedLAB = imnlmfilt(noisyLAB,'DegreeOfSmoothing',DoS);

フィルター処理された L*a*b* イメージを RGB 色空間に変換します。フィルター処理された RGB イメージを表示します。

denoisedRGB = lab2rgb(denoisedLAB,'Out','uint8');
imshow(denoisedRGB)

ノイズを含む RGB イメージ (左) のパッチと非局所平均フィルター済みの RGB イメージ (右) の同じパッチを比較します。

roi2 = [178,68,110,110];
montage({imcrop(noisyRGB,roi2),imcrop(denoisedRGB,roi2)})

入力引数

すべて折りたたむ

フィルター処理するイメージ。mn 列の 2 次元グレースケール イメージまたは m x n x 3 の 2 次元カラー イメージとして指定します。I のサイズは 21 行 21 列以上でなければなりません。

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: J = imnlmfilt(I,'DegreeOfSmoothing',10);

平滑化の度合い。'DegreeOfSmoothing' と正の数値から構成されるコンマ区切りのペアとして指定します。この値が大きくなると、結果のイメージ J の平滑化が大きくなります。'DegreeOfSmoothing' を指定しない場合、既定値はイメージから推定されたノイズの標準偏差になります。詳細については、既定の平滑化の度合いを参照してください。

検索ウィンドウ サイズ。'SearchWindowSize' と正の奇数 s で構成されるコンマ区切りのペアとして指定します。あるピクセルの類似の近傍の検索は、そのピクセルの周囲にある ss 列の領域に制限されます。SearchWindowSize は時間に関して線形にパフォーマンスに影響します。SearchWindowSize は入力イメージ I のサイズより大きくすることはできません。

比較ウィンドウ サイズ。'ComparisonWindowSize' と正の奇数 c で構成されるコンマ区切りのペアとして指定します。関数 imnlmfilt は、ピクセルの周囲の cc 列の近傍を使用して類似度の重みを計算します。ComparisonWindowSizeSearchWindowSize 以下でなければなりません。詳細については、ノイズ除去後のピクセル値の推定を参照してください。

出力引数

すべて折りたたむ

非局所平均フィルター処理されたイメージ。入力イメージ I とサイズとデータ型が同じである 2 次元グレースケール イメージまたは 2 次元カラー イメージとして返されます。

推定した平滑化の度合い。正の数値として返されます。DegreeOfSmoothing を指定した場合、imnlmfilt は同じ値を estDoS に返します。それ以外の場合、imnlmfilt既定の平滑化の度合いを使用して推定した既定の平滑化の度合いを返します。

ヒント

  • RGB イメージ内の知覚的に近い色を平滑化するには、rgb2lab を使用してそのイメージを CIE L*a*b* 色空間に変換してから、非局所平均フィルターを適用します。結果を表示するには、まず lab2rgb を使用して、フィルター処理された L*a*b* イメージを RGB 色空間に変換します。

  • I のデータ型が double である場合、計算はデータ型 double で実行されます。それ以外の場合、計算はデータ型 single で実行されます。

アルゴリズム

すべて折りたたむ

既定の平滑化の度合い

'DegreeOfSmoothing' の既定値はイメージから推定されたノイズの標準偏差です。標準偏差を推定するために、imnlmfilt は、J. Immerkær [2] により提唱された 3 行 3 列のフィルターを使用してイメージを畳み込みます。I がカラー イメージの場合、'DegreeOfSmoothing' の既定値はチャネル全体で平均化されたノイズの標準偏差です。

ノイズ除去後のピクセル値の推定

非局所平均フィルター処理アルゴリズムは、以下の手順を使用してピクセル p のノイズ除去後の値を推定します。

  1. 検索ウィンドウ内の特定のピクセル q について、pq を囲む cc 列の比較ウィンドウ内にあるピクセル値間の重み付きユークリッド距離を計算します。カラー イメージの場合、ユークリッド距離の計算にすべてのチャネルを含めます。

    重みは減少する指数関数であり、その減衰率は 'DegreeOfSmoothing' の 2 乗で決まります。イメージにノイズが含まれる場合、'DegreeOfSmoothing' は大きくなり、すべてのピクセルがユークリッド距離の計算に寄与します。イメージにほとんどノイズがない場合、'DegreeOfSmoothing' は小さくなり、類似値を持つピクセルのみがユークリッド距離の計算に寄与します。

    結果は p の近傍と q の近傍の類似度を示す数値スカラーになります。

    メモ

    A. Buades らによる実装 [1] では、2 つの比較ウィンドウ間のユークリッド距離は cc 列のガウス カーネルで畳み込みが行われます。この畳み込みでは、比較ウィンドウの中心に近いピクセルは、ピクセル値間のユークリッド距離に対する重みが大きくなります。関数 imnlmfilt は計算効率のために、この手順を省略します。

  2. ss 列の検索ウィンドウ内にある他の各ピクセルについてこの計算を繰り返して、ピクセル p と他の各ピクセルの間の重み付きユークリッド距離を求めます。結果は p の近傍と検索ウィンドウ内の他の近傍間の類似度を示す ss 列の類似度行列になります。

  3. 類似度行列を正規化します。

  4. 正規化された類似度行列の重みを使用して、ピクセル p を囲む ss 列の検索ウィンドウ内のピクセル値の加重平均を計算します。結果は p のノイズ除去後の値になります。

参照

[1] Buades, A., B. Coll, and J.-M. Morel. "A Non-Local Algorithm for Image Denoising." 2005 IEEE® Computer Society Conference on Computer Vision and Pattern Recognition. Vol. 2, June 2005, pp. 60–65.

[2] Immerkær, J. "Fast Noise Variance Estimation." Computer Vision and Image Understanding. Vol. 64, Number 2, Sept. 1996, pp. 300–302.

拡張機能

バージョン履歴

R2018b で導入

すべて展開する