3

フーリエ記述子を使用して単純な形状を認識する単純なシステムを構築しようとしています: プログラムで高速フーリエ変換のこの実装を使用しています: (以下のリンク)
http://www.wikijava.org/wiki/The_Fast_Fourier_Transform_in_Java_%28part_1%29

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

入力は次のとおりです。実数とimagの部分(基本的に、私が持っている境界パラメーターのx、y座標です)と出力は、変換された実数とimagの数値です。

質問: 出力 (変換された real,imag ) を単純な形状の不変記述子として使用するにはどうすればよいですか?

これは私が考えたことでした:

  • R = sqrt( real^2 + imag^2 )N ステップごとに 計算します。
  • RそれぞれをR[1]= 正規化係数で割り、不変にします。

問題は、わずかに異なる画像 (わずかな回転が適用されているなど) に対して非常に異なる R 値が得られることです。

言い換えれば
私の記述子は不変ではありません... R値の取得に何か問題があると思います。

4

2 に答える 2

9

フーリエ記述子について最初に知っておく必要のある理論があります。これは非常に興味深い手法ですが、正しく考案する必要があります。あなたが望むのは不変性です。回転、並進、おそらくアフィン変換の不変性。フーリエ記述子の他のセットと適切に比較できるようにするには、次のことを考慮する必要があります。

  • 変換に不変性が必要な場合は、結果のフーリエ係数の配列の最初の要素である DC 項を使用しないでください。
  • スケーリングに対する不変性が必要な場合は、たとえばすべてのフーリエ係数を DC 係数で除算するなどして、比較を比率のようにします。f*[1] = f[1]/f[0]、f*[2]/f[0] など。
  • 等高線の始点に対する不変性が必要な場合は、結果のフーリエ係数の絶対値のみを使用してください。
  • 2 つの異なるオブジェクトの係数を比較する場合、最初の 5 ~ 8 個のフーリエ係数だけが役立ちます。より高い係数は、ほとんど有用な情報ではない輪郭の詳細にのみ入ります。(重要なのはグローバルフォームです)
  • 2 つのオブジェクトとそれらのフーリエ記述子があるとします。結果として得られるフーリエ係数の配列は、異なるサイズになる可能性があります。つまり、結果として得られる周波数コンテンツの「周波数間隔」は、両方の形状で異なります。リンゴとナシを比較することはできません。最短の等高線をゼロで埋めて、最長の等高線のサイズに合わせてから、フーリエ記述子を計算します。これで、係数間の類推と適切な比較ができました。

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

于 2012-08-13T11:59:35.937 に答える
0

異なる形状を一致させたい場合は、MPEG-7 標準の異なる形状記述子を使用してみてください。おそらく分類子が必要になるでしょう。SVM、Boosting、Neural Networks ... を見てください: http://docs.opencv.org/modules/ml/doc/ml.html

于 2013-06-12T10:40:17.290 に答える