2011-06-10 15 views
12

Me doy cuenta de que esta es una pregunta altamente especializada ... pero aquí va. Estoy usando una implementación de SIFT para buscar coincidencias en dos imágenes. Con la implementación actual que tengo, cuando hago coincidir una imagen con una versión de 90 o 180 grados, obtengo coincidencias que están apagadas alrededor de medio píxel de forma consistente, pero varía dentro de un rango. Entonces, por ejemplo, si se encuentra una coincidencia en la coordenada de píxel (x, y) en im1, entonces la coincidencia correspondiente en su imagen girada a 90 grados im2 está en (x, y + 0.5). Si utilizo una imagen de 180 grados, el desplazamiento aparece en las coordenadas xey, y solo en la x si utilizo una imagen girada de 270 grados (-90).David Lowe's SIFT - Pregunta sobre el espacio de la escala y las coordenadas de la imagen (problema de desplazamiento extraño)

1) En primer lugar, supongo que SIFT debería darme la misma ubicación coincidente en una imagen girada. Una suposición implícita es que la rotación no cambia los valores de píxel de la imagen que confirmé que es verdadera. (Uso IRFAN View para rotar y guardar como .pgm y los valores de píxel permanecen sin cambios).

2) Tengo otras implementaciones que no proporcionan esta compensación.

3) Supongo que este desplazamiento está relacionado con la programación y posiblemente tiene que ver con la conversión de las coordenadas del punto clave del espacio de escala a la coordenada del punto clave del espacio de la imagen.

Espero que alguien se haya encontrado con este problema o me pueda indicar una referencia sobre cómo convertir de scale-space a image-space.

+1

Interesante, ¿tiene algún código para compartir? –

+1

Creo que se olvidó de la parte "pregunta" de su pregunta ... – ildjarn

+0

¿Es esta una imagen de cámara o una imagen médica? ¿Necesita tener en cuenta el espacio entre píxeles? – nav

Respuesta

4

Contrariamente a las afirmaciones de Mikola, es posible obtener escala y orientación de SIFT. SIFT intenta encontrar la escala con el máximo DOG extrema (s) y también encuentra una orientación dominante (r). Cada vector de ubicación para una característica SIFT devuelve (x, y, s, r)

Para ver cómo el espacio escala se convierte en pixeles, intente VLFeat de implementation. En particular, use el descriptor vl_plotsift para trazar los descriptores. Puede ver cómo s escalas relativas a píxeles para esta implementación. Para descubrir otras implementaciones, encuentre la misma característica con ambas implementaciones y vea cómo el factor de escala s es diferente.

2

En primer lugar una observación general:

SIFT simplemente le da las características con X, Y ubicaciones en las coordenadas del pixel. No le dice nada directamente sobre la escala o rotación de una característica dada por diseño, y de hecho es la característica definitoria de SIFT que el vector de característica es invariante bajo estos tipos de transformaciones (es por eso que SIFT funciona). ~~ (EDIT: esto está mal, WTF estaba pensando cuando escribí esto?)

un desplazamiento de 0,5 píxeles es insignificante, y podría haber un gran un número de posibles explicaciones para esta diferencia. Una posibilidad es que las dos implementaciones utilicen coordenadas de origen diferentes; por ejemplo, uno pone el origen en el medio, mientras que el otro lo pone en una esquina. Esto puede afectar el redondeo, lo que podría representar una diferencia de 0.5 en las ubicaciones de píxeles informadas. Otra posibilidad es que difieran en el número de muestras de rotación utilizadas; o tal vez en el número de escalas que se consideran. Cambiar cualquiera de estos parámetros podría afectar la característica observada hasta en unos pocos píxeles. Por supuesto, todo esto es pura especulación, ya que uno debería ver la implementación para decir algo definitivo.

Ahora para tratar sus preocupaciones más específicas:

  1. Esta es una mala suposición. Las imágenes muestreadas de forma rectilínea no son en general invariantes bajo rotaciones. Incluso rotar en múltiplos de 90 grados puede causar problemas si su implementación SIFT muestrea un número de rotaciones que no es un múltiplo de 4. Sin embargo, con suficientes muestras puede esperar que obtenga cerca de el resultado correcto, pero casi nunca sé exacto (excepto en algunas situaciones degeneradas muy especiales).

  2. ¿Cómo sabes que están dando la compensación correcta? Todos pueden ser clones o puertos de la misma base de código y pueden tener errores similares.

  3. No sé por qué esperas que sea el mismo, ya que SIFT depende de una serie de factores internos que pueden variar entre las implementaciones.

Finalmente, no estoy seguro de lo que quiere decir con "convertir de scale-space a image-space". El espacio de escala se define para las imágenes, no para los puntos, y no existe una correspondencia 1: 1 entre las coordenadas en el espacio de la escala y el espacio de la imagen. Si solo desea traducir una imagen de espacio de escala en una imagen normal, simplemente tome la división de escala de 0. Si desea convertir una imagen en una representación de espacio de escala, conviértala con un grupo de gaussianos de diferentes radios.

Cuestiones relacionadas