前回は、画像の「強化、強調?」Enhancementと「修復」Restorationに関する関数のいくつかを手習ひ。今回は前回積み残しです。その一番はデコンボルーションとな?信号処理素人老人にはサッパリなんだが、「フィルタ」のかかった信号からフィルタがかかる前の元信号を復元する処理らしいです。元に戻るの?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
※Windows11上の Scilab2024.0.0およびScilab上のScilab IPCVツールボックスを使用させていただいております。
まずはノイズを低減するフィルタから
本題のデコンボルーションに行く前にノイズを低減するフィルタです。前回は「ごま塩」(salt and pepper)ノイズがかかった画像を修復(お化粧)するメディアンフィルタを練習しました。今回は、ガウシアンノイズ(正規分布にしたがうようなノイズ)が乗った画像に Wiener filter を適用してみます。
例題コードが以下に。
S = imread(fullpath(getIPCVpath() + "/images/measure_gray.jpg")); S2 = imnoise(S,'gaussian'); S3 = imwiener2(S2,[3 3],0.2); subplot(131); title('Original'); imshow(S); subplot(132); title('noise_gaussian'); imshow(S2); subplot(133); title('imwiener2'); imshow(S3);
左端がオリジナル画像、真ん中がガウシアンノイズが乗っている画像です。わざとらしいですが、劣化は歴然としております。そして右端が、ノイズの乗った画像にimwiener2関数で Wiener filter を適用したもの。オリジナルに比べるとちょい悪ですが、かなり改善しておる感じがします。なんでimwiener「2」なのかは知らず。
デコンボルーション
ここでのデコンボルーションは、「フィルタ」のかかった信号からフィルタがかかる前の元信号を復元する処理、ということみたいです。この処理にはアルゴリズムの異なる以下3種の関数が並立します。
-
- imdeconvl2
- imdeconvsobolev
- imdeconvwiener
「1」は、L2 Regularizationを使うもの、「2」は Sobolev Regularization、「3」は Wiener method 使うものです。といっても信号処理素人老人には何やら分かりませぬなあ。ちょいと調べてみると画像に関する「デコンボルーション(逆畳み込み)」は「金のとれる」技術みたいです。検索すると各社から「デコンボルーション・ソリューション」多数。技術の奥は深いです。
奥深いところには立ち入らず、今回3つの関数を比べてみるためのコードが以下です。
S = imread(fullpath(getIPCVpath() + "/images/balloons_gray.png")); S = im2double(S); h = fspecial('motion',25,45); S2 = imfilter(S,h,'circular'); S3 = imdeconvl2(S2,h,0); S4 = imdeconvsobolev(S2,h,0); S5 = imdeconvwiener(S2,h,0); subplot(151); title('Original'); imshow(S); subplot(152); title('motion_circular'); imshow(S2); subplot(153); title('imdeconvl2'); imshow(S3); subplot(154); title('imdeconvsobolev'); imshow(S4); subplot(155); title('imdeconvwiener'); imshow(S5);
オリジナル画像に、motion blurred(被写体ブレ?)を掛けて得た「ブレてる」画像を3種のデコンボルーション関数で修復してみよう、という感じっす。
結果の画像が以下に。
左端がオリジナル、その次が「ブレてる」画像。そして右の3つが3種のデコンボルーション処理を行った結果です。
素人目にはどれも修復できとるような。。。さすがだ。