Trouver les stomates dans une image de microscopie végétale


26

Voici une question pour les experts en traitement d'image.

Je travaille sur un problème de vision par ordinateur difficile. La tâche consiste à compter les stomates (indiqués ci-dessous) dans les images de microscopie DIC. Ces images résistent à la plupart des techniques de traitement d'images superficielles comme les opérations morphologiques et la détection des contours. Il est également différent des autres tâches de comptage de cellules.

J'utilise OpenCV. Mon plan est d'examiner les fonctionnalités potentiellement utiles pour la discrimination des stomates.

  • Classificateurs de texture
    • DCT (Transformation cosinus discrète / analyse du domaine fréquentiel)
    • LBP (modèles binaires locaux)
  • HOG (Histogramme des gradients orientés)
  • Détecteurs de caractéristiques robustes (je suis sceptique)
    • Coins Harris
    • SIFT, SURF, STAR, etc.
  • Caractéristiques du classificateur de cascade Haar / Viola-Jones

Et éventuellement concevoir un nouveau descripteur de fonctionnalités. Je laisse de côté la sélection d'un classificateur pour l'instant.

Qu'est-ce que j'ai raté? Comment résoudriez-vous cela? Des solutions pour des problèmes similaires de détection d'objets seraient très utiles.

Exemples d'images ici .

stomates

Après le filtre passe-bande: passe-bande filtré

La détection des bords de canny n'est pas prometteuse. Certaines zones d'image sont floues: détection de bord rusé


1
Peut-être qu'au lieu d'essayer de trouver les stomates, vous pourriez essayer de supprimer les lignes labyrinthiques?
endolith

1
Combien d'images devez-vous traiter? À quelle vitesse doit-il être? À quel point doit-il être automatisé?
endolith

1
Cela ne doit pas être très rapide. Nous traitons de l'ordre de 1000 images. Cela devrait être automatique - vider les images dans un répertoire et c'est parti.
Matt M.

Réponses:


15

Désolé, je ne connais pas OpenCV, et c'est plus une étape de prétraitement qu'une réponse complète:

Tout d'abord, vous ne voulez pas de détecteur de bord. Un détecteur de bord convertit les transitions (comme ce sombre-clair):

    _____ / ‾‾‾‾‾

dans des crêtes (lignes claires sur sombres) comme ceci:

    ____ / _____

Il effectue une différenciation, en d'autres termes.

Mais dans vos images, il y a une lumière qui brille dans une direction, ce qui nous montre le relief de la surface 3D. Nous percevons cela comme des lignes et des bords, parce que nous sommes habitués à voir des choses en 3D, mais ils ne le sont pas vraiment, c'est pourquoi les détecteurs de bords ne fonctionnent pas, et la correspondance des modèles ne fonctionnera pas facilement avec des images pivotées (un parfait une correspondance à 0 degrés entraînerait une annulation totale à 180 degrés, car la lumière et l'obscurité s'aligneraient).

Si la hauteur de l'une de ces lignes labyrinthiques ressemble à ceci de côté:

    ____ / _____

alors la fonction de luminosité lorsqu'elle est éclairée d'un côté ressemblera à ceci:

    ____ ∧v ____

C'est ce que vous voyez dans vos images. La surface en regard devient plus claire et la surface arrière devient plus sombre. Vous ne voulez donc pas faire de différence. Vous devez intégrer l'image le long de la direction de l'illumination, et cela vous donnera la carte de la hauteur d'origine de la surface (approximativement). Ensuite, il sera plus facile de faire correspondre les choses, que ce soit via la transformation de Hough ou la correspondance de modèles ou autre.

Je ne sais pas comment automatiser la recherche de la direction de l'éclairage. Si c'est la même chose pour toutes vos images, tant mieux. Sinon, vous devez trouver la plus grande ligne de contraste et supposer que la lumière est perpendiculaire à elle ou quelque chose. Pour mon exemple, j'ai fait pivoter l'image manuellement dans ce que je pensais être la bonne direction, avec une lumière venant de la gauche:

original, tourné

Cependant, vous devez également supprimer tous les changements de basse fréquence dans l'image, pour ne mettre en évidence que les caractéristiques de type ligne qui changent rapidement. Pour éviter les artefacts de sonnerie, j'ai utilisé un flou gaussien 2D, puis je l'ai soustrait de l'original:

passe-haut filtré

L'intégration (somme cumulée) peut s'emballer facilement, ce qui produit des stries horizontales. Je les ai supprimés avec un autre passe-haut gaussien, mais seulement dans le sens horizontal cette fois:

sortie

Maintenant, les stomates sont des ellipses blanches tout autour, au lieu du blanc à certains endroits et du noir à d'autres.

Original:

entrez la description de l'image ici

Intégré:

entrez la description de l'image ici

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 transformée de Hough peut être utilisée pour détecter des ellipses de crête comme celle-ci, constituées de "pixels de bord", bien que cela soit vraiment coûteux en calcul et en mémoire, et ce ne sont pas des ellipses parfaites, donc il faudrait que ce soit un peu un détecteur "bâclé". Je ne l'ai jamais fait, mais il existe de nombreux résultats Google pour la " détection des ellipses ". Je dirais que si vous détectez une ellipse à l'intérieur de l'autre, dans un espace de recherche d'une certaine taille, elle devrait être considérée comme une stomie.

Regarde aussi:


PS Est-ce que ce que j'ai fait ici a un nom? Est-ce un type de filtre commun?
endolith

1
+1 - Excellente réponse! À propos de l'automatisation de l'angle de la source de lumière - vous pouvez utiliser un détecteur de bord qui calcule à la fois la magnitude et le gradient, puis calcule la moyenne pondérée (par mag.) Du gradient. Les réponses les plus fortes doivent être dans le sens de l'éclairage.
Andrey Rubshtein

11

La première chose que j'essaierais est la mise en correspondance des modèles, avec des modèles pivotés pour tous les angles avec une étape. Gabarit rotatif indispensable ici. De plus, le choix du modèle pourrait être non trivial - il pourrait y en avoir plusieurs avec un éclairage différent, et il pourrait être flou pour permettre une différence de forme.

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

Suivant - HOG semble prometteur ici. Une autre solution pourrait être d'utiliser un détecteur de coin puissant comme Moravec ou Shi-Tomasi (avec suppression non maximale) et de rechercher des groupes de 2 ou 3 ou 4 coins sur la même ligne que les candidats. Après avoir trouvé des candidats, vous pouvez appliquer le contour actif pour vérification (vous ne savez pas si cela aiderait vraiment, mais c'est une possibilité)

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

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

Encore une autre possibilité consiste à utiliser la transformation de Hough pour les ellipses, éventuellement avec non pas 2 mais 3-4 paramètres libres.


7

Réponse partielle. Trouver des candidats avec 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]

entrez la description de l'image ici


Résultat intéressant ... peut-être combiner avec un autre régime ...
Matt M.

@MAtt Yep Je pense que jeté au moins 80% de la surface non ciblée. Après avoir un peu dilaté le masque, vous devriez rechercher les ellipses. Quelle que soit la méthode que vous utilisez (je pense toujours à ce que je pourrais faire), il est beaucoup plus facile maintenant que vous savez que les bêtes sont entourées.
Dr belisarius

1

Je commencerais par utiliser un détecteur de bord sensible (par exemple une amplitude de gradient avec un seuil bas), puis j'utiliserais la transformée de Hough pour essayer de trouver les ellipses. Canny pourrait encore fonctionner aussi. Je suis sûr qu'il y a des paramètres que vous pouvez modifier pour le rendre plus sensible et ramasser les bords flous.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.