Saya telah berhasil menguji algoritma korelasi fase 1D untuk menentukan pergeseran vertikal antara dua gambar sintetis.
Namun, ketika saya pindah ke gambar asli, itu tidak dapat mendeteksi terjemahan sama sekali (puncaknya terletak pada 0, yang merupakan hasil yang salah).
Saya memiliki gambar-gambar berikut:
Dan menghasilkan korelasi fase (Magnitude, Real, Imaginary):
Garis pemindaian pertama gambar benar-benar putih, tetapi pergeserannya jelas lebih besar (20 piksel).
Hasil yang diharapkan adalah garis putih pada baris ke-20 yang hanya terjadi pada gambar sintetis atau noise ringan.
Algoritme saya sangat sederhana - untuk setiap kolom gambar:
- Hitung 1D FT kolom gambar sumber dan target (
a=FT(A)
,b=FT(B)
) - Compute cross-power spectrum (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
menunjukkan mutliplikasi pointwise,conj(x)
menunjukkan konjugat kompleks - Hitung korelasi fase (
phase = IFT(cross_power)
) - Temukan besaran maksimum di setiap kolom
phase
. - Temukan lokasi puncak konsensus (mis. Median lokasi puncak yang terdeteksi)
Bisakah Anda memberi tahu saya cara meningkatkan algoritma korelasi fase awal untuk menangani gambar dunia nyata (berisik)?
Haruskah saya lebih suka menggunakan NCC (Normalized Cross Correlation) daripada korelasi fase berbasis FFT?
MEMPERBARUI
Saya sedang bereksperimen dengan zero padding untuk mengesampingkan kesalahan yang diperkenalkan oleh pengalihan sirkuler (hanya penggeseran gambar sederhana yang diinginkan) dan menguji ini pada gambar asli dari Wikipedia:
Puncak tunggal jelas ada sebagaimana mestinya:
Namun - jika saya melakukan sedikit penghalusan (Gaussian blur) untuk mengurangi kebisingan dan benar-benar meningkatkan hasilnya, korelasi fasa keluar benar-benar hancur:
Berikut adalah versi yang disempurnakan - puncak aslinya lebih lemah (mengapa ??) dan muncul puncak baru di sekitar nol shift (mengapa ??):