# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Analyse de taches, comptage, et dissociation selon les couleurs

## thance

En suite  ce post ci http://www.developpez.net/forums/sho...d.php?t=285727

Et ou j'tais confront  recommencer quasi depuis le dpart mon systme d'analyse d'image, je recommence donc un post pour essayer de rsoudre mon problme.

En fait Voil, je voudrais que l'image soit parcourue par un rond (virtuel), en fait se serait plutt 2 lignes croises qui parcourraient l'image, et ds que tous les pixels de ces 2 lignes seraient tous dans le mme range "de couleur" on pourrait les considrer comme tache. Puis retenir leurs coordones, et ensuite effectuer la dissociation selon que c'est du vert et du noir par exemple...

Cette image me sert d'image de dpart  analyser :



Voil, mon code qui s'est avr foireux est en dernire page de l'autre taupic...

Donc en gros : taches de qques pixels vertes et noires, les compter et afficher le rapport.

Il faudrait que je fasse pour commencer 4 boucles je pense, avec une qui analyse le pixel du haut, l'autre celui du bas, et les deux autres gauches et droites.

Je ne sais pas si c'est le bonne mthode, ni comment la mettre concrtement en application. Car comme je le disais, je ne commence pas en progra, ni en analyse d'images (matlab), mais je ne connais pas encore le langage python.

Merci, et  +

----------


## mchk0123

Ton problme est loin d'tre simple et tu risques de perdre beaucoup de temps ; non pas  crire un programme qui s'excute mais  analyser sans erreurs ton image.

Depuis trs longtemps l'industrie et la recherche s'est penche sur ce problme de dtection automatique  partir d'images. Cela s'applle de la "vision industrielle" :

http://fr.wikipedia.org/wiki/Vision_industrielle

Je te conseilles de faire une recherche google sur la phrase "logiciels de vision industrielle" et tu verra que le sujet est trs vaste ... 1 million de pages trouves ...

----------


## thance

Je sais, mais j'ai le temps pour le faire et la motivation...

Je ne doit pas arriver a un rsultat a 100% parfait, videmment...

Mais j'aimerais qu'il aient une ide du rapport vert/noir.

Je pense y arriver, dj ici j'ai pu arriver  quelque chose, en travaillant bien le sujet et en avanant pas  pas il y a moyen? non?

Tu crois que mon projet n'est pas viable?

Pourquoi?

Merci et  plus

----------


## mchk0123

Tu vas trouver a galre, mais ce que je te conseilles de faire c'est  de t'imprigner de Python et apprendre  bien utiliser la librairie PIL.
Ensuite c'est de rechercher sur Internet et de lire des articles de recherche sur la vision industrielle.

Je ne penses pas qu'il existe de rponse toute faite  ton pb.

----------


## thance

> Je ne penses pas qu'il existe de rponse toute faite  ton pb.



Moi non plus, et ce n'est pas mon but!

J'aimerait vraiment construire un truc moi mme... j'ai dj explor la librairie pil, et je commence a la cerner, ainsi que mon sujet et comment m'y attaquer...

Je veux juste un point de dpart, des ides, comme j'ai eu sur l'autre topic...

J'ajoute que je ne veux pas un truc de prcision industrielle, je veux juste leur faciliter la tche, et montrer ce que je sais faire. Mme si mon sujet s'en approche et que je m'y intresse, d'ailleurs je vais me pencher dessus.

Je voulais savoir aussi si ma mthode tait bonne et que je n'y vais pas par quatre chemins...

Merci,  +

----------


## Guigui_

Ton objectif est simplement de compter les formes ?

Au vue de la qualit des images, ce n'est pas trs compliqu pourtant (si toutes tes images se prsentent de la mme faon fond, couleur vert et noire de mme nature sur toutes les images).

Mon algo qui m'a permis de trouver l'image des taches vertes et l'image des taches noires. j'ai travaill en niveau de gris (je pense que c'est plus facile de travailler en couleur (mais vu que j'avais dj dvelopp des algos pour le niveau de gris, je m'en suis inspir)).



```

```


Y'a plus qu' les compter taches sur chaque image
Pour le seuillage  hysteresis, c'est simplement un seuillage sur le SeuilMax o tous les pixels voisins d'un pixel valide (pixel>SeuilMax ou valid) tant suprieur  SeuilMin est valid (donc mis  255).
J'ai choisi les valeurs des seuillages pour que ca colle bien (donc c'est un peu biais) mais si tu as d'autres images qui ont les mmes caractrisitiques, ces valeurs devraient convenir. Sinon cela ne fonctionnera pas.

Vu la qualit/propret de tes images, il y a bien entendu plein d'algos possibles pour arriver  tes fins. Pour Python, en plus de PIL, tourne-toi aussi du ct de numpy/scipy pour le traitement matriciel (elles doivent mmes fournir quelques fonctions de traitement d"image (notamment morphologique))

----------


## Guigui_

Finalement, en travaillant sur les couleurs R, G, B, c'est encore plus simple



```

```

Et l, j'ai mes images vertes et noires nickel (il y a encore les 2 valeurs des seuillages  bien choisir)

----------


## thance

Salut Guigui, et merci pour ton code je vais essayer de le comprendre.... Parce que c'est assez chaud pour mon niveau...

En fait, en thorie, le fond sera toujours clair (vert trs clair).

Et il y aura toujours des taches vertes ou alors noires/vertes trs trs fonces... presque noires quoi...

Mais ton truc permet vraiment de compter, d'incrmenter un compteur plus exactement? (je suis encore aux vieilles boucles moi, php powaaa)

Merci  toi

----------


## mchk0123

GuiGui tu pourrais nous mettre un lien d'explication vers le Seuillage par Hystresis ?

Le plus complet possible au mieux, ou bien dans la doc PIL au pire ?

Merci, cela m'intresse grandement.

----------


## Guigui_

> Mais ton truc permet vraiment de compter, d'incrmenter un compteur plus exactement? (je suis encore aux vieilles boucles moi, php powaaa)
> 
> Merci  toi


Non, cet algo permet simplement de rcuprer une image ne contenant que les taches vertes ou noires. Aprs il n'y a plus qu' compter.
Pour compter, ce n'est pas trs compliqu:
- il faut parcourir chaque pixel de ton image binarise (reprsentant par exemple les taches noires).
- Ds que tu trouves un pixel valant 255, cela signifie que tu as une taches supplmentaire.
Alors tu mets ce pixel  0 ainsi que tous ces voisins (valant 255) dans un 8-voisinnage (et les voisins des voisins ...), ainsi tu as mis  0 tous les pixels de la tache.
Puis tu continue de parcourir ton image ainsi de suite



```

```

----------


## Guigui_

> GuiGui tu pourrais nous mettre un lien d'explication vers le Seuillage par Hystresis ?
> 
> Le plus complet possible au mieux, ou bien dans la doc PIL au pire ?
> 
> Merci, cela m'intresse grandement.


PIL ne permet pas de faire du traitement d'images, mais plutt de la manipulation d'images (en gros des trucs basiques). Pour faire du traitement, il faut passer par numpy et en gnral tout coder  la main ds que l'algo n'est pas simple.

Pour le seuillage par hysteresis, je ne crois pas que numpy le propose.
Le principe est simple: tu as 2 seuils: SeuilMin et SeuilMax
Tu seuilles ton image sur le SeuilMax et tu seuilles avec le SeuilMin tous les voisins (et les voisins des voisins) d'un pixel suprieur au SeuilMax.

Ainsi si tu as une images qui contient des taches ou les pixels varient de 50  150 et d'autres de 100  200 et que tu veux rcuprer uniquement les taches 100-200 en conservant la tache la plus grosse possible, il suffit de faire un seuillage par hysteresis avec SeuilMin = 100 et SeuilMax = 180 alors qu'un Seuillage simple avec SeuilMin = 100, tu aurais aussi rcuprer des bouts des taches 50-150

----------


## parp1

Salut moi j'avais vu une autre facon de faire peut etre un peu plus ...bourin,cette facon de faire ne fonctionne que si la differences de taille entre tes points est assez grande.

Tu seuillage ton image afin d'extraires tes points du fond.(seuillage entropique par exemple)

Ensuite tu appliques une grosse erosion jusqu'a faire disparaitre tout les petits point.

Tu fais la soustraction entre ton seuillage initial, et ton image sans les petits points. Ainsi tu obtiens l'image des petits points.

tu as donc en stock, une image regroupant tes gros points, et une image avec tes petits points.


Il reste ensuite a faire (chose dont je ne suis pas sur qu'elle fonctionne) Une mulitplication d'une des images gros ou petits points avec l'image couleur originale(en fait mutliplication des trois canaux+reconstuction RGBtoColor.), le fond etant a 0 devrait rester etre mutliplier par zero, les points tant a 1 devrait maintenire les couleurs en leur tat.


Je ne sais pas si j'ai t clair, et je ne sais meme pas si c'est fonctionnel... Mais peut etre a essayer.

----------


## thance

Merci guigui pour tes rponses, et a parp aussi, je vais bien m'y mettre ce w-e...

Juste une question pour ceux qui connaissent matlab, il existe une fonction ressemblant a bwlabeln en python? Dans mes cours je me rapelles qu'en utilisant le labelling, on pouvait compter le nombre de taches en transformant pralablement l'image en binaire...

Pour guigui je crois commencer  capter ton systme... C'est pas bte, mais le traitement ne sera pas lent? Mon ide est faisable ou c'est farfelu?

Sinon pour parp, c'est un peu trop chaud pour moi ta mthode, le python pour moi c'est assez neuf  ::lol::   :;):  

A +

----------


## thance

Pour les macs users qui veulent installer numpy : http://pythonmac.org/packages/py24-fat/ 

Voil

----------


## thance

Guigui j'ai un problme avec ton code... les images sont brouilles...

C'est un bizarre et je comprends pas pourquoi...

Comment je pourrais dbuguer a?

Et les piles et les listes jss pas dou  ::roll::  mais bon je vais essayer de compter par moi mme...

A +

----------


## thance

Voil j'ai modifi et a marche, sans doute qu'il fallait tout mettre pour que a tourne...



```

```


Pour le moment je suis en train de chercher des fonctions qui pourraient m'aider dans le comptage, avant de me mettre a faire mon propre algorithme... Il y a bien la fonction getbbox, mais ce n'est que pour les zones valant 0, et je ne pense pas qu'elle permette de rellement compter.

Sous matlab, en 3 tapes a partir d'une image en binaire, de regionprops, et de bwlabeln, on peut savoir combien de taches il y a..

++  ::bug::

----------


## thance

Je relance mon topic, pour voir si qqun a une ide pour compter mes taches en noir et blanc...

J'ai essay une mthode, mais je suis bloqu, car j'aimerait a partir de la coordone de 4 points mettre un carr a noir un peu plus grand, et bon le carr noir, a je sais, mais comment le placer?



```

```


Voil, a fonctionne, mais pas dans le cas ou certains points sont plus grands que les autres...

Il faudrait pouvoir initialiser la croix a la tache la plus petite, et masquer avec une tache plus importante... Mais je vois pas trop comment faire en fait...

Svp aidez moi...

Merci  ::mrgreen::

----------


## ol9245

tu comptes les pixels qui sont verts ET qui ont du nor  une distance de 8 pixels.  Je crois pas que a marche. En tous cas c'est pas la mthode acadmique.

Tu dois labelliser. cherche labelisation pour avoir les algos : c'est pas cach. Aprs tu compte le nombre de labels que tu as distribus.

----------


## thance

Oui je sais, le label, mais franchement j'ai bien cherch et je trouve pas en python...

Sinon ici je pars des images noir et blanc pour compter, donc pas de vert...  :8O:  

En fait le prob avec ma boucle c'est que si a rentre 2 fois dans une tache il le compte 2 fois...

+++

----------


## ol9245

C'est pas trop difficile d'crire un algo de label sur une page blanche. C'est peut tre pour ca qu'il n'y a pas beaucoup de pages web qui lui sont ddies  :;):  Tu peux utiliser la forme rcursive pour que a soit plus simple. 

Toujours pour faire simple, tu a deux images : l'image d'origine et celle des labels. l'image label est initialise  zro doc sro n'st pas un label

un truc comme (j'cris comme je pense. A vrifier)

set_label prend 4 paramtres :
image = l'image de dpart
label_image = la carte des labels
i = le pixel i a labelliser
n = le label  poser si possible


```

```

La fonction appartient__la_meme_rgion compare deux pixels voisins et dcide si le deuxime et bon ou pas
% a priori tu fais un simple gradient donc, pour des taches sombres sur fond clair 



```

```

reste  labelliser une image
La fonction labeliser_image prend une image en entre et te donne la carte des labels correspondants en sortie.
Noter que la variable interne n contiendra en sortie le nombre de labels poss


```

```

Voil. Tu vois, c'est pas compliqu. ya pas de quoi en faire une page web, comme je disais ! Ca devrait marcher aprs traduction en Python. Dsol, je ne connais pas ce langage. 

OL

----------


## Flo.

Salut,

Je poste une rponse mais je suis pas sur d'avoir bien compris ce qui tait demand. Si j'ai bien compris il faut compter les taches noires et les taches vertes (avec 2 compteurs diffrents).

C'est  propos la sparation des 2 groupes de tches. Moi je passerais en HLS. C'est toujours mieux que RGB pour travailler sur des images couleur.



Tu pourras dja compter les vertes facilement en teinte (l'image du dessus). En luminance, les compter toutes. Puis faire la soustraction des 2 rsultats pour les noires.

Je sais pas si a aide ...  ::?:  

Flo

----------


## poukill

Effectivement, l'espace Luminance, Teinte, Saturation est mieux pour le traitement d'image en gnral!

J'ai dj fait ce genre de projet (analyse de couleur su un tapis roulant industriel), c'est pas trop dur...

Tu met un critre de seuillage au niveau de la teinte (franchement entre vert et noir c'est pas trop difficile!!), tu parcours toute ton image puis pour chaque pixel tu dcides si il satisfait le critre VERT, NOIR, ou bien FOND...

Tu peux liminer le bruit rsiduel par morpho math, et ensuite une p'tite labellisation te permet de compter, etc....

 :;):

----------


## ol9245

> Effectivement, l'espace Luminance, Teinte, Saturation est mieux pour le traitement d'image en gnral!


Oui. HSV en anglais (hue, saturation value) c'est la base.




> Tu met un critre de seuillage au niveau de la teinte (franchement entre vert et noir c'est pas trop difficile!!), tu parcours toute ton image puis pour chaque pixel tu dcides si il satisfait le critre VERT, NOIR, ou bien FOND...


 pas exactement un seuillage simple. le noir peut tre nimportequoi en teinte, et mme ventuellement en saturation. Il a surtout une luminance faible. Le vert va se seuiller sur le couple teinte et saturation. Le noir va se seuiller sur le couple luminance et saturation

Pour le lable : yes! tu peux pas y couper.

----------

