Meilleur moyen de segmenter les veines dans les feuilles?

47

J'ai effectué de nombreuses recherches et découvert des méthodes telles que le seuillage adaptatif, les bassins versants, etc., qui peuvent être utilisées pour détecter les veines dans les feuilles. Cependant, le seuillage n'est pas bon car il introduit beaucoup de bruit

Toutes mes images sont en gris. S'il vous plaît, quelqu'un pourrait-il suggérer les approches à adopter tout en considérant ce problème avec un besoin urgent d'aide

EDIT: Mon image d'origine

entrez la description de l'image ici

Après seuillage

entrez la description de l'image ici

Comme suggéré par la réponse, j'ai essayé la détection de bord suivante

  1. Prudent

Trop de bruit et de perturbations indésirables

entrez la description de l'image ici

  1. Sobel

entrez la description de l'image ici

  1. Roberts

entrez la description de l'image ici

EDIT: Essayé une opération de plus, j’obtiens le résultat suivant, c’est mieux que ce que j’ai essayé avec Canny et Adaptive. Que ressentez-vous?

entrez la description de l'image ici

vini
la source
Pourriez-vous s'il vous plaît nous montrer quelques images?
Jonas
J'ai ajouté des images
vini
@vini Faites-vous actuellement cela en tant qu'étape de pré-traitement afin d'obtenir un bon modèle correspondant ultérieurement? Aussi, comment avez-vous obtenu la deuxième image, par simple seuillage?
Spacey
Mon objectif est d'obtenir le meilleur résultat possible en segmentant les veines de manière à ce que ma sortie ne contienne pas d'artefacts égarés. J'ai utilisé le seuillage adaptatif pour obtenir la deuxième image
vini
D'après les images que vous avez données, il semble que vous utilisiez (divers) filtres sur une image à seuil. Cela donnera des résultats extrêmement pauvres. Vous devez utiliser les filtres sur l' image d' origine , puis définir un seuil de sortie.
Benjohn

Réponses:

56

Vous ne recherchez pas de bords (= bordures entre les zones étendues de gris haut et bas), vous recherchez des crêtes (lignes fines plus sombres ou plus claires que leur voisinage), de sorte que les filtres de bord ne sont peut-être pas idéaux: un filtre de bord sera vous donner deux flancs (un de chaque côté de la ligne) et une réponse faible au milieu de la ligne:

filtrer les échantillons

AJOUTER : Si vous avez été invité à expliquer plus clairement la différence entre un détecteur de bord et un détecteur de crête. Je m'excuse par avance si cette réponse est très longue.

Un détecteur de bord est (généralement) un premier opérateur dérivé: Si vous imaginez l'image d'entrée en tant que paysage 3D, un détecteur de bord mesure l'inclinaison de la pente en chaque point de ce paysage:

entrez la description de l'image ici

Si vous souhaitez détecter la bordure d'une région claire ou sombre étendue, c'est très bien. Mais pour les veines dans l'image du PO, cela vous donnera exactement la même chose: les contours gauche et droit de chaque veine:

entrez la description de l'image ici

Cela explique également le "motif de double ligne" dans les résultats du détecteur de bord Canny:

entrez la description de l'image ici

gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

ou, sous forme de matrice:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

(2gx22gxy2gxy2gy2)

λ1x2+λ2y2λ1λ2

Quel genre de formes cette approximation de fonction peut-elle avoir? En fait, pas tant que ça:

entrez la description de l'image ici

Pour détecter des crêtes, nous souhaitons trouver dans l'image des zones qui ressemblent à la dernière des parcelles ci-dessus. Nous recherchons donc des zones dans lesquelles la valeur propre principale de la Hesse est grande (par rapport à la valeur propre mineure). Le moyen le plus simple de détecter cela consiste simplement à calculer la valeur propre principale de chaque pixel - et c'est ce que fait le filtre de crête ci-dessous.


Un filtre à crête donnera probablement de meilleurs résultats. J'ai essayé Mathematica intégré RidgeFilter(qui calcule la valeur propre majeure de la matrice de Hesse à chaque pixel) sur votre image:

filtre d'arête

Comme vous pouvez le constater, il n’ya qu’un seul pic pour chaque fine ligne sombre. Binarisation et squelettisation des rendements:

entrez la description de l'image ici

Après la taille du squelette et la suppression des petits composants (bruit) de l'image, j'obtiens ce dernier squelette:

entrez la description de l'image ici

Code Mathematica complet:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

AJOUTER:

Je ne suis pas un expert de Matlab, je ne sais pas s'il possède un filtre d'arête intégré, mais je peux vous montrer comment le mettre en œuvre "à la main" (encore une fois, en utilisant Matematica). Comme je l'ai dit, le filtre de crête est la valeur propre principale de la matrice de Hesse. Je peux calculer cette valeur propre symboliquement dans Mathematica:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

HxxHxyHyy

Niki Estner
la source
Oui c'est exactement ce que je veux mais je le fais dans Matlab et trouver un équivalent du filtre de crête est devenu difficile
Vini
1
@nikie Très bonne réponse - question - pouvez-vous préciser la différence entre un détecteur de bord et un détecteur de crête pour nous, non-spécialistes du traitement d'images? Merci encore
Spacey
@Mohammad: J'ai essayé, j'espère avoir été un peu plus clair maintenant, malgré les calculs
Niki Estner
J'ai essayé le filtre de crête ne donne pas de résultats satisfaisants
vini
2
@vini: "ne donne pas de résultats satisfaisants" ne me dit pas grand chose. Obtenez-vous la même image de résultat que celle que j'ai postée? Qu'est-ce qui n'est "pas satisfaisant"?
Niki Estner
6

Lorsque j'utilise la détection de bord Canny (dans Halcon), avec alpha égal à 1, ainsi qu'au seuil bas 8 et au seuil haut 13 (sur une échelle de 1-255), j'obtiens le résultat suivant:

Feuille de détection de bord canny

En peaufinant les paramètres, le résultat obtenu par Canny peut être encore amélioré. En utilisant cette image, vous pouvez ignorer les bords courts pour supprimer le bruit et connecter les bords longs pour obtenir le résultat final.

BTW: une couleur différente indique un bord différent.

Je peux obtenir un résultat assez similaire avec ce détecteur de bord Canny en ligne :

  • Choisissez une image I9Pxl.png
  • Sigma 1.2
  • T-bas 0,04
  • T-haut 0,07
  • Autres paramètres par défaut
  • Cliquez sur la vue de mise à jour pour le résultat
Geerten
la source
Merci :) Je suppose que Canny est tout simplement le meilleur;) Btw, appliquer Canny sur votre résultat pourrait donner des résultats encore meilleurs ..
Geerten
BTW: Si vous n'avez pas remarqué: Quelles sont les limites d'un détecteur de bord Canny? Vous pouvez donner votre avis ici!
Dipan Mehta
Si vous me dites: j'ai déjà exprimé mon point de vue sur votre question ... Si vous faites un commentaire en général: je vais supprimer ce commentaire.
Geerten
Oh oui, je ne m'en suis pas rendu compte!
Dipan Mehta
Merci pour votre réponse, cependant, prudent ne conserve pas les détails des nervures dans les feuilles qui ne sont pas détectés comme vous l'avez montré ...
vini
6

Pour faire suite à l’excellente réponse ci-dessus, voici comment procéder en python à l’aide de fonctions scikit.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)
Matthew Shun-Shin
la source
Que imgdevrait-il être? J'ai un pngfichier et ça ne marche pas.
Sigur
img devrait être un tableau 2d numpy.
Matthew Shun-Shin
En fait, i1c'est la plus grande des valeurs propres, vous devriez donc l'utiliser.
Rob
C'est l'explication la plus claire que j'ai jamais vue!
Eureka
3

Au lieu du seuillage, j'ai appliqué la détection de bord simple.

Utilisé GIMP avec différence de Gaussian - Radious Outer: 3.0 et Inner: 1.0.

Ici c'est comment ça ressemble.

entrez la description de l'image ici

Vous pouvez en outre appliquer un filtre médian ou une érosion / dilatation afin de pouvoir éliminer une partie du bruit granuleux.

Voici la page qui explique la mise en œuvre de gimp.

Vous devriez vous référer à différentes techniques comme le laplacien de gaussien ou la différence de Gaussin, etc. Voir ceci: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

Et cette réponse Comment le laplacien est-il utilisé pour le masque flou?

Dipan Mehta
la source
GIMP? est quel détecteur de bord?
vini
1
Non - c'est un package de retouche d'image. C'était une vérification rapide - juste pour avancer d'un point - utilisez la détection de bord par opposition au seuillage.
Dipan Mehta
Quel détecteur de bord est utilisé par GIMP? Je suis désolé, j'ai très peu de connaissances à ce sujet
vini
@vini a ajouté une référence.
Dipan Mehta
3

Ce sujet a toujours suscité beaucoup d’intérêt et pourtant, il n’existe pas de réel consensus. J'ai donc décidé de laisser tomber quelques mots.

Mes réponses à des questions similaires précédemment posées sur stackexchange ( Q1 et Q2 ) impliquaient un algorithme d'extraction de structure curviligne sous-pixel par Steger. Cette méthode a fonctionné assez bien dans de nombreux cas et heureusement, y compris celui-ci. Par conséquent, je poste l’image de sortie ici: entrez la description de l'image ici et ici avec un réglage de paramètre différent, et sans coloration connectée: entrez la description de l'image ici Pour les détails et les références appropriées, veuillez consulter les messages stackexchange auxquels j'ai fait référence.

Tolga Birdal
la source
0

Dans le cadre de ma dernière année d'études d'ingénieur, j'ai dû étudier les méthodes de segmentation des vaisseaux sanguins dans les images du fond d'œil. J'ai trouvé cette méthode de reconstruction d'arbres (par Cohen, Laurent D. et Mille, Julien particulièrement intéressante à utiliser avec les méthodes de marche rapide.

Autres documents que vous voudrez peut-être examiner:

  • Contours actifs géodésiques
  • Mise en oeuvre de méthodes de défilement rapide pour les réseaux 3D
  • Multistencils FMM: une solution très précise à l'équation Eikonal sur les domaines cartésiens

Liens utiles: - Propagation frontale en 2D et 3D

J'espère que cela aide un peu, même si ce n'est pas exactement à la pointe de la technologie.

Nomaru
la source