7

特定のアプリケーションでは、入力画像に平均化マスクを適用してノイズを低減し、次にラプラシアンマスクを適用して細部を強調します。Matlabでこれらの操作の順序を逆にした場合に同じ結果が得られるかどうかは誰にも分かりますか?

4

3 に答える 3

8

ラプラシアンカーネルでの畳み込みは、強度変化に関する2次導関数情報を使用することに似ています。この導関数はノイズに敏感であるため、ラプラシアンフィルターを適用する前にガウスで画像を平滑化することがよくあります。


@belisariusが投稿したものと同様のMATLABの例を次に示します。

f='http://upload.wikimedia.org/wikipedia/commons/f/f4/Noise_salt_and_pepper.png';
I = imread(f);

kAvg = fspecial('average',[5 5]);
kLap = fspecial('laplacian',0.2);

lapMask = @(I) imsubtract(I,imfilter(I,kLap));

subplot(131), imshow(I)
subplot(132), imshow( imfilter(lapMask(I),kAvg) )
subplot(133), imshow( lapMask(imfilter(I,kAvg)) )

ここに画像の説明を入力してください

于 2011-06-14T18:51:49.100 に答える
7

2つのフィルターF1F2、および画像があるとしますI。画像を2つのフィルターに通すと、次のように定義された応答が得られます。

X = ((I * F1) * F2)

ここで、畳み込み*を表すために使用しています。

畳み込みの結合法則により、これはと同じです。

X = (I * (F1 * F2))

可換性を使用すると、次のように言うことができます

X = (I * (F2 * F1)) = ((I * F2) * F1)

もちろん、これは数学の優れた連続領域にあります。これらのことをマシンで実行すると、丸め誤差が発生し、一部のデータが失われる可能性があります。また、フィルターがFIRであるかどうかも検討する必要があります。そうでない場合、フィルターが実際に希望どおりに動作できないため、畳み込みソータとしてのデジタルフィルタリングについて考えるという概念全体が崩壊し始めます。


編集

離散たたみ込みは次のように定義されます

conv2は、空間形式の2次元畳み込み方程式の単純な形式的実装を使用します

したがって、データの端にゼロを追加しても、数学的な意味では何も変わりません。

一部の人が指摘しているように、数値的には異なる答えが得られますが、実際のデータを計算する場合は常にこれが予想されます。これらの変動は小さく、畳み込みの出力の低エネルギー成分(つまりエッジ)に限定する必要があります。

畳み込み演算がどのように機能しているかを考慮することも重要です。X長さと長さの2セットのデータを畳み込むと、長Yさのある答えが得られX+Y-1ます。XMATLABやMathematicaのようなプログラムで、長さまたはの答えを与えるために、舞台裏で魔法が起こっていますY

したがって、@ belisariusの投稿に関しては、実際に同じことを言っているように見えます。

于 2011-06-14T20:05:19.217 に答える
3

数値的には結果は同じではありませんが、画像はかなり似ています。

Mathematicaの例:

ここに画像の説明を入力してください

編集

線形フィルターとパディングの転流に関する彼の回答の@thronコメントへの回答として、次の操作を検討してください。

パディングなしのガウスおよびラプラシアンフィルターの転流は真実ですが、

list = {1, 3, 5, 7, 5, 3, 1};
gauss[x_] := GaussianFilter[ x, 1]
lapl[x_] := LaplacianFilter[x, 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]
(*
->{5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}    
  {5.15139,0.568439,-1.13688,-9.16589,-1.13688,0.568439,5.15139}
*)

パディングで同じことを行うと、エッジに違いが生じます。

gauss[x_] := GaussianFilter[ x, 1, Padding -> 1]
lapl[x_] := LaplacianFilter[x, 1, Padding -> 1]
Print[gauss[lapl[list]], lapl[gauss[list]]]

(*
->{4.68233,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.68233}
  {4.58295,0.568439,-1.13688,-9.16589,-1.13688,0.568439,4.58295}
*)
于 2011-06-13T13:17:10.517 に答える