mauvais effets de seuil adaptatif binarisation

voix
5

Je mis en œuvre des méthodes de binarisation adaptatif, ils utilisent une petite fenêtre et à chaque pixel on calcule la valeur de seuil. Il y a des problèmes avec ces méthodes: Si nous choisissons la taille de la fenêtre trop petite , nous allons obtenir cet effet (je pense que la raison est en raison de la taille de la fenêtre est petite) alt texte http://i.piccy.info/i4/3d/bc /773b7df74ff7dadfd11c09372b7e.jpeg

Dans le coin supérieur gauche il y a une image originale, coin supérieur droit - résultat global de seuil. En bas à gauche - par exemple de diviser l'image à certaines parties (mais je parle l'analyse de petit pixel de l'image de l'entoure, par exemple fenêtre de 10x10). Ainsi, vous pouvez voir le résultat de ces algorithmes à l'image en bas à droite, nous avons une zone noire, mais il doit être blanc. Quelqu'un sait-il comment améliorer un algorithme pour résoudre ce problème?

Créé 17/02/2010 à 16:17
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
2

Il shpuld être tout à fait beaucoup de recherches en cours dans ce domaine, mais malheureusement je n'ai pas de bons liens pour donner.

Une idée qui pourrait fonctionner, mais je ne l'ai pas testé, puis retirez est d'essayer d'estimer les variations d'éclairage avant seuillage (ce qui est un meilleur terme que « binarisation »). Le problème est ensuite déplacé de seuillage adaptatif pour trouver un bon modèle d'éclairage.

Si vous savez quoi que ce soit au sujet des sources de lumière, vous pouvez bien sûr construire un modèle de cela.

Sinon, un hack qui pourrait fonctionner est d'appliquer un filtre passe-bas vraiment lourd à votre image (rendre floue) puis de les utiliser comme modèle d'éclairage. Ensuite, créez une image de différence entre l'original et la version floue et seuil.

EDIT : Après un test rapide, il semble que mon « hack » ne va pas vraiment travailler du tout. Après avoir réfléchi à ce que je ne suis pas très surpris non plus :)

I = someImage
Ib = blur(I, 'a lot!')
Idiff = I - Idiff
It = threshold(Idiff, 'some global threshold')

EDIT 2 Vous avez une autre idée qui pourrait fonctionner selon la façon dont sont générés vos images. Essayez l' estimation du modèle d'éclairage à partir des premières lignes de l'image:

  1. Prenez les premières lignes N dans l'image
  2. Créer une ligne moyenne à partir des lignes N collectées. Vous savez avoir une ligne comme modèle d'arrière-plan.
  3. Pour chaque ligne de l'image soustraire la ligne de modèle d'arrière-plan (la ligne moyenne).
  4. Seuil de l'image résultante.

Malheureusement, je suis à la maison sans de bons outils pour tester.

Créé 17/02/2010 à 18:31
source utilisateur

voix
2

On dirait que vous faites mal de seuillage adaptatif. Vos images comme si vous divisez votre image en petits blocs, un seuil calculé pour chaque bloc et appliqué ce seuil au bloc entier. Cela expliquerait les artefacts de la « boîte ». Habituellement, les moyens de seuillage adaptatif trouver un seuil pour chaque pixel séparément, avec une fenêtre séparée centrée autour du pixel.

Une autre suggestion serait de construire un modèle global pour votre éclairage: Dans votre exemple d'image, je suis sûr que vous pourriez adapter un plan (X / Y / espace Luminosité) à l'image en utilisant des moindres carrés, puis séparer les pixels en pixels lumineux (premier plan) et plus foncée que celle plan (arrière-plan). Vous pouvez ensuite adapter des plans séparés à l'arrière-plan et les pixels de premier plan, le seuil en utilisant la moyenne entre ces plans encore et améliorer la segmentation de manière itérative. Dans quelle mesure cela pourrait fonctionner dans la pratique dépend de la façon dont votre foudre peut être modélisé avec un modèle linéaire.

Si les objets réels que vous essayez de segmenter sont « plus mince » (vous avez dit quelque chose au sujet des codes-barres dans un commentaire), vous pouvez essayer une opération d'ouverture / fermeture simple, l'obtenir un modèle d'éclairage. (C.-à fermer l'image pour supprimer les pixels de premier plan, puis utilisez [image fermée + X] comme seuil).

Ou bien, vous pouvez essayer de filtrage moyen-shift pour obtenir les pixels de premier plan et arrière-plan à la même luminosité. (Personnellement, je vais essayer qu'un premier)

Créé 20/02/2010 à 07:49
source utilisateur

voix
1

Vous avez très éclairage non uniforme et objet assez grand (donc, aucun moyen facile universel pour extraire l'arrière-plan et corriger la non-uniformité). Cela signifie essentiellement que vous ne pouvez pas utiliser seuillage global du tout, vous avez besoin seuillage adaptatif.

Vous voulez essayer Niblack binarisation. Code Matlab est disponible ici http://www.uio.no/studier/emner/matnat/ifi/INF3300/h06/undervisningsmateriale/week-36-2006-solution.pdf (page 4). Il y a deux paramètres que vous aurez à régler la main: taille de la fenêtre (N dans le code ci - dessus) et le poids.

Créé 25/02/2010 à 16:10
source utilisateur

voix
1

Essayez d'appliquer un seuil adaptatif local en utilisant cette procédure:

  1. convoluer l'image avec un moyen ou un filtre médian
  2. soustraire l'image d'origine à partir d'une convolution
  3. le seuil d'image de différence

Procédé de seuil adaptatif locale sélectionne un seuil individuel pour chaque pixel.

J'utilise cette approche extensive et il fonctionne très bien avec des images ayant fond non uniforme.

Créé 01/10/2010 à 11:07
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more