php - qué - ¿Buena forma de identificar imágenes similares?
que significa atributo alt (3)
He desarrollado un algoritmo simple y rápido en PHP para comparar imágenes por similitud.
Es rápido (~ 40 por segundo para imágenes de 800x600) a hash y un algoritmo de búsqueda no optimizado puede ir a través de 3.000 imágenes en 22 minutos comparando cada una de ellas (3 / seg).
La descripción básica es que obtiene una imagen, la vuelve a escalar a 8x8 y luego convierte esos píxeles para HSV. El tono, la saturación y el valor se truncan a 4 bits y se convierte en una gran cadena hex.
Básicamente, comparar imágenes camina a lo largo de dos cadenas y luego agrega las diferencias que encuentra. Si el número total es inferior a 64, entonces es la misma imagen. Las diferentes imágenes son generalmente alrededor de 600 - 800. Por debajo de 20 y extremadamente similares.
¿Hay alguna mejora en este modelo que pueda usar? No he visto cuán relevantes son los diferentes componentes (tono, saturación y valor) para la comparación. Hue es probablemente bastante importante pero los otros?
Para acelerar las búsquedas, probablemente podría dividir los 4 bits de cada parte por la mitad, y poner los bits más significativos primero, por lo que si fallan la verificación, entonces no es necesario verificar el lsb. No conozco una forma eficiente de almacenar bits como esa, pero aún así, se pueden buscar y comparar fácilmente.
He estado usando un conjunto de datos de 3,000 fotos (en su mayoría únicas) y no ha habido falsos positivos. Es completamente inmune al cambio de tamaño y bastante resistente a los cambios de brillo y contraste.
Encontrarás grandes cantidades de literatura sobre el tema. Simplemente vaya a Google Scholar o IEEE Xplore para buscar artículos. Tuve algún contacto con el campo cuando hice un proyecto sobre reconocimiento de formas (en gran medida insensible al ruido, rotaciones y tamaños) en la universidad: aquí está el artículo .
Lo que quieres usar es:
- Extracción de características
- Hash
- Floración localmente consciente hash.
La mayoría de la gente usa las funciones de SIFT , aunque he tenido mejores experiencias con las que no son invariantes en escala. Básicamente, utiliza un detector de bordes para encontrar puntos interesantes y luego centra los parches de imagen alrededor de esos puntos. De esa manera también puedes detectar sub-imágenes.
Lo que implementaste es un método hash. Hay un montón de intentos, pero el tuyo debería funcionar bien :)
El paso crucial para hacerlo rápido es hacer hash de tus hashes. Convierte sus valores en representación unaria y luego toma un subconjunto aleatorio de los bits como el nuevo hash. Haga eso con 20-50 muestras aleatorias y obtendrá 20-50 tablas hash. Si alguna característica coincide con 2 o más de esas 50 tablas hash, la característica será muy similar a la que ya tiene almacenada. Esto te permite convertir los abdominales (xy)
Espero que te ayude, si quieres probar mi búsqueda de similitud de imagen desarrollada por mí mismo, envíame un correo a spratpix en spratpix