2D整数配列として表されるビットマップ画像があるとします。int [,] image2D;
そのFFTはComplex[,] fftImage2D;
2D整数配列として表されるカーネルがあり、int [,] kernel2D;
そのFFTはComplex[,] fftKernel2D;
我々はそれを知っている、の(空間領域で)コンボリューションimage2D
とはkernel2D
、だろう
int Rows = image2D.GetLength(0);
int Cols = image2D.GetLength(1);
for(int i=0 ; i<Rows ; i++)
{
for(int j=0 ; j<Cols ; j++)
{
//sweep the kernel2D across image2D
//...........................
}
}
次のリンクはすべて、空間領域での畳み込みに関するものです。
http://www.codeproject.com/Articles/2008/Image-Processing-for-Dummies-with-C-and-GDI-Part http://www.gutgames.com/post/Matrix-Convolution-Filters-in -C.aspx https://softwarebydefault.com/2013/05/01/image-convolution-filters/
周波数領域での畳み込みは、との間の乗算にfftImage2D
なりfftKernel2D
ます。
どうすればこの乗算を行うことができますか?
Complex [,]
異なる次元の2つのタイプ2D配列を乗算するにはどうすればよいですか?
周波数領域で乗算を使用して線形畳み込みを実行するには、最初に2つの複雑な2D配列の次元が同じであることを確認する必要があります。これは、2つの空間ドメイン配列(image2D
およびkernel2D
)を同じサイズにパディングすることで実現できます。巡回畳み込みではなく線形畳み込みを実行するには、空間ドメイン配列を(各次元に沿って)2つの配列次元の合計よりも少なくとも1つ少なくする必要があることに注意してください。
したがって、プロセスは次のようになります。
image2D.GetLength(0)+kernel2D.GetLength(0)-1
image2D.GetLength(1)+kernel2D.GetLength(1)-1
image2D
この新しいサイズにパッドを入れ、境界要素を繰り返しますkernel2D
この新しいサイズにパッドを入れ、ゼロを埋めますimage2D
、kernel2D
fftImage2D
でfftKernel2D
同じサイズの乗算を実行しますimage2D
サイズに切り捨てます(これはkernel2D
、完全な畳み込みに伴うエッジ効果なしでフィルター処理された画像を取得する場合にのみ必要です)。サンプルの実装については、将来の読者は、私の回答で示した変更とともに、@ anonymousからのこの他の質問を見るかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加