メインコンテンツ

事前学習済みのニューラル ネットワークを使用した、カラー イメージからのノイズ除去

この例では、ノイズ除去畳み込みニューラル ネットワークを使用して RGB イメージからガウス ノイズを除去する方法を示します。

カラー イメージをワークスペースに読み取り、データをデータ型 double に変換します。初期状態のカラー イメージを表示します。

pristineRGB = imread("lighthouse.png");
pristineRGB = im2double(pristineRGB);
imageshow(pristineRGB)

分散 0.01 のゼロ平均ガウス ホワイト ノイズをイメージに追加します。関数 imnoise は、各カラー チャネルに対してノイズを個別に追加します。ノイズを含むカラー イメージを表示します。

noisyRGB = imnoise(pristineRGB,"gaussian",0,0.01);
imageshow(noisyRGB)

事前学習済みのノイズ除去畳み込みニューラル ネットワーク DnCNN は、シングル チャネル イメージで動作します。ノイズを含む RGB イメージを 3 つの個別のカラー チャネルに分割します。

[noisyR,noisyG,noisyB] = imsplit(noisyRGB);

事前学習済み DnCNN ネットワークを読み込みます。

net = denoisingNetwork("dncnn");

DnCNN ネットワークを使用して各カラー チャネルからノイズを除去します。

denoisedR = denoiseImage(noisyR,net);
denoisedG = denoiseImage(noisyG,net);
denoisedB = denoiseImage(noisyB,net);

ノイズ除去後のカラー チャネルを再度組み合わせてノイズ除去後の RGB イメージを作成します。ノイズ除去後のカラー イメージを表示します。

denoisedRGB = cat(3,denoisedR,denoisedG,denoisedB);
imageshow(denoisedRGB)

ノイズの多いイメージとノイズ除去後のイメージのピーク S/N 比 (PSNR) を計算します。PSNR が大きいほどノイズの相対シグナルが小さく、画質が高くなります。

noisyPSNR = psnr(noisyRGB,pristineRGB);
disp("The PSNR value of the noisy image is "+noisyPSNR+".");
The PSNR value of the noisy image is 20.6395.
denoisedPSNR = psnr(denoisedRGB,pristineRGB);
disp("The PSNR value of the denoised image is "+denoisedPSNR+".");
The PSNR value of the denoised image is 29.6857.

ノイズの多いイメージとノイズ除去後のイメージの構造類似度 (SSIM) インデックスを計算します。SSIM インデックスが 1 に近いほど参照イメージに合致し、画質が高くなります。

noisySSIM = ssim(noisyRGB,pristineRGB);
disp("The SSIM value of the noisy image is "+noisySSIM+".");
The SSIM value of the noisy image is 0.73927.
denoisedSSIM = ssim(denoisedRGB,pristineRGB);
disp("The SSIM value of the denoised image is "+denoisedSSIM+".");
The SSIM value of the denoised image is 0.95071.

実際には、イメージのカラー チャネルにはしばしば相関ノイズが存在します。相関イメージ ノイズを除去するには、まず RGB イメージを、L*a*b* 色空間など、輝度チャネルのある色空間に変換します。輝度チャネルのノイズのみを除去し、ノイズ除去後のイメージを変換して RGB 色空間に戻します。

参考

| | | | | |

トピック