2011-05-26 12 views
11

General: Espero que el caso de uso que voy a describir es un caso simple de un problema de flujo óptico y como no tengo mucho conocimiento sobre el tema, Me preguntaba si alguien tiene alguna sugerencia sobre cómo puedo abordar la solución de mi problema.caso simple de flujo óptico

Investigación ya he hecho: he comenzó a leer el periódico High Accuracy Optical Flow Estimation Based on a Theory for Warping y estoy pensando en mirar por encima del papel Particle Video. He encontrado una implementación MATLAB High Accuracy Optical Flow de flujo óptico. Sin embargo, los documentos (y el código) parecen describir conceptos que son muy complicados y que pueden requerir mucho tiempo para que pueda profundizar y comprender. Espero que la solución a mi problema sea más simple.

Problema: Tengo una secuencia de imágenes. Las imágenes muestran un proceso de rotura de material, donde el material y el fondo son negros y las grietas son blancas. Estoy interesado en atravesar la secuencia de imágenes en reversa en un intento de mapear todas las grietas que se han formado en el proceso de rotura a la primera imagen negra. Puedes pensar en el material como un gran rompecabezas y estoy tratando de juntar las piezas en el orden inverso al que rompieron.

En cada imagen, puede haber algunas grietas que están emergiendo y/o algunas grietas que se han formado completamente (y así se creó un fragmento). A lo largo del proceso de rotura, algunos fragmentos pueden separarse y romperse aún más. Los fragmentos también pueden moverse más lejos el uno del otro (el cambio es leve entre cuadros posteriores).

Salida deseada: Todas las grietas/líneas en la secuencia corresponden a la primera imagen de la secuencia.

Notas adicionales: Las imágenes están disponibles en formato de escala de grises (es decir, original), así como en formato binario, donde las grietas se han delineado en blanco y el fondo es completamente negro. Vea a continuación algunos ejemplos de imágenes.

orig_img1 orig_img2 orig_img3

binary_img1 binary_img2 binary_img3

La fila superior muestra las imágenes originales y la fila inferior muestra las imágenes binarias. Como puede ver, la grieta que desciende por el medio se hace más y más ancha a medida que progresa la secuencia de imágenes. Por lo tanto, la grieta inferior se mueve junto con el fragmento inferior. Al atravesar la secuencia en reversa, espero realizar algorítmicamente que la grieta intermedia se une como una (y asignarla correctamente a la primera imagen), y también mapear correctamente la grieta inferior, manteniendo su correspondencia correcta (tamaño y posición) con la fragmento inferior.

Una secuencia contiene típicamente alrededor de 30 ~ 40 imágenes, así que acabo de mostrar el subconjunto inicial. Además, aunque estas imágenes no lo muestran, es posible que una imagen en particular solo contenga el comienzo de la grieta (es decir, su apariencia inicial) y en imágenes posteriores sea cada vez más larga y se una con otras grietas.

Idioma: Aunque no es necesario, me gustaría implementar la solución usando MATLAB (solo porque la mayoría de los otros códigos que se relacionan con el proyecto se han hecho en MATLAB). Sin embargo, si OpenCV puede ser más fácil, soy flexible en el uso de mi idioma/biblioteca.

Cualquier idea es muy apreciada.

+2

El flujo óptico no le dará resultados significativos para las imágenes en blanco y negro. Además, su problema no está especificado: ¿cuál es su resultado deseado? Y, como siempre, las imágenes de muestra, por supuesto, ayudarían a entender la configuración. – etarion

+0

¿por qué la última imagen no es un resultado deseado? ¿Pueden los fragmentos moverse cada vez más? – Andrey

+1

Por favor proporcione imágenes. En general, los algoritmos OF requieren texturas y no son muy adecuados para imágenes binarias. Sería útil si proporcionara el nombre de los documentos que ha leído en lugar de un enlace a un PDF. –

Respuesta

4

Avanza hacia adelante en lugar de hacia atrás, y no utiliza el flujo óptico. Use las líneas de fractura para segmentar las partes negras, rastree el centroide de cada segmento negro a lo largo del tiempo. Cada vez que aparece una nueva línea de fractura que atraviesa un segmento negro, divida el segmento en dos y continúe rastreando cada segmento por separado.

A partir de esto, debería ser capaz de construir una estructura de árbol que represente la segmentación de las partes negras a lo largo del tiempo. Las líneas de fractura se pueden agregar como metadatos a este árbol, quizás asignando líneas de fractura al nodo del segmento en el que aparecieron por primera vez.

0

Le aconsejo que siga su idea inicial de rastrear las grietas. Yo sé cómo se ven las grietas para poder seguir todos los puntos que pertenecen a la grieta. Simplemente rastree todos los puntos blancos con un rastreador de flujo óptico, comience con el rastreador Lukas-Kanade y vea dónde se encuentra. El método de flujo óptico de alta precisión es global y, en general, rastrearé todos los píxeles de la imagen intentando mantener la suavidad en todas partes. El LK es un método local que simplemente usará una pequeña ventana alrededor de cada punto para hacer el seguimiento. El problema es que, aparte de las grietas, todos los píxeles son de color negro claro, por lo que no hay nada que pueda seguir, solo tendrás que intentar encontrar algo que no puedas rastrear y no necesites rastrear. Si las líneas son muy rectas puede terminar con lo que se llama aperture problem y obtendrá resultados inexactos. También puede probar alguna adaptación/deformación de forma basada en serpientes.

0

Estoy de acuerdo con damian. La mayoría de los métodos de flujo óptico como el HAOF se basan en la aproximación de taylor de primer orden de la ecuación de consistencia de constancia de intensidad I (x, t) = I (x + v, t + dt). Eso significa que la solución depende de las derivadas de imagen donde el gradiente determina la magnitud y el ángulo del vector de movimiento, es decir, se necesita una cierta cantidad de textura. Sin embargo, la muy baja textura de sus imágenes no binarizadas podría ser suficiente. Podría intentar la ecualización del histograma para aumentar el contraste de sus datos de entrada, pero es importante aplicar la misma transformación para ambas imágenes de entrada. p.ej. de la siguiente manera:

cv::Mat equalizeMat(grayInp1.rows, grayInp1.cols * 2 , CV_8UC1); 
grayInp1.copyTo(equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows))); 
grayInp2.copyTo(equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows))); 
cv::equalizeHist(equalizeMat,equalizeMat); 
equalizeMat(cv::Rect(0,0,grayInp1.cols,grayInp1.rows)).copyTo(grayInp1); 
equalizeMat(cv::Rect(grayInp1.cols,0,grayInp2.cols,grayInp2.rows)).copyTo(grayInp2); 
// estimate optical flow 
Cuestiones relacionadas