• ベストアンサー
  • すぐに回答を!

画像の離散フーリエ変換

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

noname#21101
noname#21101

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1258
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1
noname#15436
noname#15436

一般的な離散フーリエ変換(DFT)は複素数から複素数への変換です。 (実用上,実数から複素数への変換,すなわち実離散フーリエ変換が使われることが多いかもしれませんが。) したがって,  実部の DFT から 実部と虚部が出て,  虚部の DFT から 実部と虚部が出る。 のではなくて,  実部と虚部の組の DFT から実部と虚部の組が出る。 と考えればよいです。 これなら最終的にも,実部用の配列が1個,虚部用の配列が1個でいいですよね? 詳細は参考 URL をどうぞ~

参考URL:
http://www.kurims.kyoto-u.ac.jp/~ooura/fftman/

共感・感謝の気持ちを伝えよう!

質問者からのお礼

やり方は理解できましたので、これからプログラムを組んでみます。 ご回答ありがとうございました。

関連するQ&A

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

  • 2次元データのフーリエ変換とデータ形式について

    画像やエクセルシートのように平面2次元的に広がっているデータがあります。このデータについて2回(2方向)のフーリエ変換を取るのですが、1回(1方向)のフーリエ変換プログラムを2回(2方向)することになると思います。 複素フーリエなので、1回目は複素数型の配列の実部に解析したいデータ系列、虚部はゼロとしてフーリエ変換します。この場合の出力値(複素数配列)で意味があるのは、実部、虚部の配列の前半だけであり、後半は前半の対称とか点対称になっています(前半が分かれば後半がわかるのだから情報量としてはゼロ)。 1回目の出力結果を2回目の変換に渡すわけですが、1回目の出力としての複素数配列のデータはその意味のないところも含めてフーリエ変換に渡すのでしょうか。 フーリエ逆変換で元に戻すときは、”無意味”な対称・点対称成分も含めて逆変換するわけですからその部分も必要ということでしょうか。その方がプログラムとしてはラクではあります。何もしないということなので。 説明がヘタだなと思いますが、主旨を汲み取り頂いて回答して頂けると助かります。 よろしくお願いします。

  • 2次元データの複素フーリエ変換するコードの作成

    数値計算等の2次元や3次元の空間データ(実数)をFFTによって複素フーリエ変換する実際のプログラム化についてお尋ねします。プログラムの実装ということなので実際的な質問で長文になっています。すみません。 まず、手持ちに1次元のFFTプログラムがあるということを前提とします(逆フーリエ変換すると、元の実数の系列が出ることは確認済のコード)。そして2次元配列の実数のデータがあるとします。この2次元のデータを2次元の複素フーリエ成分に変換することが目的です。(私の分野では波数空間への展開ということになり、複素数ですから位相情報も含まれることになります。) 例えば、x,y方向に16x16のデータあるとすると、 do j=1,16 ここでjを固定してi:1~16の実数データについて1次元のFFTをかける。 このとき、FFTにかける16個の実数データを複素数の実部に入れて、虚部はゼロとする。 FFTの出力も複素数となっている。 ここで出てくる複素フーリエ変換の結果は実部・虚部で前半(0~7)であり、後半(8~15)はその対称とか点対称(符号が逆)とかになっている(虚部をゼロとしているから)。それを複素数の2次元配列として保存する。 enddo 次いで、 do i=1,16 iを固定してj方向にFFTをかける。このとき、FFTに放り込むデータは上記の複素フーリエ変換の出力結果である2次元データを使う。具体的には複素数の2次元データをj方向の1次元の複素数配列にコピーしてFFTをかけて、その出力結果を新たな2次元配列の複素数に保存する。 enddo この結果、得られた2次元の複素数のデータが、私の所望のデータである、ということです。 式が指し示すとおりのことをすればいいのだ、ということに尽きるのだろうと思いますが、アルゴリズム的にアンバランスのように見えてこれでいいのかなと思えてしまいます。最初に虚部をゼロにするというようなこととかです。そのため確信が持てません。また、結果を見てもわかりにくい面があります。 このような考え方で実装するということいいのでしょうか。全く間違っているでしょうか。もしその場合、考え方の間違いを指摘して頂けると助かりますが(根本的な間違いだったら指摘しようがないということにもなりますが。) また、例えば、始めから実数の2次元配列をすぐに2次元複素数の実部に入れて、虚部をゼロとしてそこからコード方がすっきりするのかなと思いますが。 この辺が確定すると、3次元は同じことということになります。 サンプルコードがネットに出ているという面もありますが、自分でやる方が組み込みやすいのでお尋ねしました。 長文で申し訳ありませんが、よろしくお願いします。

  • 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次元フーリエ変換した値をどのようにすればいいのでしょうか? 具体的に教えてください。

  • 画像をペイントで縮小したい

    いつもお世話になっております。 オークションなどでデジカメで撮った画像を載せようとすると 『500KB以下に加工してから再度お試しください』と出るのでいろいろ調べたところ、 ペイントで小さく出来ることが分かったのですが、 『伸縮と傾き』の数字を入力するところにどれくらいを 入力すると500KB以下になるのかが分からないので質問させていただきました。 4ヶ所入力部分があるので(水平方向H、垂直方向V、水平方向O、垂直方向E)  各部分教えていただけたら嬉しいです。

  • 複素フーリエ変換の位相について

    画像のとおり位相0度から始まるA列の正弦波を複素フーリエ変換しました。 その実部、虚部のグラフがReal、Imagです。 虚数のみ正弦波の周波数のところにピークがあって、実部は0です。つまりこれは位相が90度又は-90度という事になります。 試しに45度から始まる正弦波を複素フーリエ変換すると、上記は-45度になりました。 フーリエ変換の位相というのはそれぞれの周波数成分を正弦波として開始時の位相を求めるものと思っていましたが、実は余弦波だとしているという事なのでしょうか?

  • 画像に関する知識がなさ過ぎて困っています!!

    おはようございます(;O;) 今ある画像が解像度300かどうか確認したいのですが、 どうやったらわかるか教えてください。 画像のプロパティのイメージのところを見ると、 大きさ 3000×4000 幅 3000ピクセル 高さ 4000ピクセル 水平方向の解像度 180dpi 垂直方向の解像度 180dpi ビットの深さ 24 解像度の単位 2 などと書いてあります。 これは解像度は180の画像だと判断してもいいのでしょうか??? だとしたら、解像度300の画像に変えるにはどうしたらいいのでしょうか?? 初心者なので なるべく簡単な言葉で回答よろしくお願いします(:_;) それと、とても急いでいるので、勝手ですがなるべく早く回答していただけたら嬉しいです! どうかよろしくお願いします!!!

  • ゲーム画像の入れ替え

    Game Graphic Studio を使ってゲーム(pro evolution soccer 6 )の画像を差し替えたいんですけど、 入れ替える画像のプロパティ→概要の欄の幅、高さ、水平方向の解像度、垂直方向の解像度、ビットの深さ、フレーム数 を元の画像とすべて同じにして差し替えても、ゲーム画面だと真っ暗になっちゃうんだけどどうすれば、ちゃんと表示されますか?