Recomendaría considerar dejar de usar un histograma RGB.
Se puede obtener un mejor resumen de su imagen si toma una wavelet de Haar 2d de la imagen (es mucho más fácil de lo que parece, es solo una gran cantidad de promedios y algunas raíces cuadradas que se usan para ponderar sus coeficientes) y simplemente retiene el k más grande coeficientes ponderados en la ondícula como un vector disperso, normalícelo y guárdelo para reducir su tamaño. Debería cambiar la escala de RG y B utilizando pesos perceptivos de antemano al menos o recomendaría cambiar a YIQ (o YCoCg, para evitar el ruido de cuantificación) para que pueda muestrear la información de crominancia con una importancia reducida.
Ahora puede usar el producto escalar de dos de estos vectores normalizados dispersos como medida de similitud. Los pares de imágenes con los productos punto más grandes serán muy similares en estructura. Esto tiene la ventaja de ser ligeramente resistente al cambio de tamaño, cambio de tono y marca de agua, y es realmente fácil de implementar y compacto.
Puede compensar el almacenamiento y la precisión aumentando o disminuyendo k.
Ordenar por una sola puntuación numérica será intratable para este tipo de problema de clasificación. Si lo piensa, requeriría que las imágenes solo puedan 'cambiar' a lo largo de un eje, pero no es así. Es por eso que necesita un vector de características. En el caso de las ondas de Haar, es aproximadamente donde ocurren las discontinuidades más nítidas en la imagen. Puede calcular una distancia entre imágenes por pares, pero dado que todo lo que tiene es una métrica de distancia, un orden lineal no tiene forma de expresar un 'triángulo' de 3 imágenes que están todas igualmente distantes. (es decir, piense en una imagen que sea completamente verde, una imagen que sea completamente roja y una imagen que sea completamente azul).
Eso significa que cualquier solución real a su problema necesitará operaciones O (n ^ 2) en la cantidad de imágenes que tiene. Mientras que si hubiera sido posible linealizar la medida, podría requerir solo O (n log n) u O (n) si la medida fuera adecuada para, digamos, una ordenación de base. Dicho esto, no necesitas gastar O (n ^ 2) ya que en la práctica no necesitas examinar todo el conjunto, solo necesitas encontrar las cosas que están más cerca de un umbral. Entonces, al aplicar una de varias técnicas para dividir su espacio vectorial disperso, puede obtener asintóticos mucho más rápidos para el problema de 'encontrarme k de las imágenes que son más similares que un umbral dado' que comparar ingenuamente cada imagen con cada imagen, lo que le da lo que probablemente necesite ... si no es precisamente lo que pidió.
En cualquier caso, utilicé esto hace unos años con buenos resultados personalmente cuando intentaba minimizar la cantidad de texturas diferentes que estaba almacenando, pero también ha habido mucho ruido de investigación en este espacio que muestra su eficacia (y en este caso comparando a una forma más sofisticada de clasificación de histograma):
http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf
Si necesita una mayor precisión en la detección, los algoritmos minHash y tf-idf se pueden usar con la wavelet de Haar (o el histograma) para manejar las ediciones de manera más sólida:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
Finalmente, Stanford tiene una búsqueda de imágenes basada en una variante más exótica de este tipo de enfoque, basada en hacer más extracción de características de las ondas para encontrar secciones de imágenes rotadas o escaladas, etc., pero eso probablemente va más allá de la cantidad de trabajo que usted necesita. quisiera hacer.
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi