Estoy trabajando en un proyecto donde se proyectan flecos contra un sujeto y se toma una foto. La tarea es encontrar las líneas centrales de las franjas, que representan, matemáticamente, la curva 3D de intersección entre el plano marginal y la superficie del sujeto.
La foto es PNG (RGB), y los intentos anteriores utilizaron escala de grises y luego umbral de diferencia para obtener una fotografía en blanco y negro, "similar a una cebra", desde la cual fue fácil encontrar el punto medio de cada columna de píxeles de cada franja. El problema es que, al establecer un umbral y también al tomar la altura media de una columna de píxeles discreta, estamos teniendo algo de pérdida de precisión y cuantización, lo que no se desea en absoluto.
Mi impresión, al mirar las imágenes, es que las líneas centrales podrían ser más continuas (más puntos) y más suaves (no cuantificadas) si se detectaran directamente desde la imagen sin umbral (RGB o escala de grises), mediante algún método de barrido estadístico (alguna inundación / convolución iterativa, lo que sea).
A continuación se muestra una imagen de muestra real:
Cualquier sugerencia sería muy apreciada!
fuente
Respuestas:
Sugiero los siguientes pasos:
x
, encuentre el centro ponderado (por intensidad de píxel) eny
dirección.y
valores para eliminar el ruido.(x,y)
puntos ajustando algún tipo de curva. Este artículo puede ayudarte. También puede colocar un polinomio de alto nivel, aunque en mi opinión es peor.Aquí hay un código de Matlab que muestra los pasos 1,2 y 4. Me salteé la selección automática de umbral. En su lugar, elegí el manual
th=40
:Estas son las curvas que se encuentran al encontrar el promedio ponderado por columna:
Estas son las curvas después de ajustar un polinomio:
Aquí está el código:
fuente
double
. Sobre los resultados en la mitad inferior, necesito verificar, podría ser un error de softwareNo usaría la imagen RGB. Las imágenes en color generalmente se realizan colocando un "Filtro Bayer" en el sensor de la cámara, lo que generalmente reduce la resolución que puede lograr.
Si usa la imagen en escala de grises, creo que los pasos que describió (binarizar la imagen de "cebra", encontrar la línea media) son un buen comienzo. Como paso final, lo haría
fuente
Aquí hay una solución alternativa a su problema modelando su pregunta como un 'problema de optimización de ruta'. Aunque es más complicado que la solución simple de binarización y luego ajuste de curva, es más robusto en la práctica.
Desde el nivel más alto, debemos considerar esta imagen como un gráfico, donde
cada píxel de la imagen es un nodo en este gráfico
cada nodo está conectado a otros nodos, conocidos como vecinos, y esta definición de conexión a menudo se refiere a la topología de este gráfico.
cada nodo tiene un peso (característica, costo, energía o como quiera llamarlo), lo que refleja la probabilidad de que este nodo se encuentre en una línea central óptima que estamos buscando.
Mientras podamos modelar esta probabilidad, entonces su problema de encontrar 'las líneas centrales de las franjas' se convierte en el problema de encontrar rutas óptimas locales en el gráfico , que pueden resolverse efectivamente mediante programación dinámica, por ejemplo, el algoritmo de Viterbi.
Aquí hay algunas ventajas de adoptar este enfoque:
todos sus resultados serán continuos (a diferencia del método de umbral que podría dividir una línea central en pedazos)
muchas libertades para construir un gráfico de este tipo, puede seleccionar diferentes características y la topología del gráfico.
sus resultados son óptimos en el sentido de optimizaciones de ruta
su solución será más robusta contra el ruido, porque mientras el ruido se distribuya por igual entre todos los píxeles, esas rutas óptimas permanecerán estables.
Aquí hay una breve demostración de la idea anterior. Como no utilizo ningún conocimiento previo para especificar qué son posibles nodos iniciales y finales, simplemente decodifico wrt cada posible nodo inicial.
Para las terminaciones difusas, se debe al hecho de que estamos buscando rutas óptimas para todos los nodos finales posibles. Como resultado, aunque para algunos nodos ubicados en áreas oscuras, la ruta resaltada sigue siendo la óptima local.
Para el camino difuso, puede suavizarlo después de encontrarlo o usar algunas características suavizadas en lugar de intensidad bruta.
Es posible restaurar rutas parciales cambiando nodos iniciales y finales.
No será difícil podar estas rutas óptimas locales no deseadas. Debido a que tenemos las probabilidades de todas las rutas después de la decodificación de viterbi, y puede usar varios conocimientos previos (por ejemplo, vemos que es cierto que solo necesitamos una ruta óptima para aquellos que comparten la misma fuente).
Para más detalles, puede consultar el documento.
Aquí hay un pequeño fragmento de código de Python que se usa para hacer el gráfico anterior.
fuente
Pensé que debería publicar mi respuesta, ya que es un poco diferente de otros enfoques. Intenté esto en Matlab.
Una desventaja que veo aquí es que este enfoque no funcionará bien para algunas orientaciones de las franjas. En ese caso tenemos que corregir su orientación y aplicar este procedimiento.
Aquí está el código de Matlab:
Por ejemplo, si toma la columna central de la imagen, su perfil debería verse así: (en azul está el perfil. En verde están los máximos locales)
Y la imagen que contiene los máximos locales para todas las columnas se ve así:
Aquí están los componentes conectados (aunque algunas franjas están rotas, la mayoría de ellas obtienen una región continua):
fuente