Phase Correlation - Performa Buruk pada Gambar Bising / Kabur?

9

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:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Dan menghasilkan korelasi fase (Magnitude, Real, Imaginary):

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

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:

  1. Hitung 1D FT kolom gambar sumber dan target ( a=FT(A), b=FT(B))
  2. Compute cross-power spectrum ( cross_power = a *. conj(b) / |a *. conj(b)|) - *.menunjukkan mutliplikasi pointwise, conj(x)menunjukkan konjugat kompleks
  3. Hitung korelasi fase ( phase = IFT(cross_power))
  4. Temukan besaran maksimum di setiap kolom phase.
  5. 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:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Puncak tunggal jelas ada sebagaimana mestinya:

masukkan deskripsi gambar di sini

Namun - jika saya melakukan sedikit penghalusan (Gaussian blur) untuk mengurangi kebisingan dan benar-benar meningkatkan hasilnya, korelasi fasa keluar benar-benar hancur:

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Berikut adalah versi yang disempurnakan - puncak aslinya lebih lemah (mengapa ??) dan muncul puncak baru di sekitar nol shift (mengapa ??):

masukkan deskripsi gambar di sini

Libor
sumber
Seperti yang saya lihat, pada puncak gambar berkorelasi fase Anda menunjukkan pergeseran yang sesuai. Namun, saya tidak tahu apa amplitudo nyata dari korelasi silang antara gambar-gambar itu.
Eddy_Em
@ Eddy_Em Saya akan menghasilkan gambar terpisah untuk bagian nyata dan imajiner dan menambahkannya ke posting dalam beberapa saat. Sejauh ini hanya ada informasi besarnya.
Libor
Referensi Anda di Wikipedia mengatakan untuk menggunakan transformasi Fourier 2D. Mengapa Anda menggunakan transformasi 1D?
Peter K.
1
Ya, tapi Anda harus membandingkan apel dengan apel. Hanya membandingkan kolom yang sama di setiap gambar tidak akan memberi Anda apa yang Anda inginkan. Jika pergerakannya cukup besar, tidak ada korelasi apa pun antara kolom. Anda perlu mempertimbangkan gambar secara keseluruhan. Salah satu cara yang mungkin berhasil adalah dengan menjumlahkan baris pada kedua gambar, dan melakukan pekerjaan 1D itu.
Peter K.
1
@PeterK. Ini adalah 2D - Saya telah memeriksa bahwa korelasi fase keluar seperti dalam artikel Wiki, hanya terbalik (mungkin karena pengganda terbalik ketika menghitung spektrum lintas daya atau membalik input / output). Saya menemukan bahwa smoothing (Gaussian window) benar-benar menyakitkan hasil akhirnya, tetapi tidak yakin mengapa. Saya akhirnya akan menggunakan Korelasi Lintas Dinormalisasi sebagai gantinya, karena Korelasi Fase tampaknya lemah ketika berhadapan dengan data frekuensi rendah.
Libor

Jawaban:

10

Versi satu dimensi

Versi satu dimensi yang Anda daftarkan tidak akan berfungsi. Ketika ada pergeseran gambar yang cukup besar (lebih dari satu atau dua piksel dalam gambar dunia nyata), tidak akan ada yang terkait dengan piksel kolom.

Untuk contohnya, cobalah:

I5 = rand(100,100)*255;
I6 = zeros(100,100);
I6(11:100,22:100) = I5(1:90,1:79);

Sehingga kita memiliki I5:

masukkan deskripsi gambar di sini

dan I6:

masukkan deskripsi gambar di sini

Maka korelasi fase satu dimensi adalah:

masukkan deskripsi gambar di sini

sedangkan korelasi fase dua dimensi adalah:

masukkan deskripsi gambar di sini

Agak sulit dilihat, tetapi ada puncak yang sangat tinggi di sudut kanan bawah gambar. Tidak ada puncak yang jelas ada dalam versi satu dimensi.

Mengapa perataan tidak membantu? # 1

Apa korelasi coba lakukan adalah menemukan variasi "serupa" di setiap gambar. Jika sinyal yang mendasarinya cukup acak, maka ini akan bekerja dengan baik: korelasi white noise dengan dirinya sendiri memberikan puncak yang sangat bagus di titik asal, dan mendekati nol di tempat lain.

Menghaluskan gambar "acak" dengan Gaussian akan memiliki efek memperlancar korelasi yang Anda harapkan --- menyebarkan energi di puncak mana pun di area yang lebih luas.

Menghaluskan memiliki efek sebaliknya dari "pra-pemutihan" gambar. Pra-pemutihan (seperti namanya) mencoba untuk membuat gambar lebih seperti white noise --- yang memiliki bentuk terbaik jika kita melakukan deteksi berbasis korelasi (di mana puncaknya terlokalisasi dengan baik).

Apa yang lebih baik Anda lakukan adalah menggunakan diffoperasi matlab untuk cara pra-pemutihan gambar yang sederhana, namun sangat efektif.

Lihat contoh ini.

Mengapa perataan tidak membantu? # 2

Mengapa perataan menyebabkan puncak ekstra?

Jika Anda menghaluskan setiap gambar dengan kernel k(x,y) lalu kita dapatkan:

hSebuah=gSebuahkhb=gbk
dimana adalah konvolusi.

Sekarang,

HSebuah=KGSebuahHb=KGbR=HSebuahHb|HSebuahHb|=|K|2GSebuahGb|K|2|GSebuahGb|=GSebuahGb|GSebuahGb|

Yang saya duga sedang terjadi (walaupun saya tidak yakin) adalah bahwa mungkin kernel Anda memiliki nilai mendekati nol dalam domain frekuensi, menyebabkan masalah numerik?

Jika saya menerapkan kernel:

K = one(5,5);

ke gambar acak saya, lalu saya dapatkan:

masukkan deskripsi gambar di sini

untuk korelasi dua dimensi, yang membuat puncak lebih tersebar, tetapi tidak menunjukkan masalah yang Anda lihat.

Peter K.
sumber
Jawaban yang bagus, terima kasih! Masalah yang saya miliki adalah bahwa puncak tidak hanya terlokalisasi dengan buruk, tetapi juga muncul pada posisi yang sepenuhnya salah. Saya akhirnya membaca JPLewis: "Korelasi Lintas Cepat yang Dinormalisasi" yang mengatakan bahwa korelasi fase memiliki masalah dengan energi gambar yang berbeda-beda di lokasi yang berbeda dan dengan demikian pra-penyaringan harus diterapkan - filter Laplacian diusulkan untuk pemutihan sinyal meskipun filter high-pass akan lakukan. Masalahnya tetap bahwa frekuensi cutoff tidak diketahui sebelumnya dan ambang batas terlalu tinggi atau terlalu rendah akan lagi merusak pencocokan. Tetapi saya akan mencobanya.
Libor
1
Off Topic: Sangat lucu bahwa pencarian Google untuk "pemutihan sinyal" akan mengajarkan Anda banyak tentang pasta gigi: D
Libor
2

Cara termudah untuk mendapatkan kinerja yang baik dari korelasi fase dengan memutihkan sinyal adalah dengan mengambil log besarnya. Anda juga dapat menyaring suara dari permukaan korelasi yang dihasilkan. Untuk perinciannya lihat “Memperbaiki Korelasi Fase untuk Registrasi Gambar”, Prosiding (ICVNZ2011) Image and Vision Computing New Zealand 2011, hal.488-493,, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? Sequence = 1

user9026
sumber