# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Seuillage pour binarisation d'image

## zolotaya

Bonjour, 
Je cherche un algorithme simple me permettant de trouv le seuil optimal pour une binarisation d'image.
J'tais partis sur cet algo la : http://www.tsi.enst.fr/tsi/enseignem...a/isodata.html
mais je n'ai pas trop les rsultats esprs. (une erreur de codage n'est pas impossible mais j'ai dj vrifi plusieurs foies et je n'en ai pas vu...)
Serait'il possible d'avoir votre avis sur ce dernier et eventuellement m'orient vers un algo meilleur.

----------


## riadh_ado

> Je cherche un algorithme simple me permettant de trouv le seuil optimal pour une binarisation d'image.



 Ce que tu dois comprendre est qu'il n'y a pas un seuil optimal ! Car tout dpend de l'image a binaris. Mais je peut te renseign sur les diffrentes mthode de seuillage
1.Seuillage globale
2.Seuillage locale
3.Seuillage dynamique
4.Seuillage par minimisation de variance
5.Seuillage entropique
6.Seuillage par classification bayesienne
7.Seuillage par mthodes locales adaptatives
8.Seuillage par ligne de partage des eaux
9.............
Donc plusieurs mthodes existent mais aucune ne peut pas donn un seuillage optimale (ce qui vous souhaitez !) 
[FONT=Times New Roman] ::yaisse2::  A+[/FONT]

----------


## zolotaya

La ce serait pour un seuillage global.
Jusque la, je prennais l'image et je la passe en niveaux de gris afin d'obtenir l'histogramme de cette derniere et faire mon seuillage  partir de celui ci.
J'ai trouv plusieurs algos mais j'en cherche un rapide, simple  mettre en oeuvre et efficace si possible.

----------


## riadh_ado

Dificile a te repondre, mais si l'histogramme est bimodale tu peut appliqu l'algorithme qui tu as fait dans  (http://www.tsi.enst.fr/tsi/enseignem...a/isodata.html)aprs un lissage par un filtre gaussienne.

----------


## poukill

> Dificile a te repondre, mais si l'histogramme est bimodale tu peut appliqu l'algorithme qui tu as fait dans  (http://www.tsi.enst.fr/tsi/enseignem...a/isodata.html)aprs un lissage par un filtre gaussienne.


+1
C'est exact.
bi - modal est toujours plus facile.  :;):

----------


## mm2405

Bonjour, 
j'ai retrouv a, a doit correspondre  ce que tu cherches je crois. Par contre, je n'ai pas eu le temps de re tester le code mais a fonctionnait  l'poque.



```

```

Pour moi, Image est une structure : 



```

```

Ce code est un peu vieux, c'tait mes dbuts en traitement d'image. Il y a surement moyen de l'optimiser.....

----------


## zolotaya

> +1
> C'est exact.
> bi - modal est toujours plus facile.


La le problme pour mon histo Bi-modale est que j'ai beaucoup de bruit ce qui signifie que mon intervalle des valeurs non nul est super grand (souvent entre 0 et 255 ) alors que mes 2 classes sont super rapproches (j'ai une images ou mes 2 piques sont  8 et 44 ) 
Lorsque j'applique l'algos trouv, il vas me diviser mon histo en 2 parties avec un seuil initiale  128 et faire les moyennes  partir de ce seuil pour finir pas m'en trouv un beaucoup trop haut  141...
 votre avis une erreur de codage est possible ou le problme est due aux valeurs initiales? (ou les 2?)

----------


## parp1

Et bien peut etre qu'un Prtraitement comme une rosion... Peux tu faire un pr traitement avant ton seuillage par hsitogramme.

----------


## pseudocode

Sinon tu peut faire un k-mean a 2 regions. Apres tout, l'iso-data et le k-mean se ressemblent beaucoup...

----------


## zolotaya

J'avais dja essayer de faire une fermeture comme pr traitement mais cela ne m'a rien donner de bon (du moin pour ce que je voulais).
La j'ai essay une convolution afin de lisser un peu mon image mais je pense qu'il vas falloir que je revoie mon filtre car les rsultats sont plutot bizar... 
(je vais peu etre devoir reecrire une formule de convolution car je pense que celle que j'utilise y est pour beaucoup ...)

----------


## ol9245

> La le problme pour mon histo Bi-modale est que j'ai beaucoup de bruit ce qui signifie que mon intervalle des valeurs non nul est super grand (souvent entre 0 et 255 ) alors que mes 2 classes sont super rapproches (j'ai une images ou mes 2 piques sont  8 et 44 ) 
> Lorsque j'applique l'algos trouv, il vas me diviser mon histo en 2 parties avec un seuil initiale  128 et faire les moyennes  partir de ce seuil pour finir pas m'en trouv un beaucoup trop haut  141...
>  votre avis une erreur de codage est possible ou le problme est due aux valeurs initiales? (ou les 2?)


Est-ce que tu as Photoshop ? sinon ImageJ qui est opensource. Pour du traitement d'image, j'aime bien jouer avec l'image d'abord dans un environnement confortable qui me permet d'essayer beaucoup de solutionss. quand j'ai une stratgie qui marche, je peux la coder en dur. (et mme avant a, je fais une maquette (dans mon cas ave PhotoShop) sous forme de script que je teste intensivement sur d'autres images.

Tout a pour dire que seuillage, floutage, dbruitage, et extraction d'histogramme sont des mthodes faciles  tester avec tohop ou imagej.

OL

----------


## poukill

ou matlab... c'est trs bien aussi !  :;):

----------


## zolotaya

Je code directement en JAVA vu que c'est pour une appli JAVA.
Sinon mon problme de bruit n'est pas rsolu, car meme aprs filtrage mes points blanc sur fond noir virent au gris, alors que la rgion que je veux "rendre blanche" et qui est dja pas mal fonce d'origine, l'est encore plus...

Quelqu'un connait'il un algo de dtction des modes dans un histogramme?

----------


## parp1

Peut tu nous joindre une image.

Peut etre qu'une simple convolution par le noyaux



```

```

Peut deja bien aider?

----------


## zolotaya

voila l'image :


j'ai deja essayer un masque ( 1 1 1 / 1 2 1 / 1 1 1 ) et un masque ( 1 1 1 / 1 1 1 / 1 1 1 ). 
Il y a deux "problmes".
Le premier est qu'il ne faut pas (ou le moin possible) que je touche aux fronts des barres.
Le deuxieme est qu'une dtction des rgion n'est pas possible. Sur certaines images le haut des codes  barres touches des grosses rgions noir. Il me detecte donc que quelques barres.
J'ai commancer  rflchir sur une ventuelle dtction des contours, mais ca s'annonce chian aprs pour rcuprer la tailles des barres aprs...

----------


## parp1

Je te met ce que j'arrive a sortir.

Tout d'abords j'ai appliquer un Rolling Ball de 50 de large pour soustraire le fond. (A optimiser)
--> premiere Image

Ensuite un seuil double (j'ai oublier les valeurs ... mais elle n'taient optimises)

--> image.

Ensuite j'imagine qu'il va falloir faire de la reconnaissance de caracteres... Bon courage.

[Edit]J'ai essayer un truc tout Bete.... l'talement d'histogramme+ une amlioration de contraste de +0.5%_(Process --> EnhanceContrast sous ImageJ (Option par defaut juste avec Equalize Histogramme de valid)_, et juste avec un seuillage j'obtient la troisieme image.
Un coup de morpho et le probleme est rgl.  :;): [/edit]

----------


## zolotaya

tu peux essayer la meme chose avec cette image la ?

http://img504.imageshack.us/img504/1...arcode3vc9.jpg
(Mon pb est que lorsque ca marche avec l'une, ca marche pas avec l'autre...)

Sinon c'est quoi un Rolling Ball? tu as fait comment ton tirement d'histogramme car sur l'image il y a des valeurs allant de 0  255... ?

----------


## parp1

Un rolling bAll est un algorythme de soustraction de fond. 



> tu as fait comment ton tirement d'histogramme car sur l'image il y a des valeurs allant de 0  255... ?


En thorie Oui. Mais par exemple sur ton image les valeur les plus basse ne sont pas a zero... le truc consiste a remanier l'histogramme en disant...

La plus petite valeur Acquise = 0
La plus Grande valeur acquise = 255. C'est un bete calcul de pente...
Tu devrais trouver plein d'aglo deja tout fait.  :;): 

tu peux trouver des sources en C, Cherche un sujet dans ce forum intitul : Fermeture des contours.

Le resultat ici est moin bon mais tout a fait exploitable.

Il suffis que tu fasse une ouverture avec une element structurant de ce type et de grande taille si possible. J'ai d'abord passe l'image en Grey Level 8 Bits.



```

```

Mais je ne sais pas ce que tu obtenais avant ... donc je ne sais pas si c'est mieu ou non. Est ce que seul la largeur des barre t'interesse... je pense qu oui car c'est la dedans qu'est stocke l'info il me semble....

----------


## zolotaya

Pour la deuxieme image j'obtenais quelque chose de similaire mais en noir et blanc...

Et oui seul la largeur des barres m'intersse mais ca normalement c'est bon^^

Sinon le truc c'est que normalement je recois l'image scanne (l'une ou l'autre voir des pires ) et je dois ressortir la valeurs du code  barres. Tout le reste doit se faire tout seul --> d'ou mon dpard sur le seuillage adaptatif...
Autrement que ce soit une image ou l'autre, le traitement  effectuer doit toujours etre le mme ou tout du moin automatisable --> mon pb actuellement!
Sinon j'ai regarder pour le rolling ball, les paramtres doivent pouvoir etre dfini en changent d'espace colorimtrique et en recherchant le taux de luminosite et tt mais bon ... Grosse prise de tte en perspective...
Sauf si quelqu'un  une ide ...

----------


## parp1

Mais a tu une ide de la source dont provienne tes Images... Est ce des codes barre tjr identique?

Ou bien des code barres pris au hasard d'un peu partout?

Je sais que l'idal serait que ton programme fonctionne avec n'importe quelle image.


Un truc encore plus simple. Apres une Amelioration de contraste essaie de faire un soustraction du genre:
Faire le Dilat d'une image moins celle ci.

Dilate(Image)-Image

Tu devrais obtenir le contour de ton image. Reste plus cas faire un remplissage de trous.

Je suis septique sur cette piste. Mais essaie.


Bon je suis en Week End j'espere que lundi tu auras du nouveau.


Juste une derniere chose. L'talage de l'histogramme et l'amlioration est robuste puisqu'il depend que de l'image. Donc ca vu les resultats je pense qu'il faut l'exploiter. Je ne sais pas si tu connais le seuil Entropique.?

Moi c'est un seuil que j'utilise parfois pour du seuillage auto, mais je crains que ca ne soit pas exploitable pour de la recherche de caractere. mais faut Tester c'est facile a implmenter. Sinon tu a un plugin pour ImageJ.  :;):  Bon courage.

----------


## zolotaya

Les codes  barres proviennent de lames de microscopes et non ils ne sont pas tous identiques... Il dependent des frabriquants de lames ou des machines mettant les donnes sur les lames... Ils peuvent donc etre sur etiquettes / directement sur la lames / de coululeurs diffrentes...

En plus de ca, la nettetais de l'image dpend de la qualit du scan effctu (je peux avoir des images 40 * plus grande que la premiere ) avec des signaux (luminosite) faible / forte , avec contraste lev ou pas ... enfin un peu chian quoi mais je pourrais peu etre reussir  reuprer ces infos (ca c pas sur).

Sur ce bon week end.

----------


## ol9245

D'aprs ce que tu dis, tu as besoin juste de lire le code barre. Donc tu n'as pas besoin exactement de nettoyer ton image etc. Ce que tu ass besoin, c'st de rcuprer le sigal du code en 1D. 

Si j'ai bien devin, alors ton prob se rsoud ++ facilement :
- pas besoin de nettoyer l'image.
- pas besoin de calculer l'histo

l'algo serait le suivant :

1/ trouver ou sont les codes barres dans l'image.
un code barre, c'est une zone de l'image ou chaque ligne est trs proche de ses voisines. En calculant une resemblance entrre deux lignes successives puis en slectionnait la zone qui contient le plus grand nombre de lignes continuement ressemblantes entre elles, tu rcupre la zone des codes barres.

2/ Slectionner une zone d'intrt : par exemple, une fois que tu as dtecter ta zoone de code, tu te limite au 1/3 central et tu jettes le reste;

3/ extraire le code lui-mme.
intuitivement je pense  la mdiane le long de chaque colonne. Si tes codes barre sont assez bien aligns sur l'horizontale, a marchera au petits oignons. Sinon, il faut redresser l'image. Pour cela, rechercher les contours verticaux.

Voila des pistes. As-tu f ait une recherche sur google pour la lecture de codes barres ? je suiss sur que ta solution est en ligne quelque part.

OL

----------


## parp1

Mais pour lire son code barre ne faut -t-il pas le netoyer avant?

Si il a une image bruit, son code barre meme en 1D sera bruit...

Cependant avec des croissance de region ca pourrait fonctionner.

Dans notre ligne extraite faire : regarde pour chaque pixel (dans l'image initiale)si il a un  voisin proche (a gauche ou a droite) si oui :
         On le garde
si non:
        Pixel lu = fond

Je pense qu'il n'y a pas de ligne verticale ayant une largeur de pixel =1.

Certainement des erreurs, mais c'est peut etre une piste. Sinon il existe des algo de rotate d'imagE..

----------


## ol9245

> Mais pour lire son code barre ne faut -t-il pas le netoyer avant?


Pas la peine car avec un nombre significatif de lignes qui reprsentent toutes le meme code barre, en prenant la mdiande de chaque colone il calcule une ligne unique qui contient le code barre sans le bruit. La redondance de l'information entre les diffrentes lignes qui contiennent le mme code barre est telle qu'il n'y a pas besoin de grand chose pour enlever le bruit. ici, une simple mdiane.
OL

----------


## zolotaya

J'ai reussi  resoudre mon problme pour la binarisation. Cela venais de l'initialisation. Mon seuil de dpard se situer aprs mes 2 modes, je binaris donc en fonction du bruit. Comme je devrais travailler sur des images peu bruite, je prend tout simplement la valeur moyenne de mon histogramme sui se situe  peu prs entre les 2 pics. L'algo trouv fait le reste aprs pour me donner le seuil optimal.

----------


## parp1

Est ce  ?

----------


## zolotaya

Ui juste oublier de cliquer sur le pitit bouton je fait ca de suite^^

----------

