# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  analyse d'une image

## floopi51

bonjour

je recherche des tuto sur le traitement d'image en C.
je dois faire un programme qui analyse une image obtenue par capture d'cran (je choisirai donc le format) pour trouver du texte dans cette image.
je precise que je n ai jamais fait de traitement d'images.

merci pour vos ides.

----------


## Emmanuel Delahaye

> je recherche des tuto sur le traitement d'image en C.
> je dois faire un programme qui analyse une image obtenue par capture d'cran (je choisirai donc le format) pour trouver du texte dans cette image.
> je precise que je n ai jamais fait de traitement d'images.


Tu mlanges deux concepts...

1 - Le traitement d'image est une science particulire (on appelle a un 'mtier' en informatique). Elle est dfinie par un certain nombre de mthodes qui dcrivent les traitement  appliquer sur les images, et les agorithmes  appliquer. Ces traitements sont indpendant de tout langage d'implmentation.

2 - L'criture d'une application en C. C'est ce qu'on appelle le codage. Il ne se fait pas _ex-nihilo_, comme a au hasard, sans but prcis, mais rpond  une demande trs clairement exprime par le 'mtier' qui dsire raliser tel ou tel produit. Cette demande est concrtise par une spcification et une analyse (ou conception) qui dcrit de manire formelle les interface et les traitements  raliser.

En rsum, o est le document d'analyse ?

----------


## Invit

C'est pour le boulot, pour les tudes ?
Parce qu'en soit c'est dj super chaud, alors si t'as jamais fait de traitement d'image...
Si c'est pas un exercice pour tes tudes, et que la seule chose qui compte c'est que a marche, trouve un programme dj tout fait.

----------


## floopi51

> Tu mlanges deux concepts...
> 
> 1 - Le traitement d'image est une science particulire (on appelle a un 'mtier' en informatique). Elle est dfinie par un certain nombre de mthodes qui dcrivent les traitement  appliquer sur les images, et les agorithmes  appliquer. Ces traitements sont indpendant de tout langage d'implmentation.
> 
> 2 - L'criture d'une application en C. C'est ce qu'on appelle le codage. Il ne se fait pas _ex-nihilo_, comme a au hasard, sans but prcis, mais rpond  une demande trs clairement exprime par le 'mtier' qui dsire raliser tel ou tel produit. Cette demande est concrtise par une spcification et une analyse (ou conception) qui dcrit de manire formelle les interface et les traitements  raliser.
> 
> En rsum, o est le document d'analyse ?


merci pour toutes ces prcisions.
je cherche juste des liens vers des tutoriel pas un cours de conduite de projets.
mon projet n est pas sorti de nul part, j ai un cahier des charges prcis mais je ne crois pas que ce forum soit le lieu pour l'exposer.
cordialement.

----------


## floopi51

> C'est pour le boulot, pour les tudes ?
> Parce qu'en soit c'est dj super chaud, alors si t'as jamais fait de traitement d'image...
> Si c'est pas un exercice pour tes tudes, et que la seule chose qui compte c'est que a marche, trouve un programme dj tout fait.


c'est pour le boulot.
cote programme tout fait, je n ai vu que des logiciels qui font de l'OCR sur
des docs dactylographi. j ai essay gocr (je suis sous debian) mais il mlange un peu les caractres et ne tire rien de bon de l'image que je lui donne en entre.

----------


## Emmanuel Delahaye

> je cherche juste des liens vers des tutoriel


Des tutoriels sur quoi ? Comment lire un fichier binaire ?

Sinon si il s'agit d'OCR, il faut voir sur ce forum :

http://www.developpez.net/forums/f64...ement-dimages/

----------


## floopi51

> Des tutoriels sur quoi ? Comment lire un fichier binaire ?


comme je l ai dit dans mon premier post : traitement / analyse d'image en C.
si quelqu un connait une lib compatible avec le langage C qui permet de lire et analyser une image, c est a qui m'intresse.

j ai essay libocr mais cela semble plus appropri pour des scans de documents dactylographi. mes images ne sont pas des doc dactylographi mais des captures d'crans avec des graphs, des tableaux.

----------


## souviron34

::recherch:: 


Mme juste une lecture de la premire page des forums donne :

...autres-langages/algorithmes/traitement-dimages/

et on y trouve :

...cours-traitement-numerique-images/

----------


## Emmanuel Delahaye

> comme je l ai dit dans mon premier post : traitement / analyse d'image en C.


C'est super vague...



> si quelqu un connait une lib compatible avec le langage C qui permet de lire et analyser une image, c est a qui m'intresse.


C'est toujours aussi vague



> j ai essay libocr mais cela semble plus appropri pour des scans de documents dactylographi. mes images ne sont pas des doc dactylographi mais des captures d'crans avec des graphs, des tableaux.


et l, on devine qu'il s'agit d'OCR, ce qui n'est qu'un traitement d'image parmi d'autres... Le langage C, qui n'est qu'un outil, ne peut rien pour toi. Si les bibliothques que tu as essayes ne conviennent pas, il faut dvelopper ton propre algorithme de reconnaissance de formes.

- soit tu es form pour et tu sais faire (genre Bac+5 en informatique)
- soit tu ne l'est pas et il faut de former. Mais, c'est pas gagn, j'imagine qu'il y a pas mal de pr-requis...

J'ai dj indiqu le bon forum pour a.

Si il s'agit de chercher des bibliothques,  ::google::  ne fera pas mieux que nous...

ce n'est en aucun cas une question de langage C.

----------


## Obsidian

> j ai un cahier des charges prcis


Justement, dis-nous ce qu'il y a *prcisment* dans ce cahier des charges et on sera plus  mme de t'orienter.

Tu cherches  faire quoi exactement ? Reconnatre des plaques d'immatriculation sur les photos des radars automatiques ?

----------


## floopi51

> C'est super vague...
> C'est toujours aussi vague
> et l, on devine qu'il s'agit d'OCR, ce qui n'est qu'un traitement d'image parmi d'autres... Le langage C, qui n'est qu'un outil, ne peut rien pour toi. Si les bibliothques que tu as essayes ne conviennent pas, il faut dvelopper ton propre algorithme de reconnaissance de formes.
> 
> - soit tu es form pour et tu sais faire (genre Bac+5 en informatique)
> - soit tu ne l'est pas et il faut de former. Mais, c'est pas gagn, j'imagine qu'il y a pas mal de pr-requis...
> 
> J'ai dj indiqu le bon forum pour a.
> 
> ...


tant donn que je souhaite utiliser le langage C pour sa rapidit de traitement et parce que je suis plus  l'aise en C qu en d'autre langage,
il m'a sembl interessant de poster sur un forum spcialis en C... au  cas o
quelqu un qui aurait des comptnces dans ces 2 domaines (C et traitement d'image) passerait par l...
dsol d'avoir dranger le programmeur assidu que vous semblez tre.

----------


## floopi51

> Justement, dis-nous ce qu'il y a *prcisment* dans ce cahier des charges et on sera plus  mme de t'orienter.
> 
> Tu cherches  faire quoi exactement ? Reconnatre des plaques d'immatriculation sur les photos des radars automatiques ?


non pas des plaques minralogiques  ::mouarf::  mais des tableaux de chiffres rcuprs par capture d'cran.

un exemple du type d'image est en pice jointe

je veux  pouvoir extraire les chiffres et le texte de ce type d'image.

----------


## floopi51

> Mme juste une lecture de la premire page des forums donne :
> 
> ...autres-langages/algorithmes/traitement-dimages/
> 
> et on y trouve :
> 
> ...cours-traitement-numerique-images/


merci je vais aller lire ca...

----------


## Invit

Qu'est ce que tu as comme information ? Est-ce que par exemple tu sais que ton texte sera tout le temps en noir ?

----------


## floopi51

> Qu'est ce que tu as comme information ? Est-ce que par exemple tu sais que ton texte sera tout le temps en noir ?


la couleur du texte n'est pas fixe. le fond non plus.  
c'est d'ailleurs surement pour ca que les libraries bases sur de l'OCR ne donnent pas des rsultats corrects.
j'ai mme essaye d appliquer des filtres  l'image pour sortir une image en noir et blanc (avec GIMP) et mme si tout est en noir et blanc, l'analyse par OCR n'est pas correcte.  ::cry::

----------


## Invit

Si la couleur est variable, mme en noir et blanc le texte va se retrouver un coup plus fonc que le fond, un coup plus clair.
Il faudrait dj faire un premier passage pour liminer les bordures du tableau. Ce sont des verticales et des horizontales qui doivent perturber l'OCR.

----------


## souviron34

> Si la couleur est variable, mme en noir et blanc le texte va se retrouver un coup plus fonc que le fond, un coup plus clair.
> Il faudrait dj faire un premier passage pour liminer les bordures du tableau. Ce sont des verticales et des horizontales qui doivent perturber l'OCR.



et ensuite liminer les couleurs en dtectant des zones rectangulaires (dont les cts sont //)..

L il n'y aura plus que le texte...

----------


## oniric

J'ai realis lors de mon cursus un OCR en caml/C, nous devions reconnaitre des images scann un peu de tout type.

les etapes que nous avions isol au niveau du traitement de l'image sont :
- Rotation de l'image pour mettre les caracteres le plus horizontale possible (il existe plusieurs algo de rotation, attention au phenomene d'escalier). Mais dans ton cas c'est peut etre pas necessaire si c'est directement une capture d'ecran

- Retirer le bruit/artefacte gener par les scanners (nettoyage de l'image). Idem, peut etre pas utile dans ton cas.

- Augmenter le contraste global

- Passer l'image en noir ou blanc (et non pas en noir et blanc qui est souvent assimil  un niveau de gris, l'image doit etre representable par un tableau de boolean)

- Isoler les bloques de texte, puis les paragraphes, puis les mots, puis les lettres.

- Reconnaitre les caracteres via un reseau de neurones

- Corriger les erreurs de lecture via un dictionnaire.


la plupart des bibliotheques disponibles ne font pas forcement toute ces etapes. Si ton but est d'utiliser une bibliotheques deja existante, essaye de lui fournir ce que l'on appel une image parfaite, c'est  dire du texte droit, sans bruit, sans bordure etc. Si cela fonctionne,  toi d'automatiser ce processus et ce sera regler.

bon courage. Un OCR est un projet loin d'etre facile, mais c'est passionnant si on se plonge dedans  ::):  Il y a plein de notion  comprendre/apprendre (traitement d'image, reseau de neurones etc)

----------


## floopi51

bonjour

merci  tous pour vos ides.
je crois que je vais m orienter vers un pr-traitement de l'image pour obtenir un texte en noir sur blanc et ensuite utliser de l'OCR pour recuperer le texte.

----------


## ToTo13

Bonjour,

oui, c'est une bonne ide de pr-traiter ton image.
Je te conseillerai de commencer par faire un seuillage sur le noir => tu auras tout le texte et les lignes du tableau.
Puis une petite transforme de Hough pour trouver les lignes et les supprimer.
Ensuite tu utilise un petit OCR  :;):

----------


## floopi51

> Bonjour,
> 
> oui, c'est une bonne ide de pr-traiter ton image.
> Je te conseillerai de commencer par faire un seuillage sur le noir => tu auras tout le texte et les lignes du tableau.


je ne connais rien au traitement d'image. pour l'instant j'apprend en lisant de la doc sur le web.... d'o forcment mes lacunes...  ::oops:: 
ma question : si mon image est deja transforme en texte noir sur fond blanc, qu'est ce que va m'apporter en plus un seuillage sur le noir ?
 moins que j'ai mal compris et que tu me conseilles de faire un seuillage sur le noir comme pr-traitement de l'image pour obtenir le texte en noir sur du blanc ?





> Puis une petite transforme de Hough pour trouver les lignes et les supprimer.
> Ensuite tu utilise un petit OCR

----------


## ToTo13

bonjour,

si ton image contient dj le texte noir sur fond blanc, inutile de faire le seuillage.

En revanche, mme si cela est dj fait, il doit te rester les lignes formant le tableau.
Donc l je les dtecterai avec l'incontournable transforme de Hough. Fais une recherche dans ce forum (Algo), tu trouveras tout ce dont tu as besoin. Mme du code Java.

----------


## floopi51

bonjour,

pour automatiser le traitement de mon image originale, je suis finalement partie sur la programmation du seuillage.
je prcise que je programme en C et avec libpng.
je met un exemple d'image en pice jointe.

par un premier traitement (image passe en niveau de gris puis seuillage), j'obtiens une image (img1) avec tout le texte noir sur un fond blanc.

j'inverse l'image pour passer le texte blanc en noir et le noir en blanc.
je recupre une 2me image (img2)avec le texte qui tait en blanc pass en noir.

aprs ca, je veux recopier ces 2 images dans une seule pour recuperer tout le texte et l ca ne fonctionne pas.je recupre une image toute noire.

je me suis base sur cet  algo : 



> Faire ouvrir Image  seuiller
> Crer nouveaux tableau
> Faire pour tout i dans img1 et img2
>     regarder img1.pixel[i] et img2.pixel[i]
>     si img1.pixel[i] >= 2  et si img2.pixel[i] >= 2
>         mettre tableau[i]  0xffffff (blanc)
>     sinon mettre tableau[i]  zro.
>     Fin si
>     Crer l'image rsultat a partir de tableau
> Fin faire


merci

----------


## souviron34

ben avec ton algo, c'est normal  ::P: 

A partir de img1, (texte noir sur fond blanc), si tu veux texte blanc sur fond noir, tu inverses (img2), et c'est tout, non ??



```

```


(le seuil est au pif)

et tu travailles seulement avec img2 ...

----------


## floopi51

> ben avec ton algo, c'est normal 
> 
> A partir de img1, (texte noir sur fond blanc), si tu veux texte blanc sur fond noir, tu inverses (img2), et c'est tout, non ??
> 
> 
> 
> ```
> 
> ```
> ...


non pas si simple j'illustre avec les images obtenues par mes traitement successifs.
l'image originale contient du texte blanc et du texte noir. le fond est de differentes couleurs.
j'essaye de recuperer le texte pour l'avoir tout en noir sur fond tout blanc.

 ::king::  ah oui je viens de comprendre le travail sur seulement 2 images.
je parcours img1 je mets en noir dans img2 si c est en noir dans img1.
pour le reste je ne fais rien.

je retente le traitement  ::aie::

----------


## floopi51

> ah oui je viens de comprendre le travail sur seulement 2 images.
> je parcours img1 je mets en noir dans img2 si c est en noir dans img1.
> pour le reste je ne fais rien.
> 
> je retente le traitement


 ::salut:: 
bon ben je bloque l : j'obtiens toujours une image totalement noire en rsultat. 

quelqu'un aurait-il une ide ?
je met mon code : c'est du C et j'utilise la librairie libpng


```

```

----------


## souviron34

plusieurs remarques :

A quoi a sert que C il se dcarcasse !!!  ::evilred:: 

il y a des *types* , comme FILE, comme des char *, etc etc...

Dans les tests, il faut tester par rapport  *NULL* si on teste des pointeurs, ou par rapport  la valeur quand elle est donne :

if ( f == NULL )if ( temporary == NULL )....
etc....  La *variable* *n'est pas* un boolen.. C'est le *test* qui l'est


Secondo, les indices de boucles commencent  zro, donc :




```
  for(a=xs*ys; a; a--)
```

est faux pour 2 raisons :


l'image va de 0  xs*ys *- 1*la valeur de fin n'est pas dfinie

Je n'ai pas t plus loin....

----------


## floopi51

> plusieurs remarques :
> 
> A quoi a sert que C il se dcarcasse !!! 
> 
> il y a des *types* , comme FILE, comme des char *, etc etc...
> 
> Dans les tests, il faut tester par rapport  *NULL* si on teste des pointeurs, ou par rapport  la valeur quand elle est donne :
> 
> if ( f == NULL )if ( temporary == NULL )....
> ...


merci.
mon image est toujours noire....

----------


## Emmanuel Delahaye

> merci.
> mon image est toujours noire....


Il est possible qu'il y ait d'autres bugs...

----------


## souviron34

Comme tu n'as pas bien lu ma remarque sur ton algo, je te pointe les 2 endroits ou a ne va pas :





> :
> 
> 
> ```
> 
> ```



Rflchis... Tu fais n'importe quoi, l...


Primo, tu n'as pas besoin de re-lire l'image, tu l'as en mmoire (img1).

D'autre part, que vient faire ce bidouillage ??
J'ai pas t clair ??




```

```



Et tu copies dans le mauvais sens..  Et tu fais plein d'oprations inutiles, et tu crases tes rsultats... Et tu n'incrmentes pas iptr1.... Bref, beaucoup de travail....




```

```


Avec un bon passage de param, ceci devrait marcher....

ET LA CORRECTION DES REMARQUES MISES PLUS HAUT.....


_(je n'ai ni test, ni compil)_

(et je mettrais au moins 10 ou 20 pour le seuil, et non pas 2)...

----------


## floopi51

> Il est possible qu'il y ait d'autres bugs...


il y en a surement mais le problme c'est qu'en ayant le nez dedans depuis plusieurs jours, je ne les vois plus  ::cry:: 




> Primo, tu n'as pas besoin de re-lire l'image, tu l'as en mmoire (img1).
> 
> D'autre part, que vient faire ce bidouillage ??
> J'ai pas t clair ??


je r-explique les manips que j'essaye de faire :

mon image de dpart contient du texte noir sur fond clair ET du texte blanc sur fond en couleur. Je fais un double traitement de l'image pour pouvoir rcuperer tout le texte (blanc et noir) en noir sur fond blanc.
Je procde donc en 2 tapes :

1) premire lecture de l'image
    - ouverture du fichier
    - passage de l'image en couleur  l'image en niveau de gris
    - l'image modifie est stocke en mmoire dasn image1
    - fermeture du fichier

2) deuxime lecture de l'image
    - ouverture du fichier
    - passage de l'image en niveau de gris
    - inversion de l'image : le texte en blanc passe en noir et le texte en noir passe en blanc
    - l'image modifie est stocke en mmoire dans image2
    - fermeture du fichier

3) passage dans la fonction treshold : je veux reporter le texte noir lu dans image2 dans image1 un peu comme si j'ajoutais image2  image1 pour complter le texte.




> Et tu copies dans le mauvais sens..  Et tu fais plein d'oprations inutiles, et tu crases tes rsultats... Et tu n'incrmentes pas iptr1.... Bref, beaucoup de travail....
> 
> 
> Avec un bon passage de param, ceci devrait marcher....
> 
> ET LA CORRECTION DES REMARQUES MISES PLUS HAUT.....
> 
> 
> _(je n'ai ni test, ni compil)_
> ...


effectivement j'ai oubli l'incrmentation de iptr1.
j'ai essay avec un seuil de 20 mais je n'ai toujours pas le rsultat escompt.

----------


## Invit(e)

Bonjour,



> effectivement j'ai oubli l'incrmentation de iptr1.
> j'ai essay avec un seuil de 20 mais je n'ai toujours pas le rsultat escompt.


De mon ct, je commence  avoir des rsultats avec un seuil au alentour de 0x7fffff.

Quelle est la plage dans laquelle les pixels peuvent prendre leur valeur ?

----------


## floopi51

> Bonjour,
> 
> 
> De mon ct, je commence  avoir des rsultats avec un seuil au alentour de 0x7fffff.
> 
> Quelle est la plage dans laquelle les pixels peuvent prendre leur valeur ?


bonjour,
tu es parti avec quel code te quel image ?

----------


## Invit(e)

Le code de ce post.

J'ai modifi la fonction threshold, mais elle fait la mme chose que la tienne.
(Avec des itrations sur les deux images).

```

```

threshold est appele avec 0x7fffff comme paramtre....

Image de source : 8 bits, diteur de texte + fentre cygwin : du texte sombre sur fond clair, du texte clair sur fond sombre.
Rsultat, image binaire, avec le texte bien visible, mais en inversion de contraste.

Pour choisir le seuil automatiquement, il serait malin de faire un histogramme de l'image.

De ton cot
 quoi correspondent les valeurs des pixels ?? Ne faut il pas sparer les trois composantes R G B d'un pixel pour le traiter ?commence par donner en entre des images simples avec des grandes zones rouges, vertes, bleus, blanches et noires.

----------


## floopi51

> De ton cot
>  quoi correspondent les valeurs des pixels ?? Ne faut il pas sparer les trois composantes R G B d'un pixel pour le traiter ?


mon image n'est plus en RGB mais en niveau de gris. Le passage du RGB au niveau de gris est fait dans la fonction read_png avec l'appel  une fonction de la libpng :   

```
   png_set_rgb_to_gray(png_ptr, 1, 54.0/256, 183.0/256);
```

mais j'ai trouv le BUG qui me faisait  ::evilred::  : il manquait l'incrmentation du pointeur iptr2 sur l'image  modifier  ::roll::   maintenant a fonctionne.


```

```

voila le code complet lgrement modifi qui fonctionne.
la fonction threshold est devenu add_png et une nouvelle fonction threshold est apparue pour rcuprer mon image finale en texte noir sur fond blanc.


```

```

merci  tous pour votre aide.

maintenant, je dois supprimer les lignes horizontales et verticales autre que du texte pour ensuite traiter mon image par OCR.....
au boulot sur la transforme de Hough.....

----------

