質問

特定のアプリケーションでは、イメージを入力するために平均マスクを適用してノイズを減らし、次にLaplacianマスクを削減して小さな詳細を強化します。 Matlabでのこれらの操作の順序を逆転させた場合、私と同じ結果が得られるかどうかを知っていますか?

役に立ちましたか?

解決

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


これが何に似たMATLABの例です @belisarius 投稿:

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)) )

enter image description here

他のヒント

2つのフィルターがあるとしましょう F1F2, 、および画像 I. 。 2つのフィルターに画像を渡すと、次のように定義された応答が表示されます。

X = ((I * F1) * F2)

ここで私が使用しています * 表現します 畳み込み.

連想的な畳み込みのルールによって、これは同じです。

X = (I * (F1 * F2))

通勤を使用して、それを言うことができます

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

もちろん、これは数学の素晴らしい連続ドメインにあり、これらのことをマシンで行うことは、丸めエラーがあり、一部のデータが失われる可能性があることを意味します。また、フィルターがあるかどうかを考える必要があります モミ, それ以外の場合は、フィルターがあなたが望むように振る舞うことができないため、畳み込みとしてデジタルフィルタリングについて考えることの概念全体が崩壊し始めます。


編集

離散畳み込みは、と定義されます

conv2 uses a straightforward formal implementation of the two-dimensional convolution equation in spatial form

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

一部の人々が指摘したように、あなたは数値的に異なる答えを得るでしょうが、これは実際のデータを計算するときはいつでも予想されます。これらのバリエーションは小さく、畳み込みの出力の低エネルギー成分に限定する必要があります(つまり、エッジ)。

また、畳み込み操作がどのように機能しているかを考慮することも重要です。長さの2セットのデータを畳み込みます X と長さ Y その結果、回答が得られます X+Y-1 長さで。 MatlabやMathematicaのようなプログラムのために舞台裏の魔法が進行しているいくつかの魔法があります。 X また Y.

ですから、@belisariusの投稿に関しては、私たちは本当に同じことを言っているようです。

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

Mathematicaの例:

enter image description here

編集

線形フィルターとパディングの整理に関する彼の答えの@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}
*)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top