1. ノイズ画像の生成
基準画像を読み込み、ガウス分布ノイズを付加して人工的な劣化画像を作成します。
% 原画像の読み込みと正規化
srcImg = imread('mandrill.tif'); % 適宜実際の画像パスに変更
srcImg = im2double(srcImg);
% ガウスノイズの付与
noisePower = 0.015; % ノイズ分散の設定
contaminatedImg = imnoise(srcImg, 'gaussian', 0, noisePower);
2. ウェーブレット多分解能解析
選定したウェーブレット関数を用いて、指定分解レベルで2次元離散ウェーブレット変換を実行し、係数を取得します。
% 解析パラメータの定義
waveletType = 'sym4'; % ウェーブレット基底関数
decompLevel = 3; % 分解レベル数
% 2次元ウェーブレット分解の実行
[waveletCoeffs, coeffDims] = wavedec2(contaminatedImg, decompLevel, waveletType);
3. 統計的閾値推定と係数処理
ノイズレベルをMedian Absolute Deviation法で推定し、ユニバーサル閾値を算出。詳細係数に対して軟閾値処理を適用します。
% 閾値処理モードの選択
thresholdMode = 'adaptive'; % 'uniform':全域的, 'adaptive':階層適応
% 閾値計算と係数更新
processedCoeffs = waveletCoeffs;
pixelCount = numel(contaminatedImg);
for idx = 1:decompLevel
startPos = coeffDims(idx, 1) + 1;
endPos = coeffDims(idx+1, 1);
detailCoeffs = waveletCoeffs(startPos:endPos);
% MAD法によるノイズ標準偏差推定
noiseEst = median(abs(detailCoeffs(:))) / 0.6745;
if strcmp(thresholdMode, 'uniform')
thresholdVal = noiseEst * sqrt(2 * log(pixelCount));
processedCoeffs(startPos:endPos) = wthresh(detailCoeffs, 's', thresholdVal);
else % adaptive mode
levelThreshold = noiseEst * sqrt(2 * log(pixelCount));
processedCoeffs(startPos:endPos) = wthresh(detailCoeffs, 's', levelThreshold);
end
end
4. 逆ウェーブレット変換による復元
処理済み係数から逆変換を行い、ノイズ除去後の画像を再構成します。
% 修正係数からの画像再構成
restoredImg = waverec2(processedCoeffs, coeffDims, waveletType);
5. 結果の比較表示
三種類の画像(原画像、劣化画像、復元画像)をサブプロットで並べて、処理効果を評価します。
% 処理結果の可視化
figure('Name', 'ウェーブレットデノイジング比較', 'NumberTitle', 'off');
subplot(1,3,1); imshow(srcImg); title('オリジナル画像'); axis on;
subplot(1,3,2); imshow(contaminatedImg); title('ノイズ混入画像'); axis on;
subplot(1,3,3); imshow(restoredImg); title('ノイズ除去画像'); axis on;