Encuentra los estomas en una imagen de microscopía vegetal

26

Aquí hay una pregunta para expertos en procesamiento de imágenes.

Estoy trabajando en un problema difícil de visión por computadora. La tarea es contar los estomas (marcados a continuación) en imágenes de microscopía DIC. Estas imágenes son resistentes a la mayoría de las técnicas de procesamiento de imágenes superficiales, como las operaciones morfológicas y la detección de bordes. También es diferente de otras tareas de conteo celular.

Estoy usando OpenCV. Mi plan es revisar las características potencialmente útiles para la discriminación de estomas.

  • Clasificadores de textura
    • DCT (transformada discreta del coseno / análisis de dominio de frecuencia)
    • LBP (patrones binarios locales)
  • HOG (histograma de gradientes orientados)
  • Detectores de características robustas (soy escéptico)
    • Esquinas de Harris
    • SIFT, SURF, STAR, etc.
  • Clasificador de cascada Haar / características de Viola-Jones

Y posiblemente diseñe un nuevo descriptor de características. Estoy dejando de lado la selección de un clasificador por ahora.

¿Qué me he perdido? Como resolverias esto? Las soluciones para problemas similares de detección de objetos serían muy útiles.

Imágenes de muestra aquí .

estomas

Después del filtro de paso de banda: paso de banda filtrado

La detección de bordes no es prometedora. Algunas áreas de imagen están desenfocadas: detección de bordes astutos

Matt M.
fuente
1
¿Tal vez en lugar de tratar de encontrar los estomas, podría intentar eliminar las líneas mazy?
endolito el
1
¿Cuántas imágenes tienes que procesar? ¿Qué tan rápido debe ser? ¿Qué tan automatizado tiene que ser?
endolito el
1
No tiene que ser muy rápido. Estamos procesando en el orden de 1000 imágenes. Debería ser automático: volcar imágenes en un directorio y listo.
Matt M.

Respuestas:

15

Lo siento, no conozco OpenCV, y este es más un paso de preprocesamiento que una respuesta completa:

Primero, no quieres un detector de bordes. Un detector de bordes convierte las transiciones (como esta de oscuro a claro):

    _____ / ‾‾‾‾‾

en crestas (líneas brillantes en la oscuridad) así

    ____ / _____

Realiza una diferenciación, en otras palabras.

Pero en sus imágenes, hay una luz que brilla desde una dirección, lo que nos muestra el alivio de la superficie 3D. Percibimos esto como líneas y bordes, porque estamos acostumbrados a ver cosas en 3D, pero en realidad no lo son, por eso los detectores de bordes no funcionan, y la coincidencia de plantillas no funcionará fácilmente con imágenes rotadas (un perfecto la coincidencia a 0 grados de rotación en realidad se cancelaría completamente a 180 grados, porque la luz y la oscuridad se alinearían entre sí

Si la altura de una de estas líneas mazy se ve así desde el lado:

    ____ / _____

entonces la función de brillo cuando se ilumina desde un lado se verá así:

    ____ ∧v ____

Esto es lo que ves en tus imágenes. La superficie frontal se vuelve más brillante y la superficie posterior se vuelve más oscura. Entonces no quieres diferenciar. Debe integrar la imagen a lo largo de la dirección de la iluminación, y le dará el mapa de altura original de la superficie (aproximadamente). Entonces será más fácil hacer coincidir cosas, ya sea a través de la transformación de Hough o la coincidencia de plantillas o lo que sea.

No estoy seguro de cómo automatizar la búsqueda de la dirección de la iluminación. Si es lo mismo para todas tus imágenes, genial. De lo contrario, tendría que encontrar la línea de contraste más grande y asumir que la luz es perpendicular a ella o algo así. Para mi ejemplo, roté la imagen manualmente a lo que pensé que era la dirección correcta, con luz proveniente de la izquierda:

original, girado

Sin embargo, también debe eliminar todos los cambios de baja frecuencia en la imagen para resaltar solo las características similares a líneas que cambian rápidamente. Para evitar que suenen los artefactos, utilicé el desenfoque gaussiano en 2D y luego lo resté del original:

paso alto filtrado

La integración (suma acumulativa) puede escaparse fácilmente, lo que produce rayas horizontales. Los eliminé con otro paso alto gaussiano, pero esta vez solo en dirección horizontal:

salida

Ahora los estomas son elipses blancas, en lugar de blanco en algunos lugares y negro en otros.

Original:

ingrese la descripción de la imagen aquí

Integrado:

ingrese la descripción de la imagen aquí

from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d

filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)

# Remove DC offset
I = I - average(I)

close('all')
figure()
imshow(I)
gray()
show()
title('Original')

# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)

figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)

# Integrate
summed = cumsum(I, 1)

# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)

figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)

La transformación de Hough se puede usar para detectar elipses de cresta como esta, hechas de "píxeles de borde", aunque es realmente costosa en computación y memoria, y no son elipses perfectas, por lo que tendría que ser un poco un detector "descuidado". Nunca lo he hecho, pero hay muchos resultados de Google para " detección de elipse hough ". Diría que si detecta una elipse dentro de la otra, dentro de un espacio de búsqueda de cierto tamaño, debe contarse como un estoma.

Ver también:

endolito
fuente
PD: ¿Lo que hice aquí tiene un nombre? ¿Es un tipo de filtro común?
endolito
1
+1 - ¡Gran respuesta! Acerca de la automatización del ángulo de la fuente de luz: puede usar un detector de bordes que calcule tanto la magnitud como el gradiente y luego calcule el promedio ponderado (por mag.) Del gradiente. Las respuestas más fuertes deben estar en la dirección de la iluminación.
Andrey Rubshtein
11

Lo primero que probaría es la coincidencia de plantillas, con plantillas rotadas para todos los ángulos con algún paso. Plantilla giratoria esencial aquí. Además, la elección de la plantilla podría no ser trivial, podría ser varias con diferentes luces, y podría ser borrosa para permitir diferencias en las formas.

http://en.wikipedia.org/wiki/Template_matching#Template-based_matching_and_convolution

Siguiente: HOG parece prometedor aquí. Otra solución podría ser usar un detector de esquinas fuerte como Moravec o Shi-Tomasi (con supresión no máxima) y buscar grupos de 2 esquinas o 3-4 esquinas en la misma línea que los candidatos. Después de encontrar candidatos, puede aplicar el contorno activo para la verificación (no estoy seguro de si realmente ayudaría, pero es posible)

http://en.wikipedia.org/wiki/Corner_detector

http://en.wikipedia.org/wiki/Active_contour

Otra posibilidad más es usar la transformación de Hough para elipses, posiblemente con no 2 sino 3-4 parámetros libres.

mirror2image
fuente
7

Respuesta parcial Encontrar candidatos con Mathematica:

p = ColorConvert[Import@"http://i.stack.imgur.com/38Ysw.jpg", 
    "GrayScale"] // ImageAdjust;
m = DeleteSmallComponents[Erosion[Dilation[DeleteSmallComponents[
      Binarize[EntropyFilter[p, 1] // ImageAdjust, .97], 10], 3], 5], 100];
ImageMultiply[Dilation[m, 3], p]

ingrese la descripción de la imagen aquí

Dr. belisario
fuente
Resultado interesante ... tal vez combinar con algún otro esquema ...
Matt M.
@MAtt Sí, creo que descartó al menos el 80% de la superficie no objetivo. Después de dilatar un poco la máscara, debes buscar las elipses. Independientemente del método que uses (todavía estoy pensando en lo que podría hacer), es mucho más fácil ahora que sabes que las bestias están rodeadas.
Dr. belisario el
1

Comenzaría usando un detector de borde sensible (por ejemplo, magnitud de gradiente con un umbral bajo), y luego usaría la transformación de Hough para tratar de encontrar las elipses. Canny podría funcionar igual de bien. Estoy seguro de que hay parámetros que puede ajustar para hacerlo más sensible y recoger los bordes borrosos.

Dima
fuente