MATLABを用いたウェーブレット変換による画像ノイズ除去の実装

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;

タグ: MATLAB wavelet transform image denoising threshold processing multi-resolution analysis

7月25日 03:15 投稿