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 .
Après le filtre passe-bande:
La détection des bords de canny n'est pas prometteuse. Certaines zones d'image sont floues:
la source
Réponses:
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:
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:
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:
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:
Maintenant, les stomates sont des ellipses blanches tout autour, au lieu du blanc à certains endroits et du noir à d'autres.
Original:
Intégré:
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:
la source
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.
la source
Réponse partielle. Trouver des candidats avec Mathematica:
la source
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.
la source