FFT data gambar: "mirroring" untuk menghindari efek batas

8

Saya memuat dan menampilkan gambar nasi di Matlab:

g = imread('rice.png');
imshow(g);

Nasi

Saya mengambil FFT dari gambar ini dan menggesernya:

G = fft2(g);
imshow(log(abs(fftshift(G)) + 1), []);

FFT (beras)

Jika saya menempatkan kapak dan sumbu y melalui bagian tengah gambar; Saya menemukan bahwa gambarnya simetris g (-x, -y) = g (x, y). Untuk sinyal 1D kita memiliki bahwa FFT dari sinyal nyata memiliki bagian nyata simetris dan bagian imajiner asimetris. Saya kira itu yang kita lihat di sini dalam 2 dimensi?

Karena gambar asli lebih gelap di bagian bawah daripada di bagian atas, ada diskontinuitas horisontal yang kuat pada batas periodik yang menyebabkan garis vertikal di FFT.

Saya ingin menyingkirkan efek batas ini. Pendekatan umum untuk ini tampaknya windowing .

Namun saya ingin menyelesaikan masalah ini dengan teknik yang saya temukan di sebuah makalah yang disebut "mirroring". Makalah ini tidak terlalu spesifik sehingga saya perlu bantuan Anda dalam mencari tahu pendekatan ini :-).

Pertama saya membuat "ubin" simetris dari gambar aslinya:

tile=[flipdim(g,2) g; flipdim(flipdim(g,1),2) flipdim(g,1)];
imshow(tile);

masukkan deskripsi gambar di sini

Sekarang saya ambil FFT dari "ubin" ini:

Tile=fft2(tile);
imshow(log(abs(fftshift(Tile)) + 1), []) 

masukkan deskripsi gambar di sini

Garis vertikal tampaknya (hampir) hilang: bagus. Namun mirroring tampaknya telah memperkenalkan lebih banyak simetri.

Apa hasil yang benar: FFT dari gambar asli atau FFT dari gambar "mirrored"?

Apakah ada cara saya bisa "mirror" sehingga saya sama-sama menyingkirkan efek batas dan mendapatkan FFT murni nyata?

Terima kasih sebelumnya atas jawaban apa pun!

Andy
sumber

Jawaban:

13

FFT dari gambar asli sudah benar. Artefak yang Anda lihat adalah tipikal untuk DFT, karena fungsi dasar DFT mengalami kesulitan untuk mewakili sinyal non-periodik. Meskipun DFT panjangnya terbatas, itu sebenarnya merupakan sinyal periodik yang meluas hingga tak terbatas negatif dan positif. Fungsi dasar DFT adalah semua sinusoid dengan periode yang merupakan pembagi bilangan bulat dari ukuran DFT, sehingga semuanya mulai dan berakhir pada nilai yang sama, dan sulit baginya untuk menyesuaikan sinyal yang tidak periodik dengan cara ini. Jadi, bayangkan ubin gambar Anda: memang ada diskontinuitas tiba-tiba di ujungnya. Tepi tidak cocok dengan baik, dan itulah alasan untuk efek batas.

Dalam pemrosesan sinyal audio, di mana FFT sering digunakan, pendekatan yang sangat umum adalah menggunakan fungsi jendela , seperti yang Anda catat. Ini meruncingkan tepi ke arah 0, dan mengurangi efek ini.

Dalam pemrosesan gambar, DCT biasanya digunakan daripada DFT, karena memberlakukan batasan simetri berbeda yang memberikan hasil yang lebih baik. Dengan kata lain, ini digunakan untuk mencegah masalah yang Anda lihat. Berbeda dengan fungsi basis DFT (ingat bagaimana semuanya dimulai dan berakhir pada nilai yang sama), fungsi dasar DCT adalah pembagi integer atau setengah dari pembagi integer, sehingga banyak dari mereka mulai dan berakhir pada nilai yang berbeda. Akibatnya, kondisi batas tersirat berbeda: sinyal diasumsikan simetris pada tepinya, yang sebenarnya agak mirip dengan "mirroring" yang Anda eksperimen. Berikut ini adalah posting lain oleh saya dengan sedikit informasi lebih lanjut tentang DCT: https://dsp.stackexchange.com/a/362/392

Jadi, sebagai ringkasan singkat, jika Anda benar-benar mulai menggunakan FFT, Anda mungkin ingin mencoba windowing. Namun, pilihan terbaik mungkin adalah menggunakan DCT, yang menyiratkan kondisi batas yang mirip dengan ide "mirroring" Anda, dan sebagai hasilnya, menangani gambar dengan lebih baik.

schnarf
sumber
Dari apa yang saya mengerti DFT menyiratkan ekstensi berkala sedangkan DCT menyiratkan ekstensi bahkan. Saat melakukan kompresi gambar, seseorang bekerja pada blok kecil gambar. Karena ekstensi periodik yang tersirat oleh DFT menyebabkan lompatan di perbatasan yang pada gilirannya menurunkan tingkat konvergensi; lebih baik menggunakan DCT untuk kompresi gambar (konvergensi lebih cepat-> file yang lebih kecil dengan jumlah informasi yang terlihat sama). Namun DCT tampaknya sebagian besar disebutkan dalam konteks ini. Konteks tempat saya bekerja adalah bahwa saya ingin memfilter gambar dengan filter Gabor. Bisakah ini dilakukan dengan menggunakan DCT?
Andy
Jika Anda hanya ingin memfilter gambar dengan filter Gabor, Anda harus menggunakan FFT. Kondisi batas tidak akan menjadi masalah. Mengapa Anda khawatir tentang kondisi batas, atau memiliki spektrum murni nyata, untuk difilter dengan filter Gabor?
schnarf
Mengenai memiliki spektrum yang benar-benar nyata: Saya perlu memperkirakan frekuensi yang dominan: fu = Jumlah (u * G) / Jumlah (G) dan fv, di mana G (u, v) adalah FFT dari gambar saya g (x, y) . Saya tidak mengerti bagaimana ini bekerja jika G itu kompleks. Saya akan mendapatkan fu yang kompleks?
Andy
Daripada mempertimbangkan nilai-nilai kompleks, Anda harus mempertimbangkan besarnya mereka. Yaitu untuk setiap frekuensi bin kompleks z = a + bi, besarnya adalah sqrt (a ^ 2 + b ^ 2).
schnarf
Hal lain untuk dipikirkan: Mungkin membingungkan jika Anda mengambil data nyata dan mendapatkan spektrum yang kompleks. Spektrum kompleks hanyalah cara untuk memberikan setiap sinusoid fase tertentu.
schnarf