通常の畳み込みを使用したガウスぼかしの現在の実装があります。小さなカーネルには十分効率的ですが、カーネルのサイズが少し大きくなると、パフォーマンスが低下します。そこで、FFTを使って畳み込みを実装することを考えています。FFT関連の画像処理の経験がないので、いくつか質問があります。
2D FFTベースの畳み込みも2つの1D畳み込みに分離できますか?
- trueの場合、次のようになりますか?すべての行で1D FFT、次にすべての列で1D FFT、次に2Dカーネルで乗算し、次にすべての列の逆変換とすべての行の逆変換を行いますか?または、各1D FFT変換の後に1Dカーネルで乗算する必要がありますか?
これで、カーネルサイズは画像と同じサイズ(1Dの場合は行)である必要があることがわかりました。しかし、それはエッジにどのように影響しますか?画像の端をゼロで埋める必要がありますか?もしそうなら、カーネルサイズはパディングの前後の画像サイズと等しくなければなりませんか?
また、これはC ++プロジェクトであり、商用プロジェクトであるため、kissFFTを使用する予定です。より良い代替案を提案することを歓迎します。ありがとうございました。
編集:回答ありがとうございますが、もう少し質問があります。
入力画像の虚数部がすべてゼロになることがわかります。しかし、出力の虚数部もゼロになりますか?ガウスカーネルを実数部と虚数部の両方に乗算する必要がありますか?
同じ画像のインスタンスが異なるスケールでぼやけています。つまり、同じ画像が異なるサイズにスケーリングされ、異なるカーネルサイズでぼやけています。画像を拡大縮小するたびにFFTを実行する必要がありますか、それとも同じFFTを使用できますか?
最後に、FFTを視覚化する場合は、ログフィルターをFFTに適用する必要があることを理解しています。しかし、FFTを視覚化するためにどの部分を使用すべきか本当に迷っていますか?実数部または虚数部。
また、512x512のサイズの画像の場合、実数部と虚数部のサイズはどうなりますか。それらは同じ長さになりますか?
詳細な返信ありがとうございます。