2016-08-15 17 views
-1

私は、サイズが512 x 256の画像を持っているとします。 FFTを適用するために2次元の複合配列に変換すると、配列のサイズはまだ512 x 256になります。私のカーネルのサイズが x 10なら、それを2次元複素数配列に変換すると、そのサイズはまだ x 10になります。そうじゃない?アンパッドカーネルの畳み込み

それがそうであるならば、はなぜサイズのカーネルのx 256512を作成しないと、直接(むしろサイズX 1010とパッドそれのカーネルを作成するよりも)画像を畳み込みますか?

私は、512 x 256ピクセルのサイズの画像を持っているとします。私はサイズのx 256512のカーネルを準備して画像を畳み込む場合はどうすれば出力の違いだろう、

  1. サイズ256 x 256のカーネルを準備し、それを512 x 256にしてからImage?
  2. サイズ256 x 256のカーネルを用意して、サイズが(512+256) X (256+256)になるようにパッドを作って、同じサイズにしてから畳み込みますか?小さなカーネルサイズに
+0

カーネルにゼロを単に埋め込むと、違いはありません。そうしないでください。しかし、イメージコンボリューションカーネルは、処理されるイメージとサイズが関係していると思いますが、少し心配しています。通常のカーネルは10x10程度の非常に小さいです。行列を使った畳み込みについて話していますか? – starmole

+0

'画像の畳み込みカーネルが処理される画像のサイズに関係していると思いますが、少し心配しています。---私はサイズが' '512''''256'の画像を持っているとします。そのイメージを2次元の複素数配列に変換してFFTを適用すると、配列のサイズは '512'''''''256''となります。今、私のカーネルのサイズが '10'x'10で、2Dのコンプレックス配列に変換すると、サイズは' 10'x'10 'になります。そうじゃない?それがそうであれば、どうすれば互いに絡み合うことができますか?その場合、私はカーネルとその両方を埋め込む必要があると思います。私は正しいですか? – anonymous

+0

ああ、申し訳ありませんが、私はここで用語について混乱していました。私はfftベースの畳み込みに関する有用な助けがありません。たぶんこれが助けになるかもしれません:http://stackoverflow.com/questions/14328502/filtering-image-with-fft – starmole

答えて

2

と仮定、私はサイズが512x256のイメージを持っています。 FFTを適用するために2次元複素数配列に変換すると、配列のサイズは512x256になります。今、私のカーネルのサイズが10x10で、それを2次元の複雑な配列に変換すると、そのサイズは10x10になります。そうじゃない?

それはあなたがサイズによって理解するものによって異なります。サイズは、画像の概念の寸法であれば、答えはイエスである

  • sizeがメモリ内のスペースである場合、答えはいいえです。
  • 数学的な次元について話しているのなら、答えはいいえです。それがそうであるならば

、なぜ我々は、サイズ512x256のカーネルを作成しないと、(むしろ、サイズ10×10とパッドそれのカーネルを作成するよりも)直接画像を畳み込みますか?

カーネルサイズ:カーネルは性質によって小さいである:「画像処理、カーネル、畳み込み行列、またはマスクで小ボケのために有用なマトリックス、鮮鋭化、エンボス加工、エッジ検出であり、... "()。カーネルのアイデアは、画像上でローカルに動作する数学演算子を持つことです。これは、画像内の各ピクセルが周囲のピクセルによってのみ影響を受けることを意味します。その近傍のサイズは、あなたのケースでは10x10のカーネルのサイズです。

パディングと畳み込み:

  1. 直接畳み込み:コンボルブカーネルで画像、両方の元のサイズと画像にカーネルを適用するには、2つの方法があります。サイズを維持するためにトリミングしなければならない(512 + 10 -1)x(256 + 10 -1)の画像が得られます。

  2. FFTによるコンボリューション:画像のFFT(512x256複素行列)を計算します。パディングされたカーネルのFFT(512x256複素行列)を計算する。要素を両方の行列で掛け、最終的に結果のIFFTを計算して畳み込みを得る。

FFTで畳み込みを行うのは計算上より効率的です。私はサイズ512x256のカーネルを準備して画像を畳み込む場合はどうすれば出力の違いだろう、

  1. 私はサイズ256x256のパッドを用意しています。パッドを512x256にして、イメージを畳み込みますか?

  2. 私は、サイズ(512 + 256)X(256 + 256)にするためにパッドをサイズ256x256のパッドを用意し、同じサイズにして畳み込みます。

すべての3つのオプションは、あなたが望むものはおそらくありません。カーネルを小さくする(10x10)ようにしたい。あなたは、FFT経由で畳み込みをしている場合にのみそれを埋め込みます。

オリジナルの10x10カーネルで直接畳み込み方式を使用することをお勧めします。結果の画像を調べ、期待どおりかどうかを確認します。 実行時間を最適化する場合は、FFTメソッドを使用します。

1

(及び特に低次元で)FFTを使用せずに「直接」にそれらを適用するために、より効率的であるが、より大きな問題にConvolution Theoremを利用することは非常に有益であることができます。また、FFTWは、さまざまなハードウェアで優れたパフォーマンスを発揮します。

当然ながら、ポイントワイズ乗算を行うには、行列の形状が同じでなければなりません。したがって、10 x 10カーネルにはゼロが埋め込まれ、カーネルのFFTとイメージが計算され、要素ごとの積が行われ、IFFTによって希望の結果が得られます。

私は「512 x 256カーネルを生成する」「256 x 256カーネルを生成し、それをパディング」と異なっているか確認してください、あなたのカーネル「準備」プロセスについて少し困惑していませんよ。

たとえば、「半径」が150ピクセルのガウスカーネルを使用している場合、およそ0に減衰するのに十分な「スペース」がないため、境界効果が得られます。 512 x 256カーネルでは、それはexp(-((512/2)/150)^2) = 0.0543...に減衰するのに十分な水平スペースを持ちますが、垂直方向には、exp(-((256/2)/150)^2) = 0.4827...に上限があり、ゼロよりもかなり大きくなります。

編集:Matlabを使用してサンプル画像を作成することができます。このぼかしは80ピクセルの半径を持ちますが、それでもパッド付きカーネルのFFT結果に顕著なアーチファクトが生じます。

f = @(i) fftshift(mat2gray(log(1 + abs(fft2(i))))) 
[x y] = meshgrid((1:512)-256, (1:256)-128); z = zeros(256, 128); 
i1 = exp(-(x.^2+y.^2)/80^2); i2=[z i1(:,129:(256+128)) z]; 
imshow([i1 f(i1); i2 f(i2)], 'border', 'tight') 

FFT on kernel

関連する問題