2次元フーリエ変換,フーリエ逆変換

17 6月 2010 Under: opencv2.x-samples

YouTube で見た以下のビデオが面白かったので,似たようなものを OpenCV のサンプルとして作ってみました.cv::dft,cv::idft を利用しています.処理の詳細は,ビデオをご覧ください.

C++


実行結果例

(1)動画(サンプル実行の例)

(2)静止画

(左)対数パワースペクトル, (右)IDFT結果 左画像の黒い領域は,選択された(IDFTの対象となる)周波数,方向の正弦波を表します.この領域は,対数パワースペクトル画像上をマウスでクリック,ドラッグなどすることで選択できます.多くの正弦波を重ね合わせることで,より元の画像に近づく様子が分かります.

⇒  

⇒  

⇒    

ジョゼフ・フーリエ (Joseph Fourier)

“2次元フーリエ変換,フーリエ逆変換” への8件のコメント

  1. akii より:

    77行目の【shiftDFT(mv[0], mv[0]);】では、何のためにこのような処理がされているのでしょうか。
    基本的なことだったらすいません。
    よろしくお願いします。

  2. Munya より:

    これはわかりやすいですね。
    フーリエ変換とOpenCVの使い方がよくわかりました。

    >idft_win(“IDTF”)

    IDTFはIDFTのミスですよね。
    勉強してて、ちょっと微笑みました。

    すごく勉強になりました。

  3. ftarrega より:

    お世話になります.
    僭越ながら質問させて頂きます.

    上記 DftIdftApp::calcMagImage() において,

    dft_rows = getOptimalDFTSize(src_rows-1);
    dft_cols = getOptimalDFTSize(src_cols-1);

    のコードがありますが, getOptimalDFTSize() 関数の引数がなぜ src_rows-1 あるいは src_cols-1
    とわざわざ”-1″のついた形になっているのでしょうか.

    getOptimalDFTSize() は必ず引数以上の値を返すので,上記の場合の戻り値が src_rows-1 および
    src_cols-1 であれば,元の画像のサイズが (src_rows * src_cols) であるのに対し,それより小さい
    サイズの ((src_rows-1) * (src_cols-1)) でDFTを行ってしまうのではないかと思います.

    この”-1″はReference ManualやOpenCV付属のサンプルソースでもそうなっているのですが(C/C++ともに),
    Reference Manualやインターネットの検索でも分かりませんでした.

    “-1″が必要である根拠を教えて下さればありがたく存じます.
    よろしくお願い致します.

    • idojun より:

      ご指摘ありがとうございます.
      OpenCVのソースコードを追いかけてみたのですが,これは単純にサンプルのバグのようです.ご迷惑をおかけしました.
      ちなみに,r4709以降のSVN版やOpenCV-2.2付属のサンプル(cpp)でも修正されていました(しかし,Python版はそのまま).
      上述のサンプルも修正いたしました.

      • ftarrega より:

        idojun様
        ご返信ありがとうございます.
        了解致しました.

  4. Yoshii より:

    返事が遅れてすみません。
    了解しました。ありがとうございました。

  5. Yoshii より:

    単純な質問ですが、「2次元フーリエ変換,フーリエ逆変換」のサンプルソースの74行目(log(mv[0]+1, mv[0]); )ですが、これで正しいのでしょうか?よろしくお願いします。

    • idojun より:

      2乗和の値が大きいため,その対数を取っています.その際に「0」の対数を取ることはできませんので,全体に+1をしてから処理を行っています.

ftarrega への返信