Saya akan merekomendasikan mempertimbangkan untuk menjauh dari hanya menggunakan histogram RGB.
Pencernaan yang lebih baik dari gambar Anda dapat diperoleh jika Anda mengambil wavelet 2d Haar dari gambar (ini jauh lebih mudah daripada kedengarannya, hanya banyak rata-rata dan beberapa akar kuadrat digunakan untuk membobot koefisien Anda) dan hanya mempertahankan k terbesar koefisien tertimbang di wavelet sebagai vektor jarang, menormalkannya, dan menyimpannya untuk mengurangi ukurannya. Anda harus mengubah skala RG dan B menggunakan bobot persepsi sebelumnya setidaknya atau saya sarankan beralih ke YIQ (atau YCoCg, untuk menghindari derau kuantisasi) sehingga Anda dapat mengambil sampel informasi chrominance dengan tingkat kepentingan yang berkurang.
Anda sekarang dapat menggunakan perkalian titik dari dua vektor normalisasi renggang ini sebagai ukuran kemiripan. Pasangan gambar dengan hasil perkalian titik terbesar akan memiliki struktur yang sangat mirip. Manfaatnya karena sedikit tahan terhadap pengubahan ukuran, pergeseran rona dan tanda air, serta sangat mudah diterapkan dan dipadatkan.
Anda dapat menukar penyimpanan dan akurasi dengan menambah atau mengurangi k.
Mengurutkan berdasarkan skor numerik tunggal akan menjadi sulit untuk masalah klasifikasi semacam ini. Jika Anda memikirkannya, diperlukan gambar untuk hanya dapat 'berubah' sepanjang satu sumbu, tetapi ternyata tidak. Inilah mengapa Anda membutuhkan vektor fitur. Dalam kasus wavelet Haar, kira-kira di mana diskontinuitas paling tajam dalam gambar terjadi. Anda dapat menghitung jarak antara gambar secara berpasangan, tetapi karena yang Anda miliki hanyalah metrik jarak, pengurutan linier tidak memiliki cara untuk menyatakan 'segitiga' dari 3 gambar yang semuanya sama jauhnya. (misal, pikirkan gambar yang semuanya hijau, gambar yang semuanya merah dan gambar yang semuanya biru.)
Itu berarti bahwa solusi nyata apa pun untuk masalah Anda akan memerlukan operasi O (n ^ 2) dalam jumlah gambar yang Anda miliki. Sedangkan jika dimungkinkan untuk melinierisasi ukuran, Anda dapat memerlukan O (n log n), atau O (n) jika ukuran tersebut cocok untuk, katakanlah, jenis radix. Meskipun demikian, Anda tidak perlu menghabiskan O (n ^ 2) karena dalam praktiknya Anda tidak perlu menyaring seluruh rangkaian, Anda hanya perlu menemukan barang yang lebih dekat dari ambang batas tertentu. Jadi dengan menerapkan salah satu dari beberapa teknik untuk mempartisi ruang vektor renggang Anda, Anda dapat memperoleh asimtotik yang jauh lebih cepat untuk masalah 'menemukan saya k dari gambar yang lebih mirip daripada ambang batas yang diberikan' daripada secara naif membandingkan setiap gambar dengan setiap gambar, memberi Anda apa Anda mungkin perlu ... jika tidak persis seperti yang Anda minta.
Bagaimanapun, saya menggunakan ini beberapa tahun yang lalu untuk efek yang baik secara pribadi ketika mencoba meminimalkan jumlah tekstur berbeda yang saya simpan, tetapi ada juga banyak kebisingan penelitian di ruang ini yang menunjukkan kemanjurannya (dan dalam hal ini membandingkan ke bentuk klasifikasi histogram yang lebih canggih):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Jika Anda membutuhkan akurasi yang lebih baik dalam pendeteksian, algoritma minHash dan tf-idf dapat digunakan dengan Haar wavelet (atau histogram) untuk menangani pengeditan dengan lebih kuat:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Terakhir, Stanford memiliki penelusuran gambar berdasarkan varian yang lebih eksotis dari pendekatan semacam ini, berdasarkan melakukan lebih banyak ekstraksi fitur dari wavelet untuk menemukan bagian gambar yang diputar atau diskalakan, dll, tetapi itu mungkin jauh melampaui jumlah pekerjaan Anda. ingin melakukannya.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi