Di bawah ini adalah tiga pendekatan untuk menyelesaikan masalah ini (dan ada banyak lainnya).
Yang pertama adalah pendekatan standar dalam visi komputer, pencocokan titik kunci. Ini mungkin memerlukan beberapa latar belakang pengetahuan untuk diimplementasikan, dan bisa lambat.
Metode kedua hanya menggunakan pemrosesan gambar dasar, dan berpotensi lebih cepat daripada pendekatan pertama, dan mudah untuk diterapkan. Namun, apa yang diperolehnya dalam pemahaman, tidak memiliki ketahanan - pencocokan gagal pada gambar yang diskalakan, diputar, atau berubah warna.
Metode ketiga cepat dan kuat, tetapi berpotensi yang paling sulit untuk diterapkan.
Pencocokan Keypoint
Lebih baik daripada memilih 100 poin acak adalah memilih 100 poin penting . Bagian-bagian tertentu dari suatu gambar memiliki lebih banyak informasi daripada yang lain (terutama di bagian tepi dan sudut), dan ini adalah yang Anda ingin gunakan untuk pencocokan gambar yang cerdas. Google " ekstraksi keypoint " dan " pencocokan keypoint " dan Anda akan menemukan beberapa makalah akademis tentang subjek ini. Saat ini, titik kunci SIFT bisa dibilang yang paling populer, karena mereka dapat mencocokkan gambar di bawah skala, rotasi, dan pencahayaan yang berbeda. Beberapa implementasi SIFT dapat ditemukan di sini .
Satu kelemahan untuk pencocokan titik kunci adalah waktu berjalan dari implementasi naif: O (n ^ 2m), di mana n adalah jumlah titik kunci dalam setiap gambar, dan m adalah jumlah gambar dalam database. Beberapa algoritma pintar mungkin menemukan kecocokan terdekat lebih cepat, seperti quadtrees atau partisi ruang biner.
Solusi alternatif: Metode histogram
Solusi lain yang kurang kuat tetapi berpotensi lebih cepat adalah membangun histogram fitur untuk setiap gambar, dan memilih gambar dengan histogram yang paling dekat dengan histogram gambar input. Saya menerapkan ini sebagai undergrad, dan kami menggunakan 3 histogram warna (merah, hijau, dan biru), dan dua histogram tekstur, arah dan skala. Saya akan memberikan detail di bawah ini, tetapi saya harus perhatikan bahwa ini hanya bekerja dengan baik untuk mencocokkan gambar yang SANGAT mirip dengan gambar basis data. Gambar skala ulang, diputar, atau berubah warna bisa gagal dengan metode ini, tetapi perubahan kecil seperti memotong tidak akan merusak algoritme
Menghitung histogram warna sangatlah mudah - cukup pilih rentang untuk kotak histogram Anda, dan untuk setiap rentang, hitung jumlah piksel dengan warna dalam rentang itu. Sebagai contoh, perhatikan histogram "hijau", dan anggaplah kita memilih 4 ember untuk histogram kami: 0-63, 64-127, 128-191, dan 192-255. Kemudian untuk setiap piksel, kita melihat nilai hijau, dan menambahkan penghitungan ke ember yang sesuai. Setelah selesai menghitung, kami membagi setiap ember dengan jumlah piksel di seluruh gambar untuk mendapatkan histogram yang dinormalisasi untuk saluran hijau.
Untuk histogram arah tekstur, kami mulai dengan melakukan deteksi tepi pada gambar. Setiap titik tepi memiliki vektor normal yang menunjuk ke arah tegak lurus terhadap tepi. Kami menghitung sudut vektor normal menjadi salah satu dari 6 ember antara 0 dan PI (karena tepi memiliki simetri 180 derajat, kami mengonversi sudut antara -PI dan 0 menjadi antara 0 dan PI). Setelah menghitung jumlah titik tepi di setiap arah, kami memiliki histogram yang tidak dinormalisasi yang mewakili arah tekstur, yang kami normalkan dengan membagi setiap ember dengan jumlah total titik tepi pada gambar.
Untuk menghitung histogram skala tekstur, untuk setiap titik tepi, kami mengukur jarak ke titik tepi terdekat berikutnya dengan arah yang sama. Misalnya, jika titik tepi A memiliki arah 45 derajat, algoritma berjalan ke arah itu sampai menemukan titik tepi lain dengan arah 45 derajat (atau dalam deviasi yang masuk akal). Setelah menghitung jarak ini untuk setiap titik tepi, kami membuang nilai-nilai tersebut ke dalam histogram dan menormalkannya dengan membaginya dengan jumlah total titik tepi.
Sekarang Anda memiliki 5 histogram untuk setiap gambar. Untuk membandingkan dua gambar, Anda mengambil nilai absolut dari perbedaan antara setiap kotak histogram, dan kemudian menjumlahkan nilai-nilai ini. Misalnya, untuk membandingkan gambar A dan B, kami akan menghitung
|A.green_histogram.bucket_1 - B.green_histogram.bucket_1|
untuk setiap ember dalam histogram hijau, dan ulangi untuk histogram lainnya, lalu jumlahkan semua hasilnya. Semakin kecil hasilnya, semakin baik pertandingan. Ulangi untuk semua gambar dalam basis data, dan kecocokan dengan hasil terkecil menang. Anda mungkin ingin memiliki ambang, di atas mana algoritma menyimpulkan bahwa tidak ada kecocokan yang ditemukan.
Pilihan Ketiga - Titik Puncak + Pohon Keputusan
Pendekatan ketiga yang mungkin jauh lebih cepat daripada dua lainnya adalah menggunakan hutan semantik texton (PDF). Ini melibatkan penggalian titik kunci sederhana dan menggunakan pohon keputusan koleksi untuk mengklasifikasikan gambar. Ini lebih cepat daripada pencocokan keypoint SIFT sederhana, karena menghindari proses pencocokan yang mahal, dan keypoint jauh lebih sederhana daripada SIFT, jadi ekstraksi keypoint jauh lebih cepat. Namun, ini mempertahankan invariansi metode SIFT untuk rotasi, skala, dan pencahayaan, fitur penting yang tidak dimiliki metode histogram.
Perbarui :
Kesalahan saya - makalah Semantic Texton Forests tidak secara khusus tentang pencocokan gambar, melainkan pelabelan wilayah. Makalah asli yang cocok adalah yang ini: Pengenalan Titik Puncak menggunakan Pohon Acak . Juga, makalah di bawah ini terus mengembangkan ide-ide dan mewakili keadaan seni (c. 2010):