Tecnología de huellas digitales de imágenes - Detección de imágenes similares con pHash y dHash
Qué es la huella digital de imagen - Fundamentos del hash perceptual
La huella digital de imagen (hash perceptual) es una tecnología que convierte imágenes en valores hash compactos de longitud fija. A diferencia de los hashes criptográficos (MD5, SHA), el hash perceptual produce valores similares para imágenes visualmente parecidas, incluso si han sido redimensionadas, comprimidas o ligeramente modificadas.
Diferencia con los hashes criptográficos:
- Hash criptográfico: un cambio de 1 bit produce un hash completamente diferente. Se usa para verificar la integridad de archivos
- Hash perceptual: imágenes visualmente similares producen hashes cercanos. Se usa para detección de similitud
Casos de uso:
- Detección de imágenes duplicadas: encontrar imágenes duplicadas o casi duplicadas en grandes colecciones
- Protección de derechos de autor: detectar uso no autorizado de imágenes (incluso recortadas, redimensionadas o con filtros)
- Moderación de contenido: detectar variantes de imágenes prohibidas conocidas
- Búsqueda inversa de imágenes: encontrar el origen según el contenido de la imagen
- Deduplicación de caché: evitar almacenar múltiples copias de imágenes visualmente idénticas
aHash (Average Hash) - El hash de imagen más simple
aHash es el algoritmo de hash perceptual más simple, que genera valores hash comparando cada píxel con el brillo promedio.
Pasos del algoritmo:
- Reducir la imagen a 8x8 (64 píxeles), eliminando diferencias de tamaño
- Convertir a escala de grises
- Calcular el valor promedio de brillo de los 64 píxeles
- Comparar cada píxel con el promedio: mayor que el promedio es 1, de lo contrario 0
- Generar un hash de 64 bits
Ventajas:
- Implementación extremadamente simple, velocidad de cálculo máxima
- Cierta robustez ante redimensionamiento y cambios leves de brillo
Desventajas:
- Sensible a corrección gamma y ajustes de histograma
- Baja capacidad de discriminación, propenso a falsos positivos
- No puede manejar modificaciones locales (como marcas de agua)
Casos de uso: prefiltrado rápido, como primer paso de filtrado para métodos más precisos. Deduplicación simple donde la precisión no es crítica.
dHash (Difference Hash) - Hash rápido basado en gradientes
dHash genera hashes comparando las diferencias de brillo (gradientes) entre píxeles adyacentes, capturando mejor la información estructural de la imagen que aHash.
Pasos del algoritmo:
- Reducir la imagen a 9x8 (72 píxeles, una columna extra de ancho para calcular diferencias)
- Convertir a escala de grises
- Para cada fila, comparar píxeles adyacentes: si el píxel derecho es más brillante que el izquierdo es 1, de lo contrario 0
- 8 filas x 8 columnas de diferencias = hash de 64 bits
Por qué es mejor que aHash:
- Captura cambios relativos de brillo (gradientes) en lugar de brillo absoluto, más robusto ante ajustes globales de brillo/contraste
- Preserva la información estructural de la imagen (dirección de bordes)
- Velocidad de cálculo comparable a aHash
Implementación (Python):
from PIL import Imageimg = Image.open(path).resize((9, 8)).convert("L")- Comparar píxeles adyacentes para generar la cadena de bits
Casos de uso: escenarios que requieren rapidez y mayor precisión que aHash. Método preferido para deduplicación de imágenes a gran escala.
pHash (Perceptual Hash) - Hash de alta precisión basado en DCT
pHash utiliza la Transformada Discreta del Coseno (DCT) para extraer características de frecuencia de la imagen, ofreciendo la mayor precisión pero también el mayor costo computacional.
Pasos del algoritmo:
- Reducir la imagen a 32x32, convertir a escala de grises
- Aplicar la transformada DCT a la imagen de 32x32
- Tomar los coeficientes de baja frecuencia 8x8 de la esquina superior izquierda (representan la estructura general de la imagen, ignorando detalles de alta frecuencia)
- Calcular la mediana de los 64 coeficientes
- Comparar cada coeficiente con la mediana: mayor que la mediana es 1, de lo contrario 0
- Generar un hash de 64 bits
Por qué tiene la mayor precisión:
- La DCT transforma la imagen del dominio espacial al dominio de frecuencia; los coeficientes de baja frecuencia representan la estructura esencial de la imagen
- Naturalmente insensible al ruido de alta frecuencia (artefactos de compresión, desenfoque leve)
- Usar la mediana en lugar del promedio lo hace más robusto ante valores atípicos
Comparación con dHash:
- pHash tiene mejor robustez ante compresión JPEG, rotación leve y ajustes de color
- dHash es más rápido (no requiere DCT), adecuado para prefiltrado a gran escala
- En la práctica se combinan: filtrado rápido con dHash + verificación precisa con pHash
Puntuación de similitud por distancia de Hamming y diseño de umbrales
La distancia de Hamming (número de bits diferentes) entre dos valores hash mide el grado de similitud entre imágenes. La elección del umbral afecta directamente la precisión y la exhaustividad de la detección.
Cálculo de la distancia de Hamming:
- Realizar operación XOR entre dos hashes de 64 bits y contar la cantidad de 1 en el resultado
- Distancia 0: hashes idénticos (muy probablemente la misma imagen)
- Distancia 1-10: muy similares (posiblemente diferentes versiones de la misma imagen)
- Distancia > 20: muy probablemente imágenes diferentes
Diseño de umbrales:
- Coincidencia estricta (distancia ≤ 5): detecta solo imágenes casi idénticas. Alta precisión, baja exhaustividad
- Coincidencia flexible (distancia ≤ 10): detecta imágenes similares modificadas. Equilibrio entre precisión y exhaustividad
- Coincidencia difusa (distancia ≤ 15): detecta imágenes visualmente relacionadas. Alta exhaustividad, posibles falsos positivos
Estrategia de combinación de múltiples hashes:
- Calcular dHash y pHash simultáneamente; solo considerar similar si ambos cumplen el umbral
- O usar combinación ponderada: puntuación total = 0.4 * distancia dHash + 0.6 * distancia pHash
- Ajustar pesos y umbrales según el escenario de aplicación
Patrones de implementación y arquitectura de sistemas reales
Desplegar un sistema de huellas digitales de imágenes en producción requiere considerar el almacenamiento, la indexación y la eficiencia de consultas.
Almacenamiento e indexación:
- Almacenamiento en base de datos: almacenar el hash de 64 bits como tipo BIGINT, compatible con consultas de operaciones de bits
- Índice por segmentos: dividir el hash en múltiples subsegmentos (por ejemplo, 4 segmentos de 16 bits), crear un índice invertido para cada segmento. Al consultar, buscar en cada segmento por separado y tomar la intersección
- VP-Tree: Vantage-Point Tree, estructura de índice espacial diseñada específicamente para distancia de Hamming. Soporta consultas de rango eficientes
Arquitectura de sistemas a gran escala:
- Flujo de ingesta: carga de imagen → cálculo de múltiples hashes (dHash + pHash) → almacenamiento en base de datos → construcción de índice
- Flujo de consulta: imagen de consulta → cálculo de hash → búsqueda de candidatos en índice → cálculo preciso de distancia de Hamming → retorno de imágenes similares
- Actualización incremental: al ingresar nuevas imágenes, comparar con la base existente para detectar duplicados
Referencia de rendimiento:
- Colección de millones de imágenes: consulta de índice dHash < 10ms
- Colección de decenas de millones: requiere índice distribuido (como plugin de vectores de bits de Elasticsearch)
- Cálculo de hash: imagen individual < 5ms (dHash), < 20ms (pHash)