2012-04-25 49 views
3

私はフーリエ記述子を使用して単純な形状を認識するためのシンプルなシステム構築しようとしています上の図形の特徴を抽出する:(下記リンク)
を:私は私のプログラムに高速フーリエ変換のこの実装を使用しています をhttp://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29フーリエ変換とフーリエ記述子は、Java

fft(double[] inputReal, double[] inputImag, boolean direction) 

入力は、(本質的にX、境界パラメータのy座標は、私は)実およびIMAG部 出力が変換実数およびIMAG数です。

質問:私のシンプルな図形の不変記述子として出力(変換された実数、画像)を使用するにはどうすればよいですか?

これは私が考えたものだった:

  • は、各NステップのためにR = sqrt(real^2 + imag^2)を計算します。
  • RR[1]で除算すると、それを不変にする正規化係数です。
    私の記述子が不変ではありません...私は思う:

問題は、私は他の言葉で

(ように適用わずかな回転、などなど)、わずかに異なる画像のための非常に異なるR値を取得することです私はR値を得ることに間違ったことをしています。

+0

フーリエ級数のための素晴らしいサイトは、それを見てください[フーリエ級数](http://www.falstad .com/fourier /) – Tirtha

答えて

8

フーリエ記述子について最初に知っておくべき理論があります。それは非常に興味深いテクニックですが、正しく考案する必要があります。あなたが望むのは不変です。回転、変換、多分アフィン変換のための不変性。

  • あなたはDC-用語を使用しないでください、翻訳への不変性が必要な場合は、それはフーリエ変換のあなたの結果の配列の最初の要素がある:あなたが考慮して、物事以下の取るべきフーリエ記述子の他のセットとの良好な比較を可能とするために、係数
  • スケーリングに不変性を持たせたい場合は、すべてのフーリエ係数をDC係数で除算するなどして、比のように比較します。 f * [1] = f [1]/f [0]、f * [2]/f [0]などとなる。
  • 輪郭の始点を不変にしたい場合は、結果のフーリエ係数の絶対値のみを使用します。
  • 2つの異なるオブジェクトの係数を比較する場合、最初の5〜8フーリエ係数のみが有効です。より高い係数はあなたの輪郭の細部にしか入りませんが、これはほとんど有用ではありません。
  • 2つのオブジェクトとそれらのフーリエ記述子があるとしましょう。結果として得られるフーリエ係数の配列は、異なるサイズであってもよく、結果として得られる周波数成分の「周波数間隔」が両方の形状で異なることを意味する。あなたはリンゴと梨を比べることはできません。最も長い輪郭のサイズに合わせて最短の輪郭をゼロパッドし、フーリエ記述子を計算します。今では、係数と良い比較の間に類推があります。

これが役に立ちます。 Btw、私の意見では、ユーザーが作成したFFTソリューションは信頼できません。ソリューションライブラリを手に入れてください。画像を扱う場合、OpenCVはフーリエ変換ユーティリティを提供します。

0

異なる形状に合わせる場合は、MPEG-7標準のさまざまな形状記述子を使用してみてください。あなたはおそらく分類器を必要とし、SVM、ブースティング、ニューラルネットワークを見てください:http://docs.opencv.org/modules/ml/doc/ml.html

関連する問題