ライン検出用のFFT


8

ほとんどの人が尋ねるのとは異なる方法でFFTを使用しようとしています。通常の繰り返しの垂直線があるグラフの写真を撮り、画像を処理して、線が平均してどれだけ離れているかをピクセルで判断できるようにしたいと考えています。私はキャニーエッジ検出とハフライン検出を試してみましたが、関心のあるラインのみを正確に検出できるほど画像を最適化できないと思います。

したがって、私の試みは、画像の10行をスキャンして、ピクセル値をピクセル列に対応するビンに蓄積することです。グラフ化すると、非常に見栄えの良い波形になります。これに対してDFTまたはFFTを実行すると、ライン反復の周波数であると思われるピークを見つけることができます。(これは誤った仮定である可能性があります)

私の質問は、この番号は何に対応していますか?つまり、ピクセル単位であるため、サンプリングレートがどうなるか混乱していると思います。これはFFTの有効な使用法だと思いますが、私が成功するはずだと思う時点でここに落ちています。

例として。幅300ピクセルの画像を作成しました。正確に30ピクセル間隔で描画された1ピクセル幅の線があります。2つのピークが見つかりました。1つは75に、もう1つは実際のコンポーネントの225(対称に見える)です。(架空のコンポーネントが再生されるとは思いませんか??)線が30ピクセル離れていることを知っています。75と225はどのように関連していますか?

私はこれを得るために一生懸命努力しています、そしてあなたが推薦することができるどんな助けにも感謝します。この時点で、エッジ検出をあきらめ、このアプローチを試してみたいと思います。

前もって感謝します。

image  opencv  fft  dft 

回答ありがとうございました!FFTがうまく機能していないようです。架空のコンポーネントをどのように追加しますか?私が使用するプログラム(stat plus)は、実数と虚数の列を出力するだけです。私はx軸に実数をプロットしていましたが、虚数を含めることができるより良い方法があると確信しています。また、自己相関の道を進み、結果を得ました!甘い!しかし、それは常により多くの質問を持ち出す 私が得た結果は元の画像の2倍のサイズです(当然のことながら)、中央付近の振動がはるかにきれいになっています。韻や理由はありますか

回答:


6

あなたはこれのために自己相関を試すことを見るかもしれません。以下は、FFTを使用してMatlabで自己相関を実行する方法を説明するSOの回答です。これは2次元に拡張できます。

私はあなたのテストケースを次のようにnumpyで実装しました:

a = np.zeros(300)
a[::30] = 1
plt.acorr(a, maxlags=50)

これにより、次のプロットが得られます。

ここに画像の説明を入力してください

ご覧のとおり、ピークは+/- 30でポップアップします。


4

画像に10本の垂直線がある場合、全水平走査線(300 pix)のFFTは、ビン10またはビン11の周りにある程度の大きさのコンテンツを示すはずです。300のうちのビン75は、4ピクセルごとに何かが起こっていることを示します。そう。

グリッドラインが中心から外れている場合、スペクトルコンテンツが奇数として表示される可能性があるため(「虚数」であるため)、「実際の」コンポーネント(実際には偶数コンポーネント)だけでなく、FFT結果の大きさを確認する必要があります。 FFT結果で)。

FFTへの実際の入力が与えられた場合、結果のビンにはN / 2(この場合は150を超える)が含まれ、複素共役を除いて同じデータの繰り返しが含まれます。だからあなたはそれらを無視することができます。


0

私はアイデアをたくさん持っていないが、作るために、あなたは中心に試すことができ、視覚的、直感的な(の各値乗算することによって。これを行うと、DC成分が中央に表示され、全体が対称になります。F F T F F T 1 x + y F F TFFTFFTFFT(1)(x+y))FFT

これについてはよくわかりませんが、ピークと中心の間の距離(ピクセル単位)が周期性を示していることがわかります。周期性を取得すると、各オブジェクト間の距離に簡単に到達できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.