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
Après seuillage
Comme suggéré par la réponse, j'ai essayé la détection de bord suivante
- Prudent
Trop de bruit et de perturbations indésirables
- Sobel
- Roberts
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?
Réponses:
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:
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:
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:
Cela explique également le "motif de double ligne" dans les résultats du détecteur de bord Canny:
ou, sous forme de matrice:
Quel genre de formes cette approximation de fonction peut-elle avoir? En fait, pas tant que ça:
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:Comme vous pouvez le constater, il n’ya qu’un seul pic pour chaque fine ligne sombre. Binarisation et squelettisation des rendements:
Après la taille du squelette et la suppression des petits composants (bruit) de l'image, j'obtiens ce dernier squelette:
Code Mathematica complet:
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:
la source
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:
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 :
la source
Pour faire suite à l’excellente réponse ci-dessus, voici comment procéder en python à l’aide de fonctions scikit.
la source
img
devrait-il être? J'ai unpng
fichier et ça ne marche pas.i1
c'est la plus grande des valeurs propres, vous devriez donc l'utiliser.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.
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?
la source
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: et ici avec un réglage de paramètre différent, et sans coloration connectée: Pour les détails et les références appropriées, veuillez consulter les messages stackexchange auxquels j'ai fait référence.
la source
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:
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.
la source