YouTube で見た以下のビデオが面白かったので,似たようなものを OpenCV のサンプルとして作ってみました.cv::dft,cv::idft を利用しています.処理の詳細は,ビデオをご覧ください.
(1)動画(サンプル実行の例)
(2)静止画
(左)対数パワースペクトル, (右)IDFT結果 左画像の黒い領域は,選択された(IDFTの対象となる)周波数,方向の正弦波を表します.この領域は,対数パワースペクトル画像上をマウスでクリック,ドラッグなどすることで選択できます.多くの正弦波を重ね合わせることで,より元の画像に近づく様子が分かります.
⇒
ジョゼフ・フーリエ (Joseph Fourier)
77行目の【shiftDFT(mv[0], mv[0]);】では、何のためにこのような処理がされているのでしょうか。 基本的なことだったらすいません。 よろしくお願いします。
これはわかりやすいですね。 フーリエ変換とOpenCVの使い方がよくわかりました。
>idft_win(“IDTF”)
IDTFはIDFTのミスですよね。 勉強してて、ちょっと微笑みました。
すごく勉強になりました。
お世話になります. 僭越ながら質問させて頂きます.
上記 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″が必要である根拠を教えて下さればありがたく存じます. よろしくお願い致します.
ご指摘ありがとうございます. OpenCVのソースコードを追いかけてみたのですが,これは単純にサンプルのバグのようです.ご迷惑をおかけしました. ちなみに,r4709以降のSVN版やOpenCV-2.2付属のサンプル(cpp)でも修正されていました(しかし,Python版はそのまま). 上述のサンプルも修正いたしました.
idojun様 ご返信ありがとうございます. 了解致しました.
返事が遅れてすみません。 了解しました。ありがとうございました。
単純な質問ですが、「2次元フーリエ変換,フーリエ逆変換」のサンプルソースの74行目(log(mv[0]+1, mv[0]); )ですが、これで正しいのでしょうか?よろしくお願いします。
2乗和の値が大きいため,その対数を取っています.その際に「0」の対数を取ることはできませんので,全体に+1をしてから処理を行っています.
名前 (必須)
メールアドレス (非公開) (必須)
ウェブサイト
77行目の【shiftDFT(mv[0], mv[0]);】では、何のためにこのような処理がされているのでしょうか。
基本的なことだったらすいません。
よろしくお願いします。
これはわかりやすいですね。
フーリエ変換とOpenCVの使い方がよくわかりました。
>idft_win(“IDTF”)
IDTFはIDFTのミスですよね。
勉強してて、ちょっと微笑みました。
すごく勉強になりました。
お世話になります.
僭越ながら質問させて頂きます.
上記 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″が必要である根拠を教えて下さればありがたく存じます.
よろしくお願い致します.
ご指摘ありがとうございます.
OpenCVのソースコードを追いかけてみたのですが,これは単純にサンプルのバグのようです.ご迷惑をおかけしました.
ちなみに,r4709以降のSVN版やOpenCV-2.2付属のサンプル(cpp)でも修正されていました(しかし,Python版はそのまま).
上述のサンプルも修正いたしました.
idojun様
ご返信ありがとうございます.
了解致しました.
返事が遅れてすみません。
了解しました。ありがとうございました。
単純な質問ですが、「2次元フーリエ変換,フーリエ逆変換」のサンプルソースの74行目(log(mv[0]+1, mv[0]); )ですが、これで正しいのでしょうか?よろしくお願いします。
2乗和の値が大きいため,その対数を取っています.その際に「0」の対数を取ることはできませんので,全体に+1をしてから処理を行っています.