Main Content

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

imbilatfilt

ガウス カーネルを使用する、イメージのバイラテラル フィルター処理

説明

J = imbilatfilt(I) はエッジを保存するガウス バイラテラル フィルターをグレースケールまたは RGB イメージ I に適用します。

J = imbilatfilt(I,degreeOfSmoothing) は平滑化量を指定します。degreeOfSmoothing が小さい値の場合、imbilatfilt は小さい分散 (一様な領域) をもつ近傍を平滑化し、強いエッジなどの大きい分散をもつ近傍は平滑化されません。degreeOfSmoothing の値を増やすと、imbilatfilt は一様な領域と大きい分散をもつ近傍の両方を平滑化します。

J = imbilatfilt(I,degreeOfSmoothing,spatialSigma) は空間ガウス平滑化カーネルの標準偏差 spatialSigma も指定します。spatialSigma の値を大きくすると、離れた近傍ピクセルの寄与が増え、実質的に近傍サイズが増加します。

J = imbilatfilt(___,Name,Value) は、名前と値のペアを使用して、バイラテラル フィルターの動作を変更します。

すべて折りたたむ

グレースケール イメージを読み取り、それを表示します。空の領域に水平のすじ状のアーティファクトが見られます。

I = imread('cameraman.tif');
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

空の領域のイメージのパッチを検査します。ノイズの分散を近似する、パッチの分散を計算します。

patch = imcrop(I,[170, 35, 50 50]);
imshow(patch)

Figure contains an axes object. The axes object contains an object of type image.

patchVar = std2(patch)^2;

バイラテラル フィルターでイメージをフィルター処理します。平滑化の度合いをノイズの分散よりも大きくなるように設定します。

DoS = 2*patchVar;
J = imbilatfilt(I,DoS);
imshow(J)
title(['Degree of Smoothing: ',num2str(DoS)])

Figure contains an axes object. The axes object with title Degree of Smoothing: 51.9395 contains an object of type image.

すじ状のアーティファクトは減少しますが、なくなることはありません。平滑化を改善するには、spatialSigma の値を 2 に増やし、離れた近傍のピクセルがガウス平滑化カーネルよりも寄与が大きくなるようにします。これが実質的に、バイラテラル フィルターの空間範囲を増やします。

K = imbilatfilt(I,DoS,2);
imshow(K)
title(['Degree of Smoothing: ',num2str(DoS),', Spatial Sigma: 2'])

Figure contains an axes object. The axes object with title Degree of Smoothing: 51.9395, Spatial Sigma: 2 contains an object of type image.

空の領域のすじ状のアーティファクトがうまく削除されています。人物のシルエットのような強いエッジの鮮鋭度やイメージの前景にある芝生のようなテクスチャ領域は保たれます。

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

imRGB = imread("coloredChips.png");
imshow(imRGB)

Figure contains an axes object. The axes object contains an object of type image.

イメージを L*a*b* 色空間に変換します。バイラテラル フィルターが知覚的に類似した色を平滑化します。

imLAB = rgb2lab(imRGB);

シャープなエッジがないパッチを抽出します。L*a*b* 色空間で、原点からのユークリッド距離の分散を計算します。

patch = imcrop(imLAB,[34,71,60,55]);
patchSq = patch.^2;
edist = sqrt(sum(patchSq,3));
patchVar = std2(edist).^2;

バイラテラル フィルターを使用して L*a*b 色空間のイメージをフィルター処理します。DegreeOfSmoothing 値をパッチの分散よりも大きくなるように設定します。

DoS = 2*patchVar;
smoothedLAB = imbilatfilt(imLAB,DoS);

イメージを RGB 色空間に変換し直して、平滑化されたイメージを表示します。

smoothedRBG = lab2rgb(smoothedLAB,"Out","uint8");
montage({imRGB,smoothedRBG})
title("Original Image vs. Filtered Image with Degree of Smoothing: "+num2str(DoS))

Figure contains an axes object. The axes object with title Original Image vs. Filtered Image with Degree of Smoothing: 7.9771 contains an object of type image.

チップの各色と黒のペンはさらに一様に表示されますが、テーブルの水平方向の粒状感がまだ見られます。フィルターの実質的な近傍が水平の粒間のスペース (この距離は約 7 ピクセル) をカバーするように、フィルターの空間範囲を増やします。また DegreeOfSmoothing を増やし、これらの領域をさらに大胆に平滑化します。

DoS2 = 4*patchVar;
sigma = 7;
smoothedLAB2 = imbilatfilt(imLAB,DoS2,sigma);
smoothedRBG2 = lab2rgb(smoothedLAB2,"Out","uint8");
montage({imRGB,smoothedRBG2})
title("Original Image vs. Filtered Image with Degree of Smoothing: "+num2str(DoS)+ ...
    " and Spatial Sigma: "+sigma)

Figure contains an axes object. The axes object with title Original Image vs. Filtered Image with Degree of Smoothing: 7.9771 and Spatial Sigma: 7 contains an object of type image.

木製のテーブルの色は、近傍と平滑化の度合いが大きくなると、さらに一様になります。チップとペンのエッジの鮮鋭度が維持されています。

入力引数

すべて折りたたむ

フィルター処理するイメージ。m 行 n 列の 2 次元グレースケール イメージまたは m x n x 3 の 2 次元カラー イメージとして指定します。

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

平滑化の度合い。正の数値として指定します。degreeOfSmoothing の既定値は、イメージ I のデータ型によって異なり、0.01*diff(getrangefromclass(I)).^2 で計算されます。たとえば、既定の平滑化の度合いは、データ型 uint8 のイメージに対して 650.25 です。データ型が double のイメージで、ピクセル値が [0,1] の範囲であるイメージに対して既定値は 0.01 です。

空間ガウス平滑化カーネルの標準偏差。正の数値で指定します。

名前と値の引数

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

例: imbilatfilt(I,NeighborhoodSize=7) は 7 行 7 列ピクセルの近傍を使用して、イメージ I でバイラテラル フィルター処理を実行します。

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

例: imbilatfilt(I,"NeighborhoodSize",7) は 7 行 7 列ピクセルの近傍を使用して、イメージ I でバイラテラル フィルター処理を実行します。

近傍のサイズ。正の奇数値として指定します。既定の設定では、近傍サイズは 2*ceil(2*SpatialSigma)+1 ピクセルです。

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

パディング。次のいずれかの値を指定します。

説明
"replicate"配列の境界の外に位置する入力配列値は、最近傍の配列境界値と等しいと仮定します。
"symmetric"

配列の境界の外に位置する入力配列値を計算するには、配列の境界をまたぐ配列の鏡像を使用します。

数値スカラー xイメージの境界の外に位置する入力イメージの値は、値 x に割り当てられます。

例: Padding="symmetric"

例: Padding=128

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | char | string

出力引数

すべて折りたたむ

フィルター処理されたイメージ。サイズとデータ型が入力イメージ I と同じ数値配列として返されます。

ヒント

  • degreeOfSmoothing 値は、バイラテラル フィルターの範囲ガウス カーネルの分散に対応します [1]。範囲ガウスは近傍の値からピクセル値のユークリッド距離に適用されます。

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

  • spatialSigma を増やすと、NeighborhoodSize が増加し、フィルターの実行時間も増加します。小さい NeighborhoodSize を指定して、精度と実行時間のバランスを調整します。

参照

[1] Tomasi, C., and R. Manduchi. "Bilateral Filtering for Gray and Color Images". Proceedings of the 1998 IEEE® International Conference on Computer Vision. Bombay, India. Jan 1998, pp. 836–846.

拡張機能

バージョン履歴

R2018a で導入

すべて展開する