FFT untuk deteksi garis

8

Saya mencoba menggunakan FFT dengan cara yang berbeda maka kebanyakan orang bertanya. Saya ingin dapat mengambil gambar grafik dengan garis vertikal berulang yang teratur, dan untuk memproses gambar untuk menentukan seberapa jauh dalam piksel garis rata-rata terpisah. Saya telah mencoba deteksi tepi cerdik dan deteksi garis hough dan saya tidak berpikir saya dapat mengoptimalkan gambar cukup untuk mendeteksi secara akurat hanya garis saya tertarik.

Jadi, upaya saya adalah memindai 10 baris gambar dan mengakumulasi nilai piksel ke dalam nampan yang sesuai dengan kolom piksel. Apa yang dihasilkan ketika Anda membuat grafik adalah bentuk gelombang yang muncul dengan sangat baik. Ketika saya melakukan DFT atau FFT pada ini, saya dapat menemukan puncak yang saya percaya harus menjadi frekuensi pengulangan garis. (Ini mungkin asumsi yang salah)

Pertanyaan saya adalah, sesuai dengan apa angka ini? yaitu saya pikir saya bingung dengan berapa laju sampling saya karena berada dalam piksel. Saya pikir ini adalah penggunaan FFT yang valid, tetapi saya jatuh tepat di sini ketika saya pikir saya harus sukses.

Sebagai contoh. Saya membuat gambar dengan lebar 300 piksel. Ada 1 garis lebar piksel yang diambil tepat pada interval 30 piksel. Saya menemukan 2 puncak, satu di 75 dan satu di 225 (yang tampak simetris) untuk komponen sebenarnya. (Saya tidak percaya bahwa komponen imajiner harus bermain ??) Saya tahu garis-garis terpisah 30 piksel. Bagaimana hubungan antara 75 dan atau 225?

Saya berusaha sangat keras untuk mendapatkan ini, dan saya bersyukur atas segala bantuan yang dapat Anda rekomendasikan. Pada titik ini, saya menyerah pada deteksi tepi, dan ingin mencoba pendekatan ini.

Terima kasih sebelumnya.


sumber
Terima kasih banyak atas jawaban Anda! FFT sepertinya tidak berhasil. Bagaimana saya menambahkan komponen imajiner? Program yang saya gunakan (stat plus) hanya meludahkan kolom angka nyata dan imajiner. Saya telah merencanakan yang sebenarnya pada sumbu x, tapi saya yakin ada cara yang lebih baik untuk memasukkan angka imajiner. Juga, saya menyusuri jalan autokorelasi dan mendapatkan hasil! manis !, tetapi selalu memunculkan lebih banyak pertanyaan. Hasil yang saya dapatkan adalah dua kali ukuran gambar asli (dimengerti), yang jauh lebih bersih osilasi di dekat pusat. Apakah ada sajak atau alasan untuk

Jawaban:

6

Anda mungkin melihat mencoba Autocorrelation untuk ini. Berikut ini jawaban SO yang menjelaskan cara melakukan autokorelasi dengan Matlab menggunakan FFT. Ini dapat diperpanjang untuk dua dimensi.

Saya menerapkan uji kasus Anda dalam numpy sebagai berikut:

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

Ini memberikan plot berikut:

masukkan deskripsi gambar di sini

Seperti yang Anda lihat, puncak muncul di +/- 30.

mevatron
sumber
4

Jika ada 10 garis vertikal pada gambar Anda, maka FFT dari garis pemindaian horizontal penuh (300 piksel) akan menunjukkan beberapa konten besar di sekitar nampan 10 atau nampan 11. Nampan 75 dari 300 akan menunjukkan ada sesuatu yang terjadi setiap 4 piksel, atau begitu.

Anda benar-benar perlu melihat besarnya hasil FFT, bukan hanya komponen "nyata" (benar-benar komponen genap) karena, jika garis kisi Anda tidak terpusat, konten spektral dapat terlihat aneh (sehingga "imajiner" dalam hasil FFT).

Diberikan input nyata ke FFT, nampan hasil di atas N / 2 (di atas 150 dalam kasus Anda) hanya berisi pengulangan dari data yang sama kecuali terkonjugasi kompleks. Jadi Anda bisa mengabaikannya.

hotpaw2
sumber
0

Saya tidak punya banyak ide, tetapi untuk membuat intuitif secara visual, Anda dapat mencoba memusatkan (mengalikan setiap nilai dalam dengan . Setelah Anda melakukan ini, komponen DC Anda muncul di tengah, dengan seluruh simetris di sekitarnya.FFTFFTFFT(1)(x+y))FFT

Saya tidak begitu yakin tentang ini, tetapi ada sesuatu yang memberitahu saya bahwa jarak (dalam piksel) antara puncak dan pusat akan menunjukkan periodisitas. Setelah Anda memiliki periodisitas, Anda dapat dengan mudah mencapai jarak antara setiap objek.

rounak
sumber