Main Content

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

ウェーブレットのノイズ除去

この例では、ウェーブレットを使用して信号やイメージのノイズを除去する方法について説明します。ウェーブレットはデータ内の特徴を異なるスケールに局在化するため、信号またはイメージの重要な特徴を保持しながらノイズを除去することができます。ウェーブレット ノイズ除去、すなわちウェーブレットのしきい値処理の背後にある基本的な考え方は、ウェーブレット変換によって実際の多数の信号やイメージに対してスパース表現が得られるということです。これはつまり、ウェーブレット変換が信号やイメージの特徴を振幅の大きい少数のウェーブレット係数に集中させるということです。値の小さいウェーブレット係数は通常ノイズであり、そのような係数は、信号の質または画質に影響を与えることなく、"収縮" または削除することができます。係数のしきい値処理を行った後、逆ウェーブレット変換を使用してデータを再構成します。

信号のノイズ除去

ウェーブレット ノイズ除去を説明するため、ノイズを含む "Bumps" 信号を作成します。この場合、元の信号とノイズを含むバージョンの両方があります。

rng default;
[X,XN] = wnoise('bumps',10,sqrt(6));
subplot(211)
plot(X); title('Original Signal');
AX = gca;
AX.YLim = [0 12];
subplot(212)
plot(XN); title('Noisy Signal');
AX = gca;
AX.YLim = [0 12];

Figure contains 2 axes objects. Axes object 1 with title Original Signal contains an object of type line. Axes object 2 with title Noisy Signal contains an object of type line.

wdenoise を既定の設定で使用して、レベル 4 まで下げて信号のノイズを除去します。wdenoise は間引きウェーブレット変換を使用します。元の信号とともに結果をプロットします。

xd = wdenoise(XN,4);
figure;
plot(X,'r')
hold on;
plot(xd)
legend('Original Signal','Denoised Signal','Location','NorthEastOutside')
axis tight;
hold off;

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original Signal, Denoised Signal.

非間引きウェーブレット変換を使用して信号のノイズを除去することもできます。非間引きウェーブレット変換を使用して、もう一度レベル 4 まで下げて信号のノイズを除去します。元の信号とともに結果をプロットします。

xdMODWT = wden(XN,'modwtsqtwolog','s','mln',4,'sym4');
figure;
plot(X,'r')
hold on;
plot(xdMODWT)
legend('Original Signal','Denoised Signal','Location','NorthEastOutside')
axis tight;
hold off;

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original Signal, Denoised Signal.

どちらの場合も、ウェーブレット ノイズ除去は、ノイズの量を大幅に削減しながら、信号内のシャープな特徴を保持していることがわかります。後者はフーリエベースのノイズ除去の課題です。フーリエベースのノイズ除去、つまりフィルター処理では、ローパス フィルターを適用してノイズを除去します。しかし、信号内のスパイクやイメージ内のエッジなど、データに高周波数の特徴があると、ローパス フィルターはそれらを平滑化します。

ウェーブレットを使用して、ノイズが一様でない信号のノイズを除去することもできます。経時的な電力消費を示す信号の一部をインポートし、調査します。

load leleccum; 
indx = 2000:3450;
x = leleccum(indx);
plot(x)
grid on;

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

この信号は、サンプル 500 近辺以降、ノイズが増加しているようです。そのため、信号の最初の部分では異なるしきい値処理を使用します。cmddenoise を使用して、ノイズ除去に最適な区間数を決定し、信号のノイズを除去することができます。この例では、'db3' ウェーブレットを使用し、レベル 3 までデータを分解します。

[SIGDEN,~,thrParams,~,BestNbOfInt] = cmddenoise(x,'db3',3);

区間数と、区間を区切るサンプル値を表示します。

BestNbOfInt
BestNbOfInt = 2
thrParams{1}(:,1:2)
ans = 2×2

           1         412
         412        1451

2 つの区間が特定されました。2 つのセグメントの間の境界を示すサンプルは 412 です。信号をプロットし、2 つの信号セグメントを示すと、サンプル 412 の前後でノイズは異なることがわかります。

plot(x)
hold on;
plot([412 412],[100 550],'r')
hold off;

Figure contains an axes object. The axes object contains 2 objects of type line.

ノイズ除去後の信号をプロットします。

plot(SIGDEN)
title('Denoised Signal')

Figure contains an axes object. The axes object with title Denoised Signal contains an object of type line.

イメージのノイズ除去

ウェーブレットを使用してイメージのノイズを除去することもできます。イメージにおいて、エッジはイメージの輝度が急激に変化する場所です。エッジを維持しながらイメージのノイズを除去することが、知覚的品質にとって極めて重要です。従来のローパス フィルター処理はノイズを除去しますが、ほとんどの場合、エッジを平滑化し、画質に悪影響を与えます。ウェーブレットは、知覚的に重要な特徴を保持しながらノイズを除去できます。

ノイズを含むイメージを読み込みます。wdenoise2 を既定の設定で使用してイメージのノイズを除去します。既定では、wdenoise2 は双直交ウェーブレット bior4.4 を使用します。元のイメージとノイズ除去後のイメージを表示するには、出力引数を指定しません。

load('jump.mat')
wdenoise2(jump)

Figure contains 2 axes objects. Axes object 1 with title Original Image contains an object of type image. Axes object 2 with title Denoised Image contains an object of type image.

イメージ内のエッジは、ノイズ除去処理によって平滑化されていないことがわかります。

参考

|