Saya memiliki dua gambar berbeda:
dan
Seperti yang Anda lihat, keduanya jelas "sama" dari sudut pandang manusia. Sekarang saya ingin mendeteksi secara program bahwa keduanya sama. Saya telah menggunakan sihir gambar melalui permata ruby yang disebut rmagick
seperti:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Meskipun ini bekerja dengan baik untuk gambar yang memiliki rasio / pemangkasan yang sama, itu tidak ideal ketika mereka memiliki pemangkasan yang sedikit berbeda dan telah diubah ukurannya menjadi lebar yang sama.
Apakah ada cara untuk melakukannya untuk gambar dengan pemotongan yang berbeda? Saya tertarik pada solusi di mana saya bisa mengatakan sesuatu seperti: Satu gambar terkandung di dalam yang lain dan mencakup sekitar 90% dari itu.
PS. Saya bisa mendapatkan gambar dalam resolusi lebih tinggi jika itu membantu (mis. Ganda)
sumber
compare
alat baris perintah ImageMagick memiliki-subimage-search
saklar.Jawaban:
Anda mungkin ingin melihat pencocokan fitur. Idenya adalah menemukan fitur dalam dua gambar dan mencocokkannya. Metode ini biasanya digunakan untuk menemukan templat (misalnya logo) di gambar lain. Fitur, pada dasarnya, dapat digambarkan sebagai hal-hal yang menurut manusia menarik dalam sebuah gambar, seperti sudut atau ruang terbuka. Ada banyak jenis teknik deteksi fitur di luar sana namun rekomendasi saya adalah menggunakan skala-invariant feature transform (SIFT) sebagai algoritma pendeteksian fitur. SIFT tidak berbeda dengan terjemahan gambar, penskalaan, rotasi, sebagian tidak berubah perubahan iluminasi, dan kuat untuk distorsi geometrik lokal. Ini tampaknya sesuai dengan spesifikasi Anda di mana gambar dapat memiliki rasio yang sedikit berbeda.
Dengan dua gambar yang Anda berikan, berikut ini upaya untuk mencocokkan fitur menggunakan pencocokan fitur FLANN . Untuk menentukan apakah kedua gambar itu sama, kita dapat mendasarkannya dari beberapa ambang yang telah ditentukan yang melacak jumlah kecocokan yang lulus uji rasio yang dijelaskan dalam Fitur Gambar Berbeda dari Keypoints Skala-Invarian oleh David G. Lowe . Penjelasan sederhana dari tes ini adalah bahwa tes rasio memeriksa apakah kecocokannya ambigu dan harus dihilangkan, Anda dapat memperlakukannya sebagai teknik penghilangan yang outlier. Kami dapat menghitung jumlah kecocokan yang lulus tes ini untuk menentukan apakah kedua gambar itu sama. Inilah hasil pencocokan fitur:
Titik-titik mewakili semua kecocokan yang terdeteksi sementara garis hijau mewakili "kecocokan yang baik" yang lulus uji rasio. Jika Anda tidak menggunakan uji rasio maka semua poin akan ditarik. Dengan cara ini, Anda dapat menggunakan filter ini sebagai ambang untuk hanya menyimpan fitur yang paling cocok.
Saya menerapkannya dengan Python, saya tidak terlalu akrab dengan Rails. Semoga ini bisa membantu, semoga berhasil!
Kode
sumber
Karena ImageMagick sangat tua, canggih, dan alat yang banyak fitur, akan sulit untuk membangun antarmuka yang mencakup sebagian besar fitur. Sebesar apa pun itu, rmagick tidak (dan tidak juga banyak upaya python telah diambil) mendekati menutup semua fitur.
Saya membayangkan untuk banyak kasus penggunaan, itu akan cukup aman dan jauh lebih mudah untuk hanya menjalankan metode baris perintah dan membacanya. Dalam ruby itu akan terlihat seperti ini;
Saya akan membahas hal-hal penting dan kemudian berbicara tentang catatan tambahan.
Perintah ini menggunakan perbandingan magick untuk memeriksa apakah gambar kedua (
small
) adalah subimage dari yang pertama (large
). Fungsi ini tidak memeriksa bahwa kecil benar-benar lebih kecil dari besar (tinggi dan lebar). Angka yang saya masukkan untuk kemiripan adalah 0,2 (20% kesalahan), dan nilai untuk gambar yang Anda berikan adalah sekitar 0,15. Anda mungkin ingin menyempurnakan ini! Saya menemukan bahwa gambar yang merupakan subset ketat mendapatkan kurang dari 0,01.stderr
danstdout
tidak "perlu" tetapi Anda seharusnya melakukannya.sumber
Dapatkan histogram dari kedua gambar dan bandingkan. Ini akan bekerja dengan sangat baik untuk memotong dan Zoom kecuali ada perubahan yang terlalu drastis karena ini.
Ini lebih baik daripada pendekatan saat ini di mana Anda langsung mengurangi gambar. Namun pendekatan ini masih memiliki sedikit.
sumber
Biasanya pencocokan template memiliki hasil yang baik dalam situasi ini. Pencocokan template adalah teknik untuk menemukan area gambar yang cocok (mirip) dengan gambar template (gambar kedua). Algoritma ini memberikan skor untuk posisi macthed terbaik dalam gambar sumber (yang kedua).
Dalam OpenCV menggunakan metode TM_CCOEFF_NORMED , berikan skor antara 0 dan 1. Jika skornya 1, itu berarti gambar template persis bagian (Rect) dari gambar sumber, tetapi jika Anda memiliki sedikit perubahan dalam penerangan atau perspektif antara gambar dua, skor akan lebih rendah dari 1.
Sekarang Dengan mempertimbangkan ambang batas untuk skor kesamaan, Anda dapat mengetahui apakah mereka sama atau tidak. Ambang itu dapat diperoleh dengan beberapa percobaan dan kesalahan pada beberapa sampel gambar. Saya mencoba gambar Anda dan mendapat skor 0,823863 . Berikut adalah kode (opencv C ++) dan area umum antara dua gambar, diperoleh dengan pencocokan:
sumber
Pertimbangkan metode find_similar_region . Gunakan yang lebih kecil dari dua gambar sebagai gambar target. Coba berbagai nilai untuk atribut fuzz pada gambar dan gambar target.
sumber