Salut la communauté CV / Pattern Recognition,
J'ai un sérieux problème concernant la segmentation d'une image. Le scénario est une atmosphère dans un four qui me rend la tête folle. Et je dois détecter les contours d'objets de différents matériaux (verre, céramique, Al, Ir, ..) en peu de temps (<10 secondes) et pas seulement pour un cas particulier. J'ai également besoin du contour dans une rangée séquentielle de pixels pour le code. Par conséquent, un code de chaîne ou ce que l'on appelle le suivi des frontières / contours est également nécessaire, donc les trous ouverts ne sont pas bons. À l'arrière-plan, des bruits non linéaires, approximativement de poussière, de particules ou quelque chose d'autre, qui apparaissent de temps en temps.
Les suggestions Matlab ou OpenCV sont les bienvenues.
Pour le rendre plus clair, j'ai posté une autre image de mon objectif et un objet semi-transparent, qui doit également être détecté. Aussi d'autres exemples qui doivent être pris en compte.
Comme vous pouvez le voir sur l'image n ° 1, il y a des particules dans la partie droite de l'image et à proximité du contour extérieur de l'étoile, qui est l'objet. De plus, le contraste global n'est pas très bon. L'objet lui-même se trouve sur un sous-sol, ce qui n'est pas pertinent pour la détection de contour. L'image n ° 2 montre un objet semi-transparent, ce qui est également possible.
Je veux trouver le contour / périmètre de cet objet, comme sur l'écran suivant (ligne rouge). Les deux rectangles (jaunes) marquent le point de départ (à gauche) et le point d'arrivée (à droite). La ligne bleue est ignorable.
Au début, je pensais que je pouvais résoudre le problème de cette atmosphère sale avec juste des filtres. Mais après une somme honorable d'investissement en temps, je viens de réaliser que je dois éliminer ou réduire les bruits de manière significative afin d'augmenter le contraste du premier plan et de l'arrière-plan. J'avais essayé beaucoup de méthodes, comme l'égalisation d'histogramme, l'égalisation adaptative Otsu, les filtres linéaires (par exemple gauss), les filtres non linéaires (médiane, diffusion), les contours actifs, les k-Means, les Fuzzy-c-means et aussi Canny pour pure Détection des contours en combinaison avec des opérateurs morphologiques.
- Canny: Les particules et l'atmosphère provoquent des trous, mais j'ai besoin d'un contour complet de l'objet. Toujours avec la fermeture, la dilatation des opérateurs morphologiques ce n'est pas assez bien. Canny a toujours les meilleurs résultats de toutes les méthodes que j'ai étudiées à cause de l'hystérésis.
- Contours actifs: Ils fonctionnent également sur les bords / dégradés, ils agissent complètement fous après l'initialisation à l'intérieur de l'objet, ce qui peut être dû à la carte des bords résultant de l'objet `` ouvert ''. Autant que je sache, le contour doit être fermé. Je l'ai essayé avec différents dérivés (GVF / VFC / Classic Snake).
- k-Means: Les résultats incluent l'atmosphère du four, à cause du fond brumeux. Idem pour les flous-c-moyens. J'ai choisi deux clusters, en raison de la séparation de l'objet de l'arrière-plan. Plus de grappes conduisent à des résultats plus faibles.
- Histogramme / Otsu: En raison des intensités de gris très proches (à mon humble avis!), Il fusionne l'objet avec l'arrière-plan. Je l'ai essayé avec des méthodes locales et mondiales.
- Filtres: en particulier le GLPF ou un autre LPF tache les bords, ce qui n'est pas si bon et ne réduit même pas l'atmosphère brumeuse.
- Les filtres non linéaires préservent les bords. La plupart d'entre eux prennent trop de temps pour calculer les grandes images. A pris un filtre bilatéral rapide pour l'instant. Résultats voir ci-dessous.
Par conséquent, aucune méthode n'est suffisante pour les étapes de post-traitement, car les résultats obtenus du segment d'objet sont médiocres par rapport à un algorithme existant. Cet algorithme existant est très local et fonctionne donc pour ce scénario très spécial.
Je vous demande donc, si j'ai complètement raté quelque chose ... Je ne sais plus comment traiter et comment obtenir de bons résultats de contour, sans lacunes ni trous .. Est-ce possible sans faire beaucoup de changements sur le CCD et l'environnement physique? Merci d'avance!
Dernière approche jusqu'à présent (après une longue nuit d'expériences avec les MO):
- Filtre bilatéral (bord préservant, mais lissant les zones homogènes)
- Canny (Sigma = 2, seuil = [0,04 0,08])
- Opérations Morphologique (MO):
bwareopen
,closing
,remove
&bridge
bwlabel
pour sélectionner uniquement le périmètre du contour, ce qui supprime les bruits indésirables. pas encore de captures d'écran mises à jour, mais cela fonctionne pour la star. le verre a un contour intérieur qui est connecté au contour extérieur, qui peut également être vu sur la capture d'écran ci-dessous.
J'ai donc peur d'avoir besoin d'un algorithme spécial pour la traversée du contour extérieur. Ce sera une recherche de voisinage dans le sens horaire / antihoraire. Cette étape dans le sens horaire / antihoraire peut changer, s'il y a un point d'angle. s'il y a un écart, augmentez le rayon et regardez à nouveau. s'il y a deux ou plusieurs points suivants possibles, prenez celui qui a la même direction que le précédent. Pensez-vous que cet algorithme de suivi de contour a du sens?
Réponses:
Vous pouvez essayer ce qui suit:
Segmentation efficace des images basée sur des graphiques: http://www.cs.brown.edu/~pff/segment/ (code disponible)
Segmentation basée sur GraphCut: http://www.csd.uwo.ca/~olga/OldCode.html (code disponible)
Débruitez d'abord l'image en utilisant des méthodes clairsemées: http://spams-devel.gforge.inria.fr/ (code disponible)
la source
Je pense que vous avez abandonné trop tôt les techniques de seuil. Jetez un œil à votre histogramme, il est clairement tri-modal: (j'ai supprimé manuellement les colonnes blanches à droite de votre image, je suppose qu'elles ne font pas partie de l'image - veuillez prendre cette image avant d'exécuter mon code)
Jetez un œil à toutes les valeurs du premier groupe:
Afin de trouver des modes dans l'histogramme tri-modal, il est possible d'utiliser un regroupement de K-means avec une
K=3
intensité. Le code Matlab suivant trouveth1=67
sur votre code. L'idée est de supposer que vous avez les 3 ensembles et de calculer le centroïde pondéré sur chacun d'eux. Ensuite, chaque niveau d'intensité est affecté à son propre cluster. Vous vous arrêtez lorsque les centroïdes pondérés cessent de bouger. Voici le résultat de la recherche de deux seuils sur votre image, indiqués sur l'histogramme.Résoudre le problème par la suite est un jeu d'enfant, faites simplement quelques opérations morphologiques simples, comme l'ouverture.
la source
imhist
àhist
Comme suggéré ci-dessus, le seuillage peut être très efficace sur cette image, qui est essentiellement binaire, sauf qu'un seuil constant ne suffira pas à cause d'un éclairage inégal. Vous avez besoin d'un seuillage adaptatif.
Mon conseil serait de faire une reconstruction de fond avec un modèle simple (éventuellement planaire [3 DOF] ou quadradique [6 DOF]), en échantillonnant un petit nombre de valeurs dans les régions claires. Le mieux est d'utiliser de petits ROI pour faire la moyenne du bruit. Corrigez ensuite l'ombrage en soustrayant (ou en divisant par) les valeurs d'arrière-plan.
Si l'interaction humaine n'est pas une option, vous pouvez automatiser la recherche de zones d'arrière-plan en commençant par Otsu directement et en considérant des ROI uniformes (faible variance) bien en dessous du seuil. Après une première reconstruction d'arrière-plan, vous pouvez probablement vous améliorer en appliquant ce processus à l'image corrigée à plat.
L'ensemble du processus peut être mis en œuvre pour fonctionner bien en dessous d'une seconde.
la source
Je pense que la meilleure façon est d'utiliser les contours actifs. Si vous ne savez pas quels sont les contours actifs, regardez cette vidéo sur youtube http://www.youtube.com/watch?v=ijNe7f3QVdA
Fondamentalement, vous devez donner une segmentation d'initialisation et cela améliorera la forme. Ma suggestion est de l'une des méthodes discutées sur ce poste et d'utiliser les contours actifs comme une 2ème étape, c'est-à-dire. comme une étape d'amélioration.
Voici une implémentation de contours actifs que vous pouvez utiliser http://www.mathworks.com/matlabcentral/fileexchange/19567
la source
Vous savez clairement de quoi vous parlez, mais vous n'avez pas mentionné l'utilisation du seuillage, en particulier avez-vous essayé d'appliquer un seuil global à l'aide d'Otsu pour calculer le bon niveau, puis de trouver les contours et de sélectionner le plus grand?
[Modifier pour clarifier]
Le seuil global ne fonctionnera évidemment pas en raison du graident visible à travers l'image.
J'ai eu un jeu rapide avec cela et je trouve que si vous divisez l'image en 6 morceaux (2 rangées de 3 colonnes de taille égale), puis effectuez un seuillage en utilisant Otsu sur chacun puis réassemblez, cela fait un joli travail de dieu pour nettoyer le image.
Il y a encore quelques artefacts mineurs sur la partie supérieure droite de l'étoile.
Il me semble que puisque l'objet a des limites de ligne droite, vous voudrez peut-être envisager une transformation de Hough pour extraire ces bords, les intersecter pour localiser les sommets et utiliser le résultat comme contour de votre objet.
la source
Les contours sont-ils toujours des lignes droites ou des courbes connues?
Si c'est le cas, plutôt que d'essayer de corriger chaque pixel le long du bord, j'utiliserais des transformations de Hough pour obtenir les équations des lignes, puis recréer les contours à partir des lignes et des sections.
la source