• ベストアンサー

画像を二次元フーリエ変換

c言語で画像を入力して2次元フーリエ変換を行い,逆変換をしたいのですが全然うまくいきません. どなたか教えていただけませんか? いろいろ調べたのですが,プログラム初心者なのでどう書いていけばいいのかわからず辛いです... サンプルのコードも教えていただけると助かります. 画像サイズは256×256画素程度です.

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

検索すればソースコードは見つかると思います。 例えば http://hooktail.org/computer/index.php?2%BC%A1%B8%B5%A5%D5%A1%BC%A5%EA%A5%A8%CA%D1%B4%B9 とか プログラムを作るのが目的ではなく、計算するだけならImageJで画像処理ができます。 http://rsbweb.nih.gov/ij/ メニューにFFTがありますのでそれを使ってみてください。数値での入出力もできます。 フーリエ変換の結果は普通は複素数になるのですが、このソフトは絶対値をとっているはずで、普通はこれで十分ななずです。 複素数の結果が欲しいのなら http://www.r-project.org/ https://www.scilab.org/ http://www.gnu.org/software/octave/ などで計算できます。 画像から数値データへの変換は上記のImageJで可能です。

yoy8e8e8e
質問者

お礼

返信遅くなってしまい申し訳ありませんでした. おかげさまで無事にプログラムが動きました! ありがとうございました!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

基本的には 1次元のフーリエ変換を各軸に対して実行するだけだから, 1次元フーリエ変換がきちんとできていればできるはず. 「全然うまくいきません」ってのは, 具体的には何がどう「うまくいかない」んですか? とはいえ, なんで「プログラム初心者」がこんなコードを書かされているのかが分からん....

関連するQ&A

  • 画像をフーリエ変換するソース開示&フリーソフト

    お世話になります 画像をフーリエ変換するフリーソフトで、ソースコードが開示されているものを探しております。 もしくは、画像(2次元)用フーリエ変換部のみのサンプルソースでも構いませんので、 お心当たりの方、いましたら、教えていただけないでしょうか 言語はVB系、C系ですと助かります

  • 三次元のフーリエ変換

    C言語で 三次元のフーリエ変換を作成したいんですが,拙者が GNU Scientific Libraryを使いたいんで、どうやって実装をするんですか?とにかく お願い致します.

  • C言語プログラムの離散フーリエ変換

    C言語プログラムの離散フーリエ変換について教えてください。「C言語による画像再構成の基礎」という本のプログラムをもとに二次元画像をDFT(通常の離散フーリエ変換)→InveresFFT(逆高速フーリエ変換)すると画像が左右反転、上下反転してしまいます。DFT→InverseDFTやFFT→InverseFFTだとそのようにはなりません。通常のDFTとFFTのアルゴリズムの違いからしかたがないのでしょうか?それともプログラムの変更で修正できるのでしょうか?どうしてもDFT→InverseFFTでがぞうをもとに戻したいのです。 サンプルページ http://www.iryokagaku.co.jp/frame/03-honwosagasu/370/370-dl.html P4-14fourier2d1d.c (離散フーリエ変換DFT)   P4-15fft.c(高速フーリエ変換)プログラムです

  • 画像の離散フーリエ変換

    現在画像の離散フーリエ変換をしており、 「c言語で学ぶ実践画像処理」という本には、 水平方向に1次元の離散フーリエ変換をした後、垂直方向に1次元の離散フーリエ変換をすれば良いと書いてあるのですが、 疑問があります。 最初に実部用の配列と虚部用の配列を用意します。 原画像を水平方向に離散フーリエ変換します。 そうすると、初めに用意した実部、虚部用の配列に値が入ります。 ここからさらに垂直方向の離散フーリエ変換をすると、 実部の垂直方向の離散フーリエ変換から実部と虚部が出て、 虚部の垂直方向の離散フーリエ変換から実部と虚部が出て、最終的には実部用の配列が2個、虚部用の配列が2個必要で、 ここからどうやって離散逆フーリエ変換や、振幅スペクトルを求められるのだろうかと混乱しております。 水平方向に1次元の離散フーリエ変換をした後、垂直方向に1次元の離散フーリエ変換はどのようにすれば良いのでしょうか? よろしくお願いいたします。

  • フーリエ変換

    フーリエ変換 ボイスチェンジャーを作ろうとしているんですが、フーリエ変換がわかりません。 どなたか教えていただけますか? できればCかC++のサンプルコードをつけていただけると、ありがたいです。

  • 2次元フーリエ変換

    ある画像f(x,y)をθ回転させたものを2次元フーリエ変換すると、それはf(x,y)の2次元フーリエ変換F(u,v)の結果をθ回転したものになるみたいなのですが、どうしてそうなるのかわかりません。 拙い説明で申し訳ありませんがよろしくお願いいたします。

  • 画像の2次元フーリエ変換の結果の表示の仕方について

    現在、C言語で画像に2次元離散フーリエ変換を施し、高速フーリエ変換と比較しろという課題に取り組んでいます。 以下の様なプロセスで2次元フーリエ離散変換を施し、結果を表示しようと思っています。 ・画像を読み込み、float型配列に入れる。 (画像は一番左上が原点とします。256×256のサイズです) ・上記のfloat型配列の、第1象限と第3象限、第2象限と第4象限を各々入れ替える。 ・各行ごと、つまり、f[0][0]~f[0][255]、f[1][0]~f[1][255]、と順々)に1次元離散フーリエ変換を施す。 ・上記のフーリエ変換の結果を各列ごと、つまり、f[0][0]~f[255][0],f[1][1]~f[255][1]という風に1次元離散フーリエ変換を施す。 ・フーリエ変換の結果の、第1象限と第3象限、第2象限と第4象限を各々入れ替える。 ・f[][]のパワースペクトル(実部の2乗+虚部の2乗の、自然対数をとったもの)を計算する。 ・そのパワースペクトルとをfloat型なので、char型に置き換えて画像として出力する。 正規化等の少し細かいところは省略しました。 結果として、参考書等で見かけるもの(真ん中が直流成分で、含まれる周波数を濃淡で表したもの)になればいいのですが、上記のプロセスで大丈夫ですか? パワースペクトルを計算した後に、何らかの移動の処理(つまり、画像の真ん中が直流成分となるような処理)を施す必要がなく、 フーリエ変換の計算の前と後に象限の入れ替えを施すだけで、直流成分が出力画像の真ん中に来るということですか? フーリエ変換の前と後で、象限を入れ替えるだけで周波数空間では原点が真ん中になることが納得できないです。 ややこしい質問ですが、「プロセスのここが間違ってるよ」等を教えていただけると助かります。特にパワースペクトルの部分等。 よろしくお願いします。

  • 2次元離散フーリエ変換について

    2次元離散フーリエ変換の2次元FFTを用いて、縦256×横256 縦1024×横1024の場合の画像を大きさを求めてもらいたいです。 2次元フーリエ変換について調べたのですが理解することが出来ませんでした。 お手数ですが回答お願いします

  • 2次元フーリエ変換の実際について

    「画像などを対象にする2次元フーリエ変換は、縦方向の1次元フーリエ変換と横方向の1次元フーリエ変換を組み合わせることにより計算できます」 との解説があります。下に示すような2次元の値で計算する場合、具体的にどのようにすればよいのでしょうか? (9×9ピクセルの2次元画像でa1~a9はピクセル値とする)           a1 a2 a3            a4 a5 a6            a7 a8 a9 計算方法 1) 横方向(→方向)の1次元フーリエ変換をおこなう          →a1 a2 a3          →a4 a5 a6          →a7 a8 a9 2) 縦方向(→方向)の1次元フーリエ変換をおこなう          →a1 a4 a7          →a2 a5 a8          →a3 a6 a9 これはできるのですが、「縦方向の1次元フーリエ変換と横方向の1次元フーリエ変換を組み合わせる」の意味がわかりません。 横方向や縦方向の1次元フーリエ変換した値をどのようにすればいいのでしょうか? 具体的に教えてください。

  • フーリエ変換すると次元が変わる

    http://okawa-denshi.jp/techdoc/2-1-1CRkato.htm ここのページの式2-1-7に書かれてあるように RCの直列回路に流れる電流は時間の指数関数で表されます。 http://okawa-denshi.jp/techdoc/images/equ2-1-7.gif 一方で、この式をフーリエ変換して電流の周波数特性を求めたいと考えています。 http://www.crl.nitech.ac.jp/~ida/education/etc/FT/FT.pdf ここのページの5ページ目に指数関数のフーリエ変換の公式が書かれているのですが、 t < 0 において電流がゼロだとしてフーリエ変換をかけると i(ω) = (V/R)(1/ω_c)/(1-iω/ω_c) になります。 ここでω_c = 1/RC を表します。 式2-1-7の電流の次元は[A]なのに対して、 フーリエ変換後の電流の次元は[A sec]となってしまいます。 これはフーリエ変換において時間で積分しており、(1/ω_c)という係数がついているためです。 [A]の次元での周波数特性の式を求めたいのですが、 どうすれば良いでしょうか?

専門家に質問してみよう