Mesurer la longueur des fibres d'ADN à partir d'une image de molécules uniques

14

Je suis un biologiste avec très peu d'expérience en traitement d'image mais j'ai une connaissance suffisante de MATLAB et j'ai la boîte à outils de traitement d'image. Idéalement, je recherche une solution basée sur MATLAB, mais une approche décrivant comment s'y prendre serait également utile.

Mise à jour (28 novembre 2011) Il semble qu'il y ait certains problèmes (tels que les chevauchements de signal et la définition de la couleur) lors de l'utilisation d'images composites (ce que j'ai présenté dans la question initiale). J'attache des images distinctes des 2 canaux: vert entrez la description de l'image iciet rouge entrez la description de l'image ici(les régions turquoise de l'image composite peuvent être ignorées) et l'image coposite entrez la description de l'image ici. Le canal rouge est mauvais pour 2 raisons: 1. Il a un contraste médiocre en raison d'un fond plus élevé, 2. Puisque le rouge semble saigner dans le vert au niveau du fond.

Une entité est définie comme une région sur l'image composite qui a Vert-Rouge-turquoise-Rouge-Vert ou de manière équivalente les 2 segments linéaires adjacents sur le vert et le rouge qui sont colinéaires et contagieux.

J'espère que regarder les images des deux canaux séparés facilitera l'identification des fonctionnalités.

J'ai les suggestions suivantes pour l'algorithme:

  1. Identifiez d'abord les segments verts colinéaires (et déterminez les longueurs des segments verts)

  2. Déterminez s'il y a des segments contagieux et colinéaires adjacents se faisant face (c.-à-d. Vert-> rouge-> <-rouge <-vert) dans le canal rouge. Si oui, définissez la longueur du segment rouge depuis le point où les segments verts se terminent (car ils se chevauchent avec les segments verts) jusqu'au point du segment rouge le plus proche de l'autre segment rouge de l'entité. (c'est-à-dire que l'une des extrémités du segment rouge est définie à la fin du segment vert se chevauchant).

Merci beaucoup!

Contexte :

Ma question concerne l'extraction d'une fonctionnalité d'une image:

entrez la description de l'image ici

L'image originale (tif) se trouve ici:

Exemple d'image 1 (dropbox)

Cette image est un composite de 3 canaux (au format tif): rouge, vert et turquoise. Les fibres de couleur turquoise marquent simplement tout l'ADN que nous avons sur la lamelle. La caractéristique intéressante est la caractéristique Vert-Rouge - turquoise - Rouge-Vert sur le seul brin d'ADN qui est au milieu de l'image.

Le rouge est généralement le plus bruyant. Cet exemple est bon car le contraste est bon. Cependant, parfois les images ne sont pas aussi belles et il y a une teinte dans toute l'image, donc le codage en dur d'une valeur RVB spécifique pour la couleur verte et rouge peut ne pas fonctionner pour toutes les images. Notez également que les fibres ne sont pas nécessairement horizontales, elles peuvent être tournées (mais jamais verticales).

Veuillez voir cette image pour un exemple:

entrez la description de l'image ici L'image originale (tif) se trouve ici:

Exemple d'image 2 (dropbox)

De plus, parfois une seule image possède de nombreuses fonctionnalités de ce type et parfois il existe plusieurs fonctionnalités sur le même brin d'ADN. Enfin, parfois, il peut n'y avoir que des éléments partiels (c'est-à-dire des segments verts isolés ou rouges isolés ou des segments vert-rouge isolés, mais non appariés).

Question:

Je serais reconnaissant si quelqu'un pouvait m'aider à obtenir les longueurs des segments individuels de vert et des segments rouges, c'est-à-dire que puisque la caractéristique d'intérêt est Vert-Rouge - turquoise - Rouge-Vert, chaque caractéristique aurait un tableau de 5 valeurs (longueur du premier segment vert, longueur du premier segment rouge, longueur du segment turquoise, longueur du deuxième segment rouge et longueur du deuxième segment vert).

Lee Sande
la source
3
Bonjour, cette question est sur le point d'être migrée vers le traitement du signal . Notre objectif est le traitement d'image et les algorithmes, et j'ai modifié votre question pour la poser. Bien qu'il puisse y avoir des personnes bien informées dans MATLAB, vous pouvez obtenir des solutions dans d'autres langues (ou pseudocode), qui vous guideront vers la réponse. Si vous êtes toujours bloqué dans l'implémentation de la solution dans MATLAB (en supposant que vous n'avez pas encore obtenu de réponse MATLAB), vous pouvez toujours revenir à Stack Overflow pour demander de l'aide pour la traduction.
Lorem Ipsum,
Une première étape devrait être de stocker chaque signal dans son canal indépendant. Oui, CFP est turquoise, mais vous ne devriez pas avoir à démêler son signal du canal vert.
Jonas

Réponses:

11

Exemple 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]]  

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Éditer

Ici, vous pouvez voir les clusters rouge et vert séparément. Comme vous pouvez l'imaginer, vous devez décider quand une portion est rouge!

entrez la description de l'image ici

Dr. belisarius
la source
Merci beaucoup pour votre réponse. Je ne sais pas exactement ce que la ligne bleue est censée représenter car il n'y a qu'une seule caractéristique dans cette image. Est-il possible d'obtenir uniquement les longueurs des segments rouge et vert sur la ligne où vous avez superposé le rouge / vert?.
Lee Sande
1
@Lee Bien sûr, c'est possible! Une fois que vous avez la transformation de Hough, utilisez la ligne dilatée comme masque et mesurez les points rouges à proximité.
Dr belisarius
@Lee La seule chose à laquelle il faut se soucier est d'avoir une bonne définition de "rouge" :)
Dr. belisarius
@Lee Si vous avez accès à Mathematica, je pourrais poster un peu plus de code pour séparer les segments
Dr. belisarius
Merci beaucoup pour votre réponse. J'ai réalisé à partir de votre réponse que le canal rouge est problématique et le signal chevauchant le segment vert adjacent devrait être tronqué. J'ai mis à jour le problème - pourriez-vous s'il vous plaît jeter un oeil et me dire si cela a du sens?
Lee Sande