Medición de la longitud de las fibras de ADN a partir de una imagen de moléculas individuales

14

Soy biólogo con muy poca experiencia en procesamiento de imágenes, pero tengo suficiente conocimiento de MATLAB y tengo la caja de herramientas de procesamiento de imágenes. Idealmente, estoy buscando una solución basada en MATLAB, pero un enfoque que describa cómo hacerlo también sería útil.

Actualización (28 de noviembre de 2011) Parece que hay ciertos problemas (como superposiciones en la señal y la definición del color) al usar imágenes compuestas (que es lo que presenté en la pregunta inicial). Adjunto imágenes separadas de los 2 canales: verde ingrese la descripción de la imagen aquíy rojo ingrese la descripción de la imagen aquí(se pueden ignorar las regiones turquesas en la imagen compuesta) y la imagen coposita ingrese la descripción de la imagen aquí. El canal rojo es malo por 2 razones: 1. Tiene poco contraste debido a un fondo más alto, 2. Dado que el rojo parece sangrar en el verde en el nivel de fondo.

Una característica se define como una región en la imagen compuesta que tiene Verde-Rojo-turquesa-Rojo-Verde o, de manera equivalente, los 2 segmentos lineales adyacentes en el verde y el rojo que son colineales y contagiosos.

Espero que mirar las imágenes de los dos canales separados facilite la identificación de las características.

Tengo las siguientes sugerencias para el algoritmo:

  1. Primero identifique los segmentos verdes co-lineales (y determine las longitudes de los segmentos verdes)

  2. Determine si hay segmentos adyacentes contagiosos y colineales enfrentados entre sí (es decir, verde-> rojo-> <-rojo <-verde) en el canal rojo. En caso afirmativo, defina la longitud del segmento rojo desde el punto donde terminan los segmentos verdes (porque se superpondrán con los segmentos verdes) hasta el punto en el segmento rojo más cercano al otro segmento rojo de la entidad. (es decir, uno de los extremos del segmento rojo se establece al final del segmento verde superpuesto).

¡Muchas gracias!

Antecedentes :

Mi pregunta se refiere a la función de extracción de una imagen:

ingrese la descripción de la imagen aquí

La imagen original (tif) se encuentra aquí:

Ejemplo de imagen 1 (dropbox)

Esta imagen es un compuesto de 3 canales (en formato tif): rojo, verde y turquesa. Las fibras de color turquesa simplemente marcan todo el ADN que tenemos en el cubreobjetos. La característica de interés es la característica Verde-Rojo - turquesa - Rojo-Verde en la cadena de ADN que está en el medio de la imagen.

El rojo es generalmente el más ruidoso. Este ejemplo es bueno porque el contraste es bueno. Sin embargo, a veces las imágenes no son tan agradables y hay un tono en toda la imagen, por lo que codificar un valor RGB específico para el color verde y rojo podría no funcionar para todas las imágenes. Además, tenga en cuenta que las fibras no son necesariamente horizontales, sino que pueden rotarse (pero nunca verticalmente).

Por favor, vea esta imagen para ver un ejemplo:

ingrese la descripción de la imagen aquí La imagen original (tif) se encuentra aquí:

Ejemplo de imagen 2 (dropbox)

Además, a veces una sola imagen tiene muchas de esas características y, a veces, hay múltiples características en la misma cadena de ADN. Finalmente, a veces puede haber solo características parciales (es decir, verde aislado o rojo aislado o segmentos verdes-rojos aislados, pero no apareados).

Pregunta:

Estaría agradecido si alguien puede ayudarme a obtener las longitudes de los segmentos individuales de verde y rojo, es decir, dado que la característica de interés es Verde-Rojo - turquesa - Rojo-Verde, cada característica tendría una matriz de 5 valores (longitud del primer segmento verde, longitud del primer segmento rojo, longitud del segmento turquesa, longitud del segundo segmento rojo y la longitud del segundo segmento verde).

Lee Sande
fuente
3
Hola, esta pregunta está a punto de migrarse al procesamiento de señales . Nuestro enfoque está en el procesamiento de imágenes y algoritmos, y he editado su pregunta para pedirla. Aunque puede haber personas con conocimientos en MATLAB, puede obtener soluciones en otros idiomas (o pseudocódigo), que lo guiarán a la respuesta. Si todavía está atascado en la implementación de la solución en MATLAB (suponiendo que aún no haya recibido una respuesta de MATLAB), siempre puede volver a Stack Overflow para pedir ayuda en la traducción.
Lorem Ipsum
Un primer paso debe ser almacenar cada señal en su canal independiente. Sí, CFP es turquesa, pero no debería tener que mezclar su señal del canal verde.
Jonas

Respuestas:

11

Ejemplo en Mathematica:

(* Get your image*)
img = Import["http://dl.dropbox.com/u/18072545/c_29.tif"];
(*Detect the extended minima and remove background*)
nB = ImageSubtract[img, ColorNegate@FillingTransform@ColorNegate[img]]  

ingrese la descripción de la imagen aquí

(*Separate RGB channels*)
cS = ImageAdjust /@ ColorSeparate[img]

ingrese la descripción de la imagen aquí

(*Binarize*)
bcS = Binarize[#, .4] & /@ cS  

ingrese la descripción de la imagen aquí

(*Remove large elements*)
tH = TopHatTransform[#, DiskMatrix[2]] & /@ bcS  

ingrese la descripción de la imagen aquí

(*Detect lines using a Hough Transform*)
lines = ImageLines[#, .01, .8] & /@ tH
(*Plot them*)
Show[img, Graphics[{
   Thickness[.01], Red, Line /@ (lines[[1]]),
   Thickness[.006], Green, Line /@ (lines[[2]]),
   Thickness[.004], Blue, Line /@ (lines[[3]])}]]
(*Red and green are superimposed*)  

ingrese la descripción de la imagen aquí

Editar

Aquí puede ver los grupos rojos y verdes separados. Como puedes imaginar, ¡debes decidir cuándo una porción es roja!

ingrese la descripción de la imagen aquí

Dr. belisario
fuente
Muchas gracias por tu respuesta. No tengo claro qué se supone que representa la línea azul, ya que solo hay una característica en esta imagen. ¿Es posible obtener las longitudes de solo los segmentos rojo y verde en la línea donde ha superpuesto rojo / verde?
Lee Sande
1
@Lee ¡Por supuesto que es posible! Una vez que tenga la transformación de Hough, use la línea dilatada como una máscara y mida los puntos rojos cercanos.
Dr. belisario
@Lee Lo único que debe preocuparse es tener una buena definición de "rojo" :)
Dr. belisarius
@Lee Si tiene acceso a Mathematica, podría publicar más código para separar los segmentos
Dr. belisarius
Muchas gracias por su respuesta. Me di cuenta de su respuesta que el canal rojo es problemático y que la señal que se superpone al segmento verde adyacente tendría que truncarse. He actualizado el problema. ¿Podrían echar un vistazo y decirme si tiene sentido?
Lee Sande