と仮定、我々は、2D整数配列として表されたビットマップイメージを有する int [,] image2D;
そのFFT Complex[,] fftImage2D;
周波数領域でコンボリューションをどのように実装できますか?
と仮定、我々は int [,] kernel2D;
FFT Complex[,] fftKernel2D;
ある2D整数のアレイとして表さカーネルを持っている私たち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
//...........................
}
}
以下のリンクであります空間領域での畳み込みについてLL:
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
間の乗算になります。
は、どのように私はこの乗算を行うことができますか?
どのように異なる寸法の2つのComplex [,]
型2Dアレイを掛けることができますか?
何場合2つのうち大きい方(image2D vs kernel2D)をパッドサイズとして取るか?私は、パディングされた画像の中心に、または四隅のいずれかにカーネルを保持する必要がありますか?そして、image2Dをどのように切り捨てることができますか? – anonymous
2つのうち大きい方のみをパッドサイズとして使用すると、循環コンボルーションのアーティファクトが巻き込まれます。サイズが上記の値以上になると、アーティファクトはゼロになります。周波数領域でのカーネルの位置は、イメージをfftshift/ifftshift(つまり、同じゼロ周波数位置で両方のイメージを維持する必要がある)しない限り、4つのコーナーにある必要があります(ゼロ周波数が中心にあると仮定し、一般的です)。 – SleuthEye
空間ドメインのカーネルの位置は、結果の画像を切り捨てるときに対応するシフトを考慮して、どこからでも指定できます。空間領域の4隅に配置すると、0シフトが得られるので、結果として得られる画像を切り捨てるだけで、最初の 'GetLength(0)'と 'GetLength(1)'ピクセルを取ることになります。 – SleuthEye