Necesito un algoritmo de hashing de imagen (preferiblemente simple y rápido). El valor hash se usa en una tabla de búsqueda, no para criptografía.algoritmo de hashing de imagen rápido y simple
Algunas de las imágenes son "gráficos de computadora", es decir, rectas llenas de color, textos rasterizados, etc., mientras que también hay imágenes "fotográficas" que contienen un amplio espectro de colores, generalmente suaves, con una amplitud de ruido razonable.
También me gustaría que el algoritmo hash pueda aplicarse a partes de imágenes específicas. Quiero decir, la imagen se puede dividir en celdas de cuadrícula, y la función de hash de cada celda debe depender solo del contenido de esta celda. Para que uno pueda detectar rápidamente si dos imágenes tienen áreas comunes (en caso de que estén alineadas apropiadamente).
Nota: Sólo necesito saber si dos imágenes (o sus partes) son idénticos . Es decir, no es necesario que coincida con imágenes similares, no hay necesidad de reconocimiento de características, correlación y otras técnicas DSP.
Me pregunto cuál es el algoritmo hash preferido.
Para imágenes "fotográficas" simplemente XOR-ing todos los píxeles dentro de una celda de cuadrícula está bien más o menos. La probabilidad del mismo valor hash para diferentes imágenes es bastante baja, especialmente porque la presencia del ruido (casi blanco) rompe todas las simetrías potenciales. Además, el espectro de dicha función hash se ve bien (cualquier valor es posible con casi la misma probabilidad).
Pero tal ingenuo algoritmo no se puede usar con gráficos "artificiales". Los píxeles idénticos, los patrones que se repiten, la invarianza de desplazamiento geométrico son muy comunes para tales imágenes. XOR-ing todos los píxeles darán 0 para cualquier imagen con un número par de píxeles idénticos.
Usar algo como CRT-32 parece algo prometedor, pero me gustaría descubrir algo más rápido. Pensé en la fórmula iterativa, cada nuevo píxel muta el valor hash actual, así:
hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */
Haciendo número primo módulo probablemente debería dar una buena dispersión, de modo que me estoy inclinando hacia esta opción. Pero me gustaría saber si hay mejores variantes.
Gracias de antemano.
¿por qué no utiliza algún algoritmo hash simple como md5? –
@Karoly Horvath: Buena pregunta. De hecho, esto es lo que necesito más o menos. Sin embargo, MD5 es (presumiblemente) hambriento de CPU, está diseñado para ser una función hash unidireccional. OTOH Necesito algo mucho más simple, ya que no tengo consideraciones de seguridad. Pensé en CRC-32. Pero me gustaría descubrir algo aún más simple – valdo
Si haces esto en muchas imágenes, el cuello de botella va a ser la velocidad de tu disco ... –