2012-07-23 17 views
9

Supongamos que tiene dos imágenes. En uno, tiene un ícono pequeño (como menos de 300 X 300 píxeles). El segundo es muy grande, y dentro de ti tienes una (o varias) instancias más pequeñas del ícono (por supuesto a diferentes escalas, rotación).Detección de funciones: elemento pequeño en una imagen grande

La tarea a mano es encontrar las instancias del icono en la imagen grande. ¿Cómo se acercan ustedes a esto?

He intentado utilizar una detección de objeto basada en características, utilizando la biblioteca OpenCV, sin embargo, para imágenes grandes llenas (que contienen muchos puntos de característica), la coincidencia no es concluyente. He probado los extractores de funciones SURF/OBJ con los algoritmos de correspondencia BRUTE/FLAN.

Desde mi experiencia, parece que el emparejamiento no toma nota de las relaciones geométricas entre los puntos característicos de las dos imágenes. Como ayuda para la visualización, adjunté una instancia de los puntos característicos de dos imágenes de ejemplo. enter image description here

Y aquí hay una instancia más difícil de la tarea. He resaltado el icono en la imagen grande. enter image description here

+1

Parece que tiene un color bastante distinto allí. Podría intentar un proceso de dos etapas en el que busque por primera vez detección de blobs para ese color y luego encuentre su pose con la detección de características restringida a esa región para deshacerse de los falsos positivos. Por supuesto, fallaría por completo si demasiadas otras partes de la imagen fueran de color rojo brillante ... – Hammer

Respuesta

4

Basado en experiencia limitada, tengo tres recomendaciones para cualquier persona que se encuentre con este tipo de problema.

1) Experimento con FindObject by Mathieu Labbé

Esta es una muy buena herramienta que me ha ayudado a experimentar rápidamente para encontrar buenas combinaciones de ajustes para la función de detección/descripción. Simplemente cargue su icono como un objeto y cargue su muestra de imágenes grandes como escenas. Luego ajuste hasta obtener resultados confiables para su aplicación. Como beneficio adicional, recientemente agregó los métodos de detección/descripción de características graficadas no patentadas por BRISK y FREAK.

2) Obtener una resolución realista

La resolución es tan diferente para el objeto de icono y los iconos reales en las grandes escenas que se están buscando. En mi entender, la invariancia de escala de estos métodos es bastante limitada. Vea el excelente comparisons done by Ievgen Khvedchenia. Puede obtener mejores resultados cambiando el tamaño de la imagen al centro del rango en el que espera que esté.

3) Hacer la imagen del icono de la muestra más realista (por ejemplo, borrosa)

Relacionado con # 2, he encontrado que tener una imagen de muestra muy agudo cuando se busca en una escena más realista no lo hace trabajar bien. Aplico un gaussiano a mis muestras nítidas para que sean más similares a lo que espero encontrar. Hay un ejemplo a continuación. La extraña fórmula solo asegura que las dimensiones del kernel son números impares según sea necesario.

def proportional_gaussian(image): 
    kernel_proportion = 0.005 
    kernel_w = int(2.0 * round((image.shape[1]*kernel_proportion +1)/2.0)-1) 
    kernel_h = int(2.0 * round((image.shape[0]kernel_proportion +1)/2.0)-1) 
    return cv2.GaussianBlur(image, (kernel_w, kernel_h), 0) 

Espero que ayude a alguien.

2

Su enfoque característica coincidente está muy bien. Si se puede usar color, use un preprocesamiento para encontrar la región de interés, como histogram backprojection, seguido de la extracción de blobs y algunos análisis de formas.

Debe hacer coincidir todas las funciones de la imagen grande con la imagen pequeña. Esto da como resultado muchas coincidencias con pocos inliers.

Como su icono es plano, puede usar una homografía como contracción geométrica para sus coincidencias. Sin escribir una sola línea de código, puede probar el ejemplo de OpenCV "descriptor_extractor_matcher" que se puede encontrar en el directorio de ejemplos de las fuentes de OpenCV.

./descriptor_extractor_matcher SURF SURF BruteForce NoneFilter icon.jpg image.jpg 3 

Consulte la salida de ayuda de descriptor_extractor_matcher para obtener más información.

Puede intentar cambiar el orden de las imágenes, no recuerdo cuál es la imagen de entrenamiento y cuál es la imagen de la consulta.

El papel en este tipo de detección de objetos es "Características de las imágenes distintivas de Keypoints invariante en escala" por David Lowe. En la sección 7.3 de este documento, él describe su enfoque de tratar con una relación inlier/outlier muy baja que parece ser su caso.

¡Buena suerte!

Cuestiones relacionadas