Saya perlu cara sederhana dan cepat untuk membandingkan dua gambar untuk kesamaan. Yaitu saya ingin mendapatkan nilai tinggi jika mengandung hal yang persis sama tetapi mungkin memiliki latar belakang yang sedikit berbeda dan dapat dipindahkan / diubah ukurannya dengan beberapa piksel.
(Lebih konkret, jika itu penting: Satu gambar adalah ikon dan gambar lainnya adalah subarea dari tangkapan layar dan saya ingin tahu apakah subarea itu persis ikon atau tidak.)
Saya memiliki OpenCV di tangan tetapi saya masih belum terbiasa dengannya.
Satu kemungkinan yang saya pikirkan sejauh ini: Membagi kedua gambar menjadi 10x10 sel dan untuk masing-masing 100 sel, bandingkan histogram warna. Kemudian saya dapat mengatur beberapa nilai ambang yang dibuat dan jika nilai yang saya dapatkan di atas ambang itu, saya berasumsi bahwa mereka serupa.
Saya belum mencobanya seberapa bagus itu bekerja tetapi saya kira itu akan cukup baik. Gambar sudah cukup mirip (dalam kasus penggunaan saya), jadi saya bisa menggunakan nilai ambang batas yang cukup tinggi.
Saya kira ada puluhan solusi lain yang mungkin untuk ini yang akan bekerja lebih atau kurang (karena tugas itu sendiri cukup sederhana karena saya hanya ingin mendeteksi kesamaan jika mereka benar-benar sangat mirip). Apa yang kamu sarankan?
Ada beberapa pertanyaan yang sangat terkait / mirip tentang mendapatkan tanda tangan / sidik jari / hash dari sebuah gambar:
- OpenCV / SURF Bagaimana menghasilkan hash / sidik jari / tanda tangan gambar dari deskriptor?
- Sidik jari gambar untuk membandingkan kesamaan banyak gambar
- Deteksi Gambar Dekat-Gandakan
- OpenCV: Gambar Sidik Jari dan Bandingkan dengan Basis Data .
- lebih , lebih , lebih , lebih , lebih , lebih , lebih , lebih
Saya juga menemukan implementasi yang memiliki fungsi seperti ini untuk mendapatkan sidik jari:
- pHash
- imgSeek ( GitHub repo ) (GPL) berdasarkan kertas Fast Multiresolution Image Querying
- pencocokan gambar . Sangat mirip dengan apa yang saya cari. Mirip dengan pHash, berdasarkan tanda tangan gambar untuk semua jenis gambar, Goldberg et al . Menggunakan Python dan Elasticsearch.
- iqdb
- ImageHash . mendukung pHash.
- Deduplicator Gambar (gambar) . Mendukung CNN, PHash, DHash, WHash, AHash.
Beberapa diskusi tentang hash gambar persepsi: di sini
Agak offtopic: Ada banyak metode untuk membuat sidik jari audio. MusicBrainz , layanan web yang menyediakan pencarian berdasarkan sidik jari untuk lagu-lagu, memiliki ikhtisar yang baik dalam wiki mereka . Mereka menggunakan AcoustID sekarang. Ini untuk menemukan kecocokan yang tepat (atau sebagian besar tepat). Untuk menemukan kecocokan serupa (atau jika Anda hanya memiliki cuplikan atau derau tinggi), lihat Echoprint . Pertanyaan SO terkait ada di sini . Jadi sepertinya ini diselesaikan untuk audio. Semua solusi ini bekerja dengan sangat baik.
Pertanyaan yang agak lebih umum tentang pencarian fuzzy secara umum ada di sini . Misalnya ada hashing sensitif-lokalitas dan pencarian tetangga terdekat .
Jawaban:
Dapatkah tangkapan layar atau ikon diubah (diskalakan, diputar, miring ...)? Ada beberapa metode di atas kepala saya yang mungkin dapat membantu Anda:
Sebagian besar sudah diterapkan di OpenCV - lihat misalnya metode cvMatchTemplate (menggunakan pencocokan histogram): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html . Detektor titik / area yang menonjol juga tersedia - lihat Deteksi Fitur OpenCV .
sumber
Saya menghadapi masalah yang sama baru-baru ini, untuk menyelesaikan masalah ini (algoritma sederhana dan cepat untuk membandingkan dua gambar) sekali dan untuk semua, saya berkontribusi modul img_hash ke opencv_contrib, Anda dapat menemukan detail dari tautan ini .
Modul img_hash menyediakan enam algoritma hash gambar, cukup mudah digunakan.
Contoh kode
asal lena
mengaburkan lena
mengubah ukuran lena
bergeser lena
Dalam hal ini, ColorMomentHash memberi kami hasil terbaik
Pro dan kontra dari masing-masing algoritma
Kinerja img_hash juga bagus
Perbandingan kecepatan dengan pustaka PHash (100 gambar dari ukbench)
Jika Anda ingin mengetahui ambang rekomendasi untuk algoritma ini, silakan periksa posting ini ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html ). Jika Anda tertarik tentang bagaimana cara mengukur kinerja modul img_hash (termasuk kecepatan dan serangan yang berbeda), silakan periksa tautan ini ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html ).
sumber
Apakah tangkapan layar hanya berisi ikon? Jika demikian, jarak L2 dari kedua gambar mungkin cukup. Jika jarak L2 tidak berhasil, langkah selanjutnya adalah mencoba sesuatu yang sederhana dan mapan, seperti: Lucas-Kanade . Yang saya yakin tersedia di OpenCV.
sumber
Jika Anda ingin mendapatkan indeks tentang kesamaan kedua gambar, saya sarankan Anda dari metrik indeks SSIM. Ini lebih konsisten dengan mata manusia. Inilah artikel tentang itu: Indeks Kesamaan Struktural
Ini diimplementasikan dalam OpenCV juga, dan dapat dipercepat dengan GPU: OpenCV SSIM dengan GPU
sumber
Jika Anda yakin memiliki keselarasan yang tepat dari template Anda (ikon) dengan wilayah pengujian, maka semua perbedaan piksel yang lama akan berfungsi.
Jika penyejajaran hanya akan sedikit mati, maka Anda dapat mengirimkan dua gambar dengan cv :: GaussianBlur sebelum menemukan jumlah perbedaan piksel.
Jika kualitas pelurusan berpotensi buruk maka saya akan merekomendasikan Histogram of Oriented Gradients atau salah satu algoritma keypoint detection / descriptor OpenCV yang nyaman (seperti SIFT atau SURF ).
sumber
Jika untuk pencocokan gambar identik - kode untuk jarak L2
Cepat. Tetapi tidak kuat untuk perubahan pencahayaan / sudut pandang dll. Sumber
sumber
Jika Anda ingin membandingkan gambar untuk kesamaan, saya sarankan Anda menggunakan OpenCV. Di OpenCV, ada beberapa pencocokan fitur dan pencocokan templat. Untuk pencocokan fitur, ada SURF, SIFT, FAST dan detektor lainnya. Anda dapat menggunakan ini untuk mendeteksi, menjelaskan, dan kemudian mencocokkan gambar. Setelah itu, Anda dapat menggunakan indeks spesifik untuk menemukan jumlah kecocokan antara dua gambar.
sumber