Saya bertanya-tanya apakah ada cara untuk menentukan apakah suatu gambar buram atau tidak dengan menganalisis data gambar.
203
Saya bertanya-tanya apakah ada cara untuk menentukan apakah suatu gambar buram atau tidak dengan menganalisis data gambar.
Jawaban:
Ya itu. Hitung Fast Fourier Transform dan analisis hasilnya. Transformasi Fourier memberi tahu Anda frekuensi mana yang ada dalam gambar. Jika ada frekuensi rendah dalam jumlah rendah, maka gambarnya buram.
Menentukan istilah 'rendah' dan 'tinggi' terserah Anda.
Edit :
Seperti yang dinyatakan dalam komentar, jika Anda ingin satu float mewakili kekaburan gambar tertentu, Anda harus membuat metrik yang sesuai.
Jawaban nikie memberikan metrik seperti itu. Gabungkan gambar dengan kernel Laplacian:
Dan gunakan metrik maksimum yang kuat pada output untuk mendapatkan nomor yang dapat Anda gunakan untuk thresholding. Cobalah untuk menghindari merapikan terlalu banyak gambar sebelum menghitung Laplacian, karena Anda hanya akan menemukan bahwa gambar yang dihaluskan memang buram :-).
sumber
Cara lain yang sangat sederhana untuk memperkirakan ketajaman suatu gambar adalah dengan menggunakan filter Laplace (atau LoG) dan cukup memilih nilai maksimum. Menggunakan ukuran yang kuat seperti 99,9% kuantil mungkin lebih baik jika Anda mengharapkan noise (yaitu memilih kontras ke-N tertinggi daripada kontras tertinggi.) Jika Anda mengharapkan berbagai kecerahan gambar, Anda juga harus memasukkan langkah preprocessing untuk menormalkan kecerahan gambar / kontras (mis. pemerataan histogram).
Saya telah mengimplementasikan saran Simon dan yang ini di Mathematica, dan mencobanya pada beberapa gambar uji:
Tes pertama mengaburkan gambar uji menggunakan filter Gaussian dengan ukuran kernel yang bervariasi, kemudian menghitung FFT dari gambar buram dan mengambil rata-rata frekuensi tertinggi 90%:
Menghasilkan plot logaritmik:
5 garis mewakili 5 gambar uji, sumbu X mewakili jari-jari filter Gaussian. Grafik menurun, sehingga FFT adalah ukuran yang baik untuk ketajaman.
Ini adalah kode untuk penaksir keburaman "LoG tertinggi": Ini hanya menerapkan filter LoG dan mengembalikan piksel paling terang dalam hasil filter:
Menghasilkan plot logaritmik:
Penyebaran untuk gambar yang tidak kabur sedikit lebih baik di sini (2,5 vs 3,3), terutama karena metode ini hanya menggunakan kontras terkuat dalam gambar, sedangkan FFT pada dasarnya adalah rata-rata di seluruh gambar. Fungsi-fungsinya juga menurun lebih cepat, jadi mungkin lebih mudah untuk menetapkan ambang batas "buram".
sumber
Selama beberapa pekerjaan dengan lensa fokus otomatis, saya menemukan serangkaian algoritma yang sangat berguna ini untuk mendeteksi fokus gambar . Ini diimplementasikan dalam MATLAB, tetapi sebagian besar fungsi cukup mudah untuk port ke OpenCV dengan filter2D .
Ini pada dasarnya merupakan implementasi survei dari banyak algoritma pengukuran fokus. Jika Anda ingin membaca makalah asli, referensi ke penulis algoritma disediakan dalam kode. Makalah 2012 oleh Pertuz, et al. Analisis operator ukuran fokus untuk bentuk dari fokus (SFF) memberikan ulasan yang baik dari semua ukuran ini serta kinerja mereka (baik dalam hal kecepatan dan akurasi seperti yang diterapkan pada SFF).
EDIT: Menambahkan kode MATLAB untuk berjaga-jaga jika tautannya mati.
Beberapa contoh versi OpenCV:
Tidak ada jaminan apakah langkah-langkah ini adalah pilihan terbaik untuk masalah Anda, tetapi jika Anda melacak makalah yang terkait dengan tindakan ini, mereka mungkin memberi Anda wawasan lebih lanjut. Semoga kode ini bermanfaat! Saya tahu saya melakukannya.
sumber
Membangun dari jawaban Nike. Sangat mudah untuk mengimplementasikan metode berbasis laplacian dengan opencv:
Akan menampilkan pendek yang menunjukkan ketajaman maksimum yang terdeteksi, yang didasarkan pada pengujian saya pada sampel dunia nyata, merupakan indikator yang cukup baik jika kamera fokus atau tidak. Tidak mengherankan, nilai normal tergantung pada adegan tetapi jauh lebih sedikit daripada metode FFT yang memiliki tingkat positif palsu yang tinggi untuk berguna dalam aplikasi saya.
sumber
Saya datang dengan solusi yang sama sekali berbeda. Saya perlu menganalisis frame video untuk menemukan yang paling tajam di setiap frame (X). Dengan cara ini, saya akan mendeteksi gambar blur dan / atau tidak fokus.
Saya akhirnya menggunakan deteksi Canny Edge dan saya mendapatkan hasil yang SANGAT SANGAT bagus dengan hampir setiap jenis video (dengan metode nikie, saya memiliki masalah dengan video VHS digital dan video interlaced berat).
Saya mengoptimalkan kinerja dengan menetapkan wilayah minat (ROI) pada gambar asli.
Menggunakan EmguCV:
sumber
Terima kasih nikie untuk saran Laplace yang hebat itu. OpenCV docs menunjuk saya ke arah yang sama: menggunakan python, cv2 (opencv 2.4.10), dan numpy ...
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))
hasilnya adalah antara 0-255. Saya menemukan sesuatu yang berusia lebih dari 200 tahun sangat fokus, dan pada usia 100, terlihat buram. maks tidak pernah benar-benar mendapat jauh di bawah 20 bahkan jika itu benar-benar kabur.
sumber
Salah satu cara yang saya gunakan saat ini adalah mengukur penyebaran tepi pada gambar. Cari makalah ini:
Biasanya di balik paywall tetapi saya telah melihat beberapa salinan gratis di sekitar. Pada dasarnya, mereka menemukan tepi vertikal dalam gambar, dan kemudian mengukur seberapa lebar tepi tersebut. Rata-rata lebar memberikan hasil estimasi blur akhir untuk gambar. Tepi yang lebih luas berhubungan dengan gambar buram, dan sebaliknya.
Masalah ini milik bidang estimasi kualitas gambar tanpa referensi . Jika Anda mencarinya di Google Cendekia, Anda akan mendapatkan banyak referensi yang bermanfaat.
EDIT
Berikut plot perkiraan blur yang diperoleh untuk 5 gambar di pos nikie. Nilai yang lebih tinggi sesuai dengan kekaburan yang lebih besar. Saya menggunakan filter Gaussian ukuran 11x11 ukuran tetap dan memvariasikan standar deviasi (menggunakan
convert
perintah imagemagick untuk mendapatkan gambar buram).Jika Anda membandingkan gambar dengan ukuran berbeda, jangan lupa untuk menormalkan dengan lebar gambar, karena gambar yang lebih besar akan memiliki tepi yang lebih lebar.
Akhirnya, masalah yang signifikan adalah membedakan antara blur artistik dan blur yang tidak diinginkan (disebabkan oleh kehilangan fokus, kompresi, gerakan relatif subjek ke kamera), tetapi itu di luar pendekatan sederhana seperti ini. Sebagai contoh kekaburan artistik, lihatlah gambar Lenna: Refleksi Lenna di cermin buram, tetapi wajahnya benar-benar fokus. Ini berkontribusi pada perkiraan blur yang lebih tinggi untuk gambar Lenna.
sumber
Saya mencoba solusi berdasarkan filter Laplacian dari posting ini . Itu tidak membantu saya. Jadi, saya mencoba solusi dari posting ini dan itu bagus untuk kasus saya (tetapi lambat):
Gambar yang kurang buram memiliki maksimum
sum
nilai !Anda juga dapat mengatur kecepatan dan akurasi dengan mengubah langkah, misalnya
bagian ini
Anda dapat mengganti dengan yang ini
sumber
Jawaban di atas menjelaskan banyak hal, tetapi saya pikir berguna untuk membuat perbedaan konseptual.
Bagaimana jika Anda mengambil gambar yang benar-benar fokus pada gambar yang buram?
Masalah deteksi kabur hanya diajukan dengan baik ketika Anda memiliki referensi . Jika Anda perlu merancang, misalnya, sistem fokus otomatis, Anda membandingkan urutan gambar yang diambil dengan berbagai tingkat kekaburan, atau menghaluskan, dan Anda mencoba menemukan titik kekaburan minimum dalam set ini. Saya kata lain Anda perlu referensi silang berbagai gambar menggunakan salah satu teknik yang diilustrasikan di atas (pada dasarnya - dengan berbagai tingkat penyempurnaan dalam pendekatan - mencari satu gambar dengan konten frekuensi tinggi tertinggi).
sumber
Kode Matlab dari dua metode yang telah diterbitkan dalam jurnal yang sangat dihormati (Transaksi IEEE pada Pemrosesan Gambar) tersedia di sini: https://ivulab.asu.edu/software
periksa algoritma CPBDM dan JNBM. Jika Anda memeriksa kode itu tidak terlalu sulit untuk porting dan kebetulan itu didasarkan pada metode Marzialiano sebagai fitur dasar.
sumber
saya menerapkannya menggunakan fft di matlab dan memeriksa histogram dari rata-rata menghitung fft dan std tetapi juga fungsi fit dapat dilakukan
sumber
Itulah yang saya lakukan di Opencv untuk mendeteksi kualitas fokus di suatu wilayah:
sumber