Está en la página 1de 9

Presentacin de avance

1) Objetivos: identificar burbujas automticamente a partir de imgenes de


celdas de flotacin y obtener un histograma de tamaos. Herramientas:
bibliotecas de procesamiento de imgenes para Python, puntualmente
OpenCV y scikit-image, adems de otras bibliotecas como NumPy, SciPy,
matplotlib, etc.
2) Primer enfoque: marcar bordes + identificar burbujas.
3) Idea general: watershed. Concepto: una imagen en escala de grises
puede entenderse como una superficie, en la que zonas oscuras son
valles y zonas ms luminosas son mximos. La idea es trabajar
previamente la imagen de modo que los bordes de los objetos que se
quieren detectar sean mximos y su interior mnimos (por ejemplo
calculando el gradiente), y posteriormente definir un conjunto de
marcadores que se encuentren cada uno al interior de un objeto
distinto a identificar. Lo que hace el algoritmo de watershed es inundar
la imagen a partir de los marcadores, haciendo crecer los marcadores
hasta que chocan con otro, marcando como bordes los puntos en los que
esto ocurre. En particular el algoritmo de Meyer (utilizado por OpenCV y
scikit-image): inserta todos los pixeles que estn en contacto con un
marcador en una cola de prioridad, ordenados segn su intensidad.
Luego toma el primero de la cola (es decir, el ms oscuro); si est en
contacto con un solo tipo de etiqueta, se la asigna tambin, e inserta los
pixeles a su alrededor en la cola de prioridad. Si por el contrario est en
contacto con pixeles de distintos objetos, se marca como borde. El
proceso se repite hasta que todos los pixeles hayan sido etiquetados
segn uno de los marcadores iniciales.
4) Aplicado a las burbujas: posibilidad de usar los reflejos como
marcadores. Como imagen base:
a. Imagen original invertida: en principio las burbujas son valles con
mnimos en los reflejos y mximos en los bordes, watershed
debera . En la prctica los bordes tienen niveles muy distintos y
siempre alguna burbuja rebalsa debido a cmo
b. Gradiente:
5) Estructura del programa:
a. Importar imagen, pasar a escala de grises.
b. Ecualizacin adaptativa para marcar mejor mximos y mnimos y
minimizar efecto de iluminacin dispar de la toma.
c. Obtener gradiente: sobel.
d. Obtener imagen binaria con reflejos: threshold binario adaptativo,
marca todos los reflejos, pero tiene muchos falsos positivos y
algunos reflejos se dividen artificialmente.
e. Se aplican transformaciones morfolgicas para minimizar estos
efectos: Open seguido de Close, se elimina la mayor parte de
falsos positivos (con el problema de perder las burbujas ms
pequeas) y se funden los reflejos mal separados.

f.

Definir marcadores: funcin label(), a partir de una imagen binaria


(objetos blancos sobre fondo negro), en este caso los reflejos,
identifica cada grupo de pixeles conectados con una etiqueta
nica (un entero positivo). Los pixeles an por identificar quedan
marcados con un 0.
g. Definir imagen base?
h. Watershed: se aplica el algoritmo de watershed a la imagen base,
a partir de los marcadores basados en los reflejos de las burbujas.
La implementacin de OpenCV devuelve una matriz de iguales
dimensiones que la imagen original, con los pixeles
pertenecientes a cada burbuja marcados con el entero
correspondiente al marcador que les dio origen, y con los bordes
entre burbujas marcados con un -1. Esto hace que sea fcil
graficar los contornos de las burbujas (y as comprobar los
resultados), adems de calcular las reas de cada burbuja.
i. Para estimar las reas de las burbujas se usa la funcin bincount()
para obtener un arreglo con el nmero de pixeles con cada entero.
j. Se grafica un histograma en base al arreglo anterior.
6) Resultados hasta el momento:
7) Otras cosas (potencialmente) tiles:
a.
8) Trabajo futuro:

1) Objetivos: identificar burbujas automticamente a partir de imgenes de


celdas de flotacin y obtener un histograma con los tamaos.
Herramientas: bibliotecas de procesamiento de imgenes para Python,
puntualmente OpenCV y scikit-image, adems de otras bibliotecas como
NumPy, SciPy, matplotlib, etc.
2) Primer enfoque: filtrar, marcar bordes, luego de alguna manera
identificar las burbujas (eg usando transformada de Hull para encontrar
crculos) y luego usar esas aproximaciones para estimar el rea.
a. Filtros pasa altos: derivada discreta, cero en zonas constantes,
mximos en bordes (cambios abruptos). Resultados (al menos
Sobel). No muy marcados, bordes dispares.
b. Detector de bordes de Canny: proceso ms complejo que incluye
suavizacin, sobel, umbrales, etc. Retorna una imagen binaria con
bordes marcados con lneas delgadas. Malos resultados iniciales.
-> Ecualizacin de histograma: marcar mejor las diferencias.
Problemas si hay iluminacin dispar -> ecualizacin adaptativa: se
hace regionalmente
-> Mejoras en el Canny, marca mucho ms, se alcanza a distinguir
burbujas ms grandes, pero tiene demasiado ruido.
Marca muchos ms bordes, pero parecera no ser demasiado til
para identificar las burbujas, porque no hay una correspondencia
directa entre los cambios abruptos en la intensidad de los pixeles
y los contornos de las burbujas: hay cambios abruptos al interior
de las burbujas, y transiciones entre burbujas que son suaves.
Esto motiva un cambio de enfoque.
3) Segundo enfoque: segmentacin por watershed.
a. Analoga: una imagen en escala de grises puede entenderse como
una superficie, en la que zonas oscuras son valles y zonas ms
luminosas son mximos. La idea es trabajar previamente la
imagen de modo que los bordes de los objetos que se quieren
detectar sean mximos y su interior mnimos (por ejemplo
calculando el gradiente), y posteriormente definir un conjunto de
marcadores que se encuentren cada uno al interior de un objeto
distinto a identificar. Lo que hace el algoritmo de watershed es
inundar la imagen a partir de los marcadores, haciendo crecer
los marcadores hasta que chocan con otro, marcando como
bordes los puntos en los que esto ocurre.
b. Algoritmo de Meyer? (utilizado por OpenCV y scikit-image):
inserta todos los pixeles que estn en contacto con un marcador
en una cola de prioridad, ordenados segn su intensidad. Luego
toma el primero de la cola (es decir, el ms oscuro); si est en
contacto con un solo tipo de etiqueta, se la asigna tambin, e
inserta los pixeles a su alrededor en la cola de prioridad. Si por el
contrario est en contacto con pixeles de distintos objetos, se
marca como borde. El proceso se repite hasta que todos los

pixeles hayan sido etiquetados segn uno de los marcadores


iniciales.
c. Aplicado a las burbujas: utilizar los reflejos para obtener
marcadores.
-> Binarizacin -> binarizacin adaptativa: todos marcados,
muchos falsos positivos y divisiones artificiales.
-> Transformaciones morfolgicas: por mejorar, pero se puede
eliminar la gran mayora de los falsos positivos a costa de perder
la ms pequeas, adems de fundir las separadas. Ventaja de que
favorece eliminacin de reflejos angostos, por mucho que sean
relativamente grandes (suelen ser los falsos positivos).
d. Imagen base:
i. Primera idea: imagen original en escala de grises (debera
ser como hoyos raros, pero por ruido y bordes disparejos se
rebalsa). Grficos 3d?
ii. Canny: paredes infinitas, dependiendo de cmo se
implemente concretamente el algoritmo pueden guiar el
agua. Resultados notablemente mejores, problemas ms
que nada en los alrededores de burbujas ms grandes.
iii. Gradiente: ms suave, genera una suerte de piscinas en las
burbujas. Probablemente los mejores resultados hasta el
momento. Los mejores resultados: sigue mejor los
contornos de las burbujas, no detectados por Canny
(binario) pero que s aparecen con Sobel.
e. Watershed necesita que cada marcador est identificado con una
etiqueta nica, lo que se logra con la funcin label() de scipy
(entrega una matriz con iguales dimensiones que la imagen
original, en la que todos los pixeles pertenecientes a un mismo
reflejo se marcan con un entero positivo que lo identifica,
mientras que las zonas desconocidas se marcan con ceros).
Ventaja: watershed hace crecer estos marcadores, identificando
con un -1 los bordes. Esto hace muy fcil visualizar los resultados
(graficando los bordes) y calcular las reas (medidas en pixeles,
simplemente contando la cantidad de pixeles con cada nmero).
Para esto ltimo hay funciones predefinidas muy eficientes
(bincount()).
f. Muchas variables, queda por encontrar versin ptima.
4) Tercer enfoque: motivacin -> watershed funciona particularmente bien
para burbujas medianas y pequeas (que se detecten) y particularmente
mal para grandes ([casi] siempre ms chicas de lo que son), mientras
que con Canny ocurre lo contrario (imagen, se pueden identificar las
burbujas mayores).
-> Trabajar de forma separada. Idealmente: identificar con alta precisin
las burbujas grandes, aprovechando buenos resultados de Canny, y

luego aplicar watershed para las ms chicas, marcando las burbujas


grandes como zonas conocidas.
a. Aislar reflejos de burbujas grandes: transformaciones morfolgicas
-> fundir y luego dejar slo las ms grandes. Buenos resultados.
b. Limpiar Canny: dilatar primero para cerrar pequeas aberturas,
luego eliminar los menores a un cierto umbral. Buenos resultados,
robusto.
-> imgenes, a simple vista parecera haber suficiente
informacin para marcar bien las burbujas grandes. Idea:
completar los bordes. Partiendo desde los marcadores, avanzar
radialmente hasta chocar con una pared, marcar punto.
Idealmente muchos puntos -> envoltura convexa o ajustar elipse.
Problema: filtrar puntos extraos.
c. Primera idea: tirar muchas rectas -> muchos puntos bien
ajustados + unos pocos alejados -> ajustar elipse por mnimos
cuadrados, idealmente los pocos alejados tienen poco peso y la
elipse se parece a lo deseado, con lo que luego se pueden
eliminar los puntos raros usando como criterio su distancia a la
elipse.
-> Problemas: poco robusto, muy afectado por unos pocos puntos
raros.
d. Segundo
enfoque:
triangulacin
de
Delaunay.
Conectar
marcadores entre s, luego hacer el proceso anterior (caminar
hasta chocar con una pared), pero slo entre el marcador y sus
vecinos. Propiedad importante: conecta slo puntos cercanos ->
se evita marcar puntos alejados que deformen el contorno.
e. Implementado con xito, en algunos casos bueno, en otros parece
detectar muy pocos puntos -> posible mejora: hacer una
segunda vuelta, repitiendo la triangulacn sin considerar los
vecinos originales, logrando mayor cantidad de puntos en el borde
sin alejarse demasiado.
f. Ajustar figura: envoltura convexa da una aproximacin bastante
burda (no mejor que watershed), elipse por mnimos cuadrados da
en ocasiones resultados muy buenos, en otras psimos -> no es
confiable.
5) Cuarto enfoque: random_walker().
a. Explicacin:
b. Ventajas y desventajas:
c. Resultados de primeras pruebas:
d. Nuevo limitante -> marcadores. Escogiendo bien el Beta
(relativamente alto, de modo que tiene ms peso los bordes
encontrados con Sobel) los resultados mejoran notablemente
6) Versin actual:
a. Cargar imagen, pasar a escala de grises, ecualizar con CLAHE
b. Calcular Sobel (derivadas direccionales y luego tomar la norma)

c. Obtener reflejos con threshold fijo sobre imagen ecualizada


(original)
d. Reducir (con funcin predefinida) las imgenes obtenidas (Sobel,
reflejos)
e. Usar la funcin label() para etiquetar con enteros positivos
distintos cada reflejo
f. Aplicar random_walker() (o watershed) a partir de los marcadores,
usando como base el Sobel.
7) Conclusiones y trabajo futuro: concentrarnos en random_walker() ->
mejorar deteccin de reflejos, encontrar configuracin ptima para la
funcin y versin ptima de imagen base.
i.

Trabajo: 3 caminos:
1) Mejorar watershed. Variables:
a. Versin de watershed: 3 implementaciones distintas con
diferencias no del todo claras debido a implementaciones
particulares -> OpenCV, SciPy y scikit-image.
b. Imagen base:
i. Imagen original (o invertida): filtros para suavizar ruido
(cunto?, cul?),
ii. Canny: distintas implementaciones, ecualizacin previa
cambia fuertemente resultados, tamao del filtro, proceso
para eliminar bordes sueltos, engrosar bordes, etc.
iii. Sobel:
iv. Otro filtro pasa-alto:
v. Pegar Canny encima de otro de los anteriores
c. Mejorar marcadores: transformaciones para eliminar falsos
positivos, forma de mantener burbujas ms pequeas.
2) Random Walker: instalar PyAMG, repetir pruebas de watershed con
random_walker().
3) A partir de Canny tartar de completer bordes de burbujas grandes.

Presentacin final

1) Resumen: objetivos, breve proceso, estructura random walker/watershed


2) Problema: zonas de no burbujas. No me hago cargo, no es lo que me
pidieron. Todo el anlisis que he hecho es asumiendo que estoy
trabajando con una imagen con burbujas, y las quiero identificar y medir.
Sugerencia: para zonas definidas (e.g. un derrame de pulpa)
implementar un identificador de textura (continuar investigacin de
Javier) a priori (y luego marcar la zona con un -1 antes de pasrselo al
random_walker()) o a posteriori (revisando por ejemplo slo las
burbujas ms grandes). Para las imgenes con puras hues, no s,
loco. No es mi problema. Ni siquiera s qu es lo que quisieran sacar de
esas imgenes.
En resumen, a excepcin de este pequeo apartado de sugerencias
complementarias, todo el resto del anlisis parte de la base de que
estamos trabajando con una imagen que slo contiene burbujas (zonas
que no son celda se pueden evitar poniendo bien la cmara, cortando
manualmente, o mediante el mtodo Javier + (-1)).
-> Los resultados depende bsicamente de dos factores: gradiente y
marcadores. Sobel: slido y robusto. Marcadores:
a. Falsos positivos: problema abierto, no tan crtico -> tienden a
encerrarse en burbujas pequeas, y no afectan demasiado la
forma de burbujas adyacentes.
b. Robustez: diferente valor absoluto del umbral, distancia entre
marcadores y no marcadores, y tamaos de los marcadores,
entre otros.
3) Herramientas para calcular umbral:

1) Resumen:
a. Ojetivos
b. Enfoques: bordes + detector (descartado, bordes demasiado feos
como para ser tiles directamente), watershed (decente, pero con
problemas y poco modificable, se mantiene como opcin si la
prioridad es la velocidad), completar contornos (descartado, malos
resultados y poco confiable).
c. Random walker: los mejores resultados, aunque lento. Sobel ->
bueno y robusto. Marcadores -> principal fuente de problemas.
Caso ideal (razonable): logramos aislar todos los puntos que
destacan, por regin (tenemos al menos un marcador por burbuja,
pero aparecen tambin falsos positivos en los contornos y en el
interior de las burbujas). Buena noticia: tiende a encerrarlos, por
lo que no afectan mucho a las burbujas adyacentes.
2) Primera mejora: filtrar a posteriori las burbujas al interior de otras.
Implementacin sencilla.
3) Desafo: hacer la deteccin lo ms robusta posible.
4) Otsu: concepto general.
5) Otsu local: bondades y problemas.
6) Falsos positivos en zonas homogneas: solucionado tomando una
vecindad lo suficientemente grande como para que siempre hayan
marcadores y no marcadores dentro, pero an as suficientemente
pequea para que la iluminacin sea relativamente homognea.
7) Tiende a generar manchones: queremos aumentar el umbral
encontrado. Idea para hacerlo inteligente: mximos. Concepto general.
Se puede pulir y mejorar con ms tiempo.
8) Problemas con burbujas grandes: demasiada segmentacin de los
marcadores, en algunos casos ya no se encierran.
9) Posible solucin: se puede jugar con el beta, de modo de hacer ms
difcil la difusin. Mejora algunos casos, otros no. Los que ms sufren son
los que mejor se detectaban con Otsu solo. Podra haber una forma de
discriminar entre casos y aplicar lo ideal, qu s yo. Me falta tiempo.
IMPORTANTE: me pasaron varias imgenes, algunas de las cules me parecen
fundamentalmente distintas de lo que tena al comienzo. Me voy a centrar en
imgenes que tienen slo burbujas, que por lo dems son la mayora de los
casos (despus puedo ver qu hace el algoritmo en los otros casos, pero dado
el tiempo que tena no los consider para la optimizacin). Para incorporar
estos casos se me ocurre hacer un anlisis previo basado ms en textura para
identificar zonas de no-burbujas y marcarlas antes de meterlo al random
walker (se puede hacer marcando esas zonas con un -1, con lo que no crecen
ni se consumen).

También podría gustarte