Comment supprimer certains arrière-plans de l'image?

11

Orange

C'était l'image obtenue après le filtrage de Gabor ... Existe-t-il un moyen de supprimer les lignes à l'intérieur de l'image à l'exception du défaut arrondi blanc brillant.

J'ai essayé une autre orientation du filtre gabor pour obtenir le résultat suivant:

entrez la description de l'image ici

Après seuillage: ce qui est correct mais pas génial

entrez la description de l'image ici

Après filtrage médian:

entrez la description de l'image ici

Merci d'avance

vini
la source
2
Bon travail avec le filtre médian. Vous êtes bien sur votre chemin.
Rethunk
Cela semble être un bon scénario pour appliquer un filtre de diffusion. Aussi, essayez de demander à: <br/> dsp.stackexchange.com/ <br> photo.stackexchange.com/ <br>
Danny Varod
Avez-vous appliqué le filtre médian après le seuil? Si oui, essayez-le sans seuil.
Danny Varod du
Oui, je l'ai essayé après le seuillage et j'ai obtenu presque le même résultat quand je l'ai fait auparavant aussi
vini

Réponses:

12

Si la sortie de votre filtre Gábor est fiable et que la variation de vos données d'image n'est pas si élevée que le résultat semble complètement différent, alors vous pouvez utiliser l'approche suivante (certaines parties de celle-ci ont déjà été mentionnées):

  1. Binarisez votre deuxième image avec n'importe quel algorithme de seuillage automatique. La gamme de seuils qui fonctionnera est grande comme vous le verrez.

  2. Utilisez un algorithme d'étiquetage des composants pour étiqueter chaque région de pixel connectée avec une valeur unique.

  3. Calculez pour chaque composant de votre image une propriété qui décrit la proximité de votre objet avec un cercle plein. Pour cela, vous pouvez utiliser par exemple la compacité . J'ai utilisé ci-dessous la fraction de pixels dans le rayon de disque équivalent . Ce rayon est le rayon d'un disque avec la même zone que votre objet aurait.

    1. La zone compte simplement le nombre de pixels de votre objet
    2. Le calcul du rayon d'un cercle étant donné sa superficie devrait également être gérable
    3. Pour le pixel à l'intérieur de ce rayon, vous avez besoin du centre de chaque objet image, mais ce n'est que la moyenne de toutes les positions des objets-pixels. Si vous êtes physicien, vous connaissez le centre de masse de plusieurs masses ponctuelles. C'est équivalent.
    4. Maintenant, vous calculez pour chaque pixel de chaque objet la distance de son centre et vérifiez s'il est plus petit que le rayon du cercle. En divisant les deux nombres, vous obtenez la fraction de pixels intérieurs et extérieurs.
  4. Prenez l'objet avec la fraction la plus élevée. Remarque: les objets avec un seul pixel obtiendront une valeur de 1. Vous devez donc définir un seuil de taille et ne prendre que des objets plus grands, disons 10 pixels.

Pour voir qu'une binarisation automatique devrait fonctionner, voici les résultats pour un seuil très bas et très haut:

entrez la description de l'image ici entrez la description de l'image ici

Mettre à jour l'étiquetage des composants

Le choix de l'étiquetage des composants n'est pas critique pour votre application. Je suggérerais, si vous devez l'implémenter par vous-même, d'utiliser une méthode très simple. La version en un seul passage du site Wikipedia est très simple. Fondamentalement, vous parcourez votre image binaire et lorsque vous rencontrez un pixel qui est blanc et n'est pas déjà étiqueté, vous utilisez une nouvelle étiquette pour cet objet et commencez par ce pixel.

Le processus d'étiquetage de cet objet avec une étiquette est fondamentalement similaire à un remplissage d'inondation. C'est sur le site Wikipedia les étapes internes 1-4 de l'algorithme. Vous commencez avec ce pixel étiqueté et mettez tous ses voisins sur une pile (ils ont utilisé un vecteur ). Pour un pixel sur la pile, vous vérifiez s'il est au premier plan et n'est pas déjà étiqueté. Si vous devez l'étiqueter, vous remettez tous ses voisins sur la pile. Faites-le jusqu'à ce que votre pile soit vide.

Ensuite, vous poursuivez votre numérisation à travers l'image. Contrairement à la description sur le site Wiki, vous n'avez pas à supprimer un pixel de votre image d'origine, vous sautez simplement lorsque vous avez une valeur différente de 0 dans votre image d'étiquette.

halirutan
la source
à quel algorithme d'étiquetage compnent vous référez-vous ici?
vini
1
@vini, j'ai mis à jour mon message. Phonon, merci. Nous utilisons beaucoup de mesures morphologiques et surtout la compacité était très utile il y a quelque temps.
yup grand l'a eu :)
vini
6

Quelques idées:

  1. Filtrer les bords en fonction de la densité des forces des bords. En utilisant une approximation d'un noyau circulaire, trouvez la force moyenne du bord (ou une autre mesure). Traversez tous les bords à ou au-dessus de la valeur de seuil, définissez sur noir tous les bords en dessous du seuil.
  2. Utilisez une opération morphologique de «fermeture» (dilatation suivie d'une érosion) pour nettoyer l'image, puis utilisez un algorithme d'étiquetage de région (aka composant connecté, blobs) pour trouver tous les blobs. Filtrer les données d'objets blob en fonction de la taille, du rapport des axes majeurs aux axes mineurs, etc.
  3. Essayez le flou gaussien, trouvez un seuil de binarisation pour segmenter la lumière de l'obscurité, puis filtrez les taches comme décrit à l'étape 2 ci-dessus. (Pour une approximation rapide d'un flou gaussien, serrez la plupart du temps vos paupières fermées et plissez les yeux sur l'image.)
  4. Essayez quelques filtres dans Photoshop ou GIMP.

EDIT: après votre étape de filtrage médian, vous y êtes presque. Bon travail! Le point 2 que j'ai suggéré ci-dessus (fermer, puis étiquetage de la région) est une technique pour vous emmener le reste du chemin.

Repenser
la source
yup va essayer qui vous permettra de savoir ce qui se passe
vini
1

Vous pouvez essayer des contours actifs. Bien qu'il soit peut-être lent, il peut gérer des cas compliqués comme celui-ci.

Ou vous pouvez utiliser certaines connaissances préalables pour traiter cette image. Par exemple, vous savez que le blob est «gros» et «connecté». Ainsi, lorsque vous comptez le nombre de chaque région connectée, vous pouvez le trouver.

piège
la source