Misurare la lunghezza delle fibre di DNA da un'immagine di singole molecole


14

Sono un biologo con pochissima esperienza con l'elaborazione delle immagini ma ho una conoscenza sufficiente di MATLAB e ho la cassetta degli attrezzi per l'elaborazione delle immagini. Idealmente sto cercando una soluzione basata su MATLAB, ma sarebbe utile anche un approccio che descriva come procedere.

Aggiornamento (28 novembre 2011) Sembra che ci siano alcuni problemi (come le sovrapposizioni nel segnale e la definizione del colore) quando si utilizzano immagini composite (che è ciò che ho presentato nella domanda iniziale). Allego immagini separate dai 2 canali: verde inserisci qui la descrizione dell'immaginee rosso inserisci qui la descrizione dell'immagine(le regioni turchesi nell'immagine composita possono essere ignorate) e l'immagine coposita inserisci qui la descrizione dell'immagine. Il canale rosso è negativo per 2 motivi: 1. Ha uno scarso contrasto a causa dello sfondo più alto, 2. Poiché il rosso sembra sanguinare nel verde a livello di sfondo.

Una caratteristica è definita come una regione dell'immagine composita che ha Verde-Rosso-turchese-Rosso-Verde o equivalentemente i 2 segmenti lineari adiacenti sul verde e il rosso che sono colorati e contagiosi.

Spero che guardare le immagini da due canali separati faciliti l'identificazione delle funzionalità.

Ho i seguenti suggerimenti per l'algoritmo:

  1. Innanzitutto identifica i segmenti verdi co-lineari (e determina le lunghezze dei segmenti verdi)

  2. Determina se ci sono segmenti contagiosi e colinear adiacenti rivolti l'uno verso l'altro (es. Verde-> rosso-> <-rosso <-verde) nel canale rosso. In caso affermativo, definire la lunghezza del segmento rosso dal punto in cui terminano i segmenti verdi (poiché si sovrapporranno ai segmenti verdi) fino al punto sul segmento rosso più vicino all'altro segmento rosso dell'elemento. (ovvero una delle estremità del segmento rosso è impostata alla fine del segmento verde sovrapposto).

Grazie molto!

Contesto :

La mia domanda riguarda l'estrazione di funzionalità da un'immagine:

inserisci qui la descrizione dell'immagine

L'immagine originale (tif) si trova qui:

Esempio di immagine 1 (dropbox)

Questa immagine è composta da 3 canali (in formato tif): rosso, verde e turchese. Le fibre color turchese segnano semplicemente tutto il DNA che abbiamo sul vetrino. La caratteristica di interesse è la funzione Verde-Rosso - turchese - Rosso-Verde sul singolo filamento di DNA che è al centro dell'immagine.

Il rosso è generalmente il più rumoroso. Questo esempio è buono perché il contrasto è buono. Tuttavia, a volte le immagini non sono così belle e c'è una tonalità in tutta l'immagine, quindi codificare a fondo un valore RGB specifico per il colore verde e rosso potrebbe non funzionare per tutte le immagini. Inoltre, si noti che le fibre non sono necessariamente orizzontali, potrebbero essere ruotate (ma mai verticali).

Si prega di vedere questa immagine per un esempio:

inserisci qui la descrizione dell'immagine L'immagine originale (tif) si trova qui:

Esempio di immagine 2 (dropbox)

Inoltre, a volte una singola immagine ha molte di queste caratteristiche e talvolta ci sono più funzioni sullo stesso filamento di DNA. Infine, a volte potrebbero esserci solo funzioni parziali (cioè segmenti verdi o rossi isolati o verde-rosso isolati, ma non accoppiati).

Domanda:

Le sarei grato se qualcuno potesse aiutarmi a ottenere le lunghezze dei singoli segmenti di verde e rosso, ad es. Poiché la caratteristica di interesse è Verde-Rosso - turchese - Rosso-Verde, ogni caratteristica avrebbe una matrice di 5 valori (lunghezza del primo segmento verde, lunghezza del primo segmento rosso, lunghezza del segmento turchese, lunghezza del secondo segmento rosso e lunghezza del secondo segmento verde).


3
Ciao, questa domanda sta per essere trasferita a Signal Processing . Il nostro focus è sull'elaborazione delle immagini e sugli algoritmi e ho modificato la tua domanda per chiederlo. Anche se in MATLAB potrebbero esserci persone competenti, potresti trovare soluzioni in altre lingue (o pseudocodici) che ti guideranno alla risposta. Se sei ancora bloccato nell'implementazione della soluzione in MATLAB (supponendo che non hai già ricevuto una risposta MATLAB), puoi sempre tornare a Stack Overflow per chiedere aiuto nella traduzione.
Lorem Ipsum,

Un primo passo dovrebbe essere quello di memorizzare ogni segnale nel suo canale indipendente. Sì, il CFP è turchese, ma non dovresti dover mescolare il suo segnale dal canale verde.
Jonas,

Risposte:


11

Esempio in 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]]  

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

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

inserisci qui la descrizione dell'immagine

(*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*)  

inserisci qui la descrizione dell'immagine

modificare

Qui puoi vedere i gruppi rosso e verde separati. Come puoi immaginare, devi decidere quando una porzione è rossa!

inserisci qui la descrizione dell'immagine


Mille grazie per la tua risposta. Non sono chiaro quale sia la linea blu che si suppone rappresenti in quanto vi è una sola caratteristica in questa immagine. È possibile ottenere le lunghezze dei soli segmenti rosso e verde sulla linea in cui hai sovrapposto rosso / verde ?.
Lee Sande,

1
@Lee Certo che è possibile! Una volta che hai la trasformazione di Hough, usa la linea dilatata come maschera e misura i punti rossi vicini.
Dr. belisarius,

@Lee L'unica cosa a cui preoccuparti è avere una buona definizione di "rosso" :)
Dr. belisarius,

@Lee Se hai accesso a Mathematica, potrei pubblicare un po 'di codice in più per separare i segmenti
Dr. belisarius,

Mille grazie per la tua risposta. Mi sono reso conto dalla tua risposta che il canale rosso è problematico e che il segnale che si sovrappone al segmento verde adiacente dovrebbe essere troncato. Ho aggiornato il problema: potresti dare un'occhiata e dirmi se ha senso?
Lee Sande,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.