2

私は OpenCV と C++ を使用した小さなプロジェクトを扱っています。次の質問は素朴かもしれませんが、誰かが助けてくれればとても感謝しています。

ここでは新しいので、画像を投稿するのに十分な評判がないので、明確にしようと思います.

周波数領域で画像 (MxN = 200x200 Mat) のノイズを除去しようとしていますが、

UxV=3x3 ガウス カーネル {{0, -1, 0},{-1, 4, -1},{0, -1, 0}} があるとすると、予想される手順は次のとおりです。

  1. (M+U-1) x (N+V-1) までカーネルをゼロ パディングします。
  2. カーネルの 2 次元 fft を取る
  3. 画像を (M+U-1) x (N+V-1) までゼロ パディングします。
  4. 画像の 2 次元 FFT を取る
  5. カーネルのFFTに次のFFTを掛けます
  6. 画像は結果の逆 2 次元 FFT を取得します

ステップ2の結果(カーネルのfft)と最終結果(フィルタリングされた画像)の両方が正しいように見えますが、次の答えが見つかりました:

K をゼロでパディングして I と同じ大きさにする必要があります。また、パディング後、カーネルの FFT を取得する前に、カーネルの中心 (ガウスのピーク) が (0,0) になるようにラップアラウンドで変換する必要があります。そうしないと、フィルター処理された画像が翻訳されます。

それは私がしなかったことです。しかし、どうして結果が受け入れられるように見えるのでしょうか? だから私は今、カーネルを動かして中心を作ることがfftの前に(0、0)にあるかどうかの違いは何だろうと思っていますか?

これが私の2番目の質問です。画像のシフトされたfft(中央の0周波数)を取得した場合、これを実行して「ローパス」エフェクトを取得できますか:

中心からの距離がしきい値よりも大きいピクセルについては、値を 0 に設定します。

(簡単だと思いますが、広く使用されている同様の方法は見つかりませんでした。)

助けてくれてありがとう:-)

4

0 に答える 0