# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Effacer bruit de fond dans un document

## kilrou

Salut tout le monde,

Voil, je participe  un projet ou le but final sera d'avoir un O.C.R (Optical Charater Recognition), c'est a dire un logiciel capable de retranscrire dans un format texte un document scann.

Ma partie pour l'instant se penche principalement sur le *gommage des bruits de fond*, c'est  dire les espces d'impuretes noires qu'il pourrait y avoir sur un document crit noir sur blanc afin d'obtenir un document claire et lisible bien noire sur blanc sans tche.

Donc si vous avez une petite ide pour me lancer ou des bon sites expliquant ce principe, je suis preneur.

Edit : j'ai vaguement entendu parler d'une methode avec les pixels mais cela reste encore flou.

Merci d'avance.

----------


## khayyam90

Bien le bonjour, 

Ce que tu cherches, c'est  prtraiter ton image pour ne conserver que l'information utile. Il faut donc retirer le bruit et faire ressortir le texte.

Selon la forme de ton bruit, plusieurs mthodes seront possibles : 
* passer un masque de convolution pour flouter ton image puis faire un seuillage, les points noirs isols vont disparaitre, mais les bords du texte en ptiront aussi
* trouver un filtre moins destructeur  ::D: 
* supprimer les zones trop petites avec le risque de perdre des informations comme les points sur les 'i', les accents, les points, les virgules...
* ...

Une premire approche du problme

----------


## Matthieu Brucher

Je dirai plus un traitement par morphologie mathmatique -> rosion en noir et blanc, a permettra de supprimer pas mal de points tous seuls, dj.

----------


## millie

Tu pourrais nous montrer un exemple d'image.

J'aurais bien essay ceci : ici. Mais peut tre que l'rosion propose par Miles serait plus simple (et plus rapide)

----------


## kilrou

Je vais regarder ces mthodes, pour le type de document, ce serait un fichier scann avec une police de caractre de base pour commencer.
(un polycopi cris  la machine  taper que l'on a scann par exemple)

Merci,je vous tiens au courant.

----------


## Matthieu Brucher

C'est du noir et blanc ou des niveaux de gris ?

----------


## NiuAge

Salut !
J'allais poster la mme question  l'instant donc je me permets de participer ^^.

Le "bruit" sur une image scanne, c'est pas forcemment que des petits points noirs isols malheureusement.
Plutot dans ce genre :


Donc ce que je pensais, c'est travailler sur les niveaux de l'image.
Dans photoshop ca donne ca (les niveaux ne correspondent pas du tout  l'image poste au dessus hein  :;):  )


On peut agir sur 3 curseurs, qui permettent, "a la main", de trs facilement liminer ces impurets.

*=>* Donc si vous saviez me dire ce sur quoi agissent ces 3 curseurs, au niveau des composantes des couleurs, ca m'aiderait bien !

Merci (en esprant que ca aide aussi Mr.kilrou ^^)

----------


## ToTo13

> Salut !
> J'allais poster la mme question  l'instant donc je me permets de participer ^^.
> 
> Le "bruit" sur une image scanne, c'est pas forcemment que des petits points noirs isols malheureusement.
> Plutot dans ce genre :
> 
> 
> Donc ce que je pensais, c'est travailler sur les niveaux de l'image.
> Dans photoshop ca donne ca (les niveaux ne correspondent pas du tout  l'image poste au dessus hein  )
> ...



Le bruit de ce genre se retire facilement avec un seuillage.

Pour la morpho math, attention  la perte d'information.

Je suggrerai un peu de Hough pour trouver les lignes et ainsi pouvoir liminer tout ce qui ne fait pas parti des ligne.

----------


## NiuAge

> Je suggrerai un peu de Hough pour trouver les lignes et ainsi pouvoir liminer tout ce qui ne fait pas parti des ligne.


J'utilise hough (ca marche niquel d'ailleurs ^^) pour dtecter l'angle, mais ca peut aussi permettre de localiser les lignes ?? Je pensais pas. Ou j'ai pas compris ce que tu voulais dire, surement ^^.

Ok pour la mthode du seuil, c'est ce que j'appelais les "niveaux" je pense. Effectivement ca marche bien  :;):

----------


## pseudocode

Il y a aussi les filtres de Kalman. Je sais qu'on utilise ca pour nettoyer les images dans le milieu medical, ou meme pour restaurer les vieux films.

----------


## NiuAge

C'est sortir l'artillerie lourde pour tuer une mouche ^^. Enfin c'est ce qu'il me semble en lisant quelques infos dessus  :;): 
J'essayerai quand meme de regarder de plus prs, la mthode  l'air intressante.

----------


## souviron34

ben moi je ferais plutot en 2 tapes, et je suis d'accord que Hough ou Kalman c'est un peu beaucoup...

1) seuillage simple (limine les "patterns" dessous)
2) lissage 3*3 ou shift lger de l'image (limine les points noirs)

----------


## NiuAge

> lissage 3*3 ou shift lger de l'image


Hu ?
Lissage 3*3, en gros c'est un flou dont tu parles non ? Et shift ?

----------


## souviron34

> Hu ?
> Lissage 3*3, en gros c'est un flou dont tu parles non ? Et shift ?


Oui pour le flou... MAis c'est pas si flou que a  :;):   avec juste un lissage 3*3 c'est du mini... Mais les points isols partiront...

Le shift est pas la solution (j'ai rflchi un peu.. Si si a arrive  ::oops::  )

----------


## NiuAge

Je dois mal m'y prendre pour mon flou alors  ::lol::  

Regarde ce qu'un flou 3*3 me donne sur une image test avec des points noirs isols.

----------


## Sylvain Togni

Essaye plutt de faire d'abord le flou puis ensuite le seuillage pour voir.

----------


## millie

Avec ma technique (dbruitage avec la mthode des hypersurfaces, j'obtiens ceci) :



```
    dest = debruitageHypersurface(source, 300, 250, 0.001);
```



Avec : 

```
    dest = debruitageHypersurface(source, 200, 450, 0.001);
```

J'obtiens :


J'ai utilis mes sources ici (en exportant le jpg en PGM) : ici, a a l'inconvnient d'tre assez long en calcul.

----------


## NiuAge

Merci ! Je crois meme que j'avais dja regard tes sources... mais ca m'tait sorti de l'esprit  ::roll::  

thx  ::D:

----------


## NiuAge

Il y a quelque chose que je comprend pas dans ton code : c'est le calcul des drivs...
On dirait que les fonctions sont rcursives, mais quand s'arrtent-elles ?

Merci.

edit : quelq'un peut m'explique ce code (je connais rien au C++) :


```

```

(*this) fais rfrence  ImageMono nan ?
C'est rcursif ? SI oui, quand est ce que ca s'arrte ?
merci

----------


## millie

En fait, j'avais dj redfini l'operator () :



```
ImageMonoType& ImageMono::operator() (int x, int y)
```

Donc, (*this)(x,y) correspond  la lecture de la couleur  la position (x,y) de l'image courante. Et ce n'est pas rcursif. this est un pointeur vers l'instance courante, mais comme l'oprateur doit s'appliquer sur une instante (et pas un pointeur), je passais par *this pour pouvoir appliquer l'oprateur.

----------


## NiuAge

D'accord ! Effectivement, j'tais pas prt de trouver...
Merci.

----------


## JeitEmgie

> Salut tout le monde,
> 
> Voil, je participe  un projet ou le but final sera d'avoir un O.C.R (Optical Charater Recognition), c'est a dire un logiciel capable de retranscrire dans un format texte un document scann.
> 
> Ma partie pour l'instant se penche principalement sur le *gommage des bruits de fond*, c'est  dire les espces d'impuretes noires qu'il pourrait y avoir sur un document crit noir sur blanc afin d'obtenir un document claire et lisible bien noire sur blanc sans tche.
> 
> Donc si vous avez une petite ide pour me lancer ou des bon sites expliquant ce principe, je suis preneur.
> 
> Edit : j'ai vaguement entendu parler d'une methode avec les pixels mais cela reste encore flou.
> ...


voir

http://www.ph.tn.tudelft.nl/Courses/...tml#Heading115

----------


## pseudocode

Puisqu'on en est a donner des examples, il y a le logiciel/librairie open-source GREYCstoration.
Les resultats sont vraiment bluffant. 
Par contre je n'ai pas trouv d'info sur la methode de filtrage qu'ils utilisents (multi-valued diffusion Partial Differential Equations).

Pice jointe 10050

----------


## kilrou

> C'est du noir et blanc ou des niveaux de gris ?


Plutt noir et blanc (pour les points) mais aussi certaines "tches" a plusieurs niveaux de gris (cf photo de la page 1), dsol pour mon "lger" retard.

Edit : Merci beaucoup pour toutes ces rponses, c'est vraiment intressant.
J'analyse tout a et je vous tiens au courant.

----------


## NiuAge

> Puisqu'on en est a donner des examples, il y a le logiciel/librairie open-source GREYCstoration.
> Les resultats sont vraiment bluffant. 
> Par contre je n'ai pas trouv d'info sur la methode de filtrage qu'ils utilisents (multi-valued diffusion Partial Differential Equations).
> 
> Pice jointe 10050


Effectivement le rsultat est vraiment bon ! Ca ne dgrade que trs peu la ligne noire en forme de 'L', contrairement  d'autres mthodes.

J'ai jet un coup d'oeil au code... dur dur ^^.

----------


## NiuAge

Pour info, je suis revenu  une mthode plus simple, mais tellement plus rapide ^^, mthode de la mdiane, suivi d'un ptit flou. Ca abime un peu les lettres mais bon... De toute facon, le plus gros est fait avec la mthode du seuil.

----------


## souviron34

> Pour info, je suis revenu  une mthode plus simple, mais tellement plus rapide ^^, mthode de la mdiane, suivi d'un ptit flou. Ca abime un peu les lettres mais bon... De toute facon, le plus gros est fait avec la mthode du seuil.


 ::yaisse2::  Entirement d'accord avec toi.. 

Je suis toujours partisan d'essayer de trouver la solution demandant le moins possible de maths et de mthodes compliques... 

Et si tu veux dflouter les lettres  la fin,  la limite un petit rehaussement de contour  ::):

----------


## NiuAge

::lol::   Mais en fait, la mthode de millie, j'avais fini de l'implmenter ^^.
Le truc c'est que c'tait VRAIMENT trop long (parcourir des dizaines de fois une norme image...) ! Sinon j'aurai gard cette mthode qui avait de bons rsultats.

----------


## kilrou

> Pour info, je suis revenu  une mthode plus simple, mais tellement plus rapide ^^, mthode de la mdiane, suivi d'un ptit flou. Ca abime un peu les lettres mais bon... De toute facon, le plus gros est fait avec la mthode du seuil.


Tu peux expliquer le principe s'il te plat, et par la mme occasion je vois que la technique du flou est trs utilise mais j'ai du mal  comprendre  quoi elle sert, si quelqu'un peut m'expliquer rapidement. 

Merci d'avance.

----------


## souviron34

le flou ou lissage sert  diminuer les diffrences de point  point...

Cela sert principalement quand il y a du "bruit" sur une image .. 

L'exemple le plus simple consiste  "lisser". On remplace un pixel par la valeur moyenne de ses N plus proches voisins.

Par exemple un lissage moyen 3*3 standard s'exprime :

val2[i,j] = (val1[i-1,j-1]+val1[i-1,j]+val1[i-1,j+1] +
val1[i,j-1]+val1[i,j]+val1[i,j+1] +val1[i+1,j-1]+val1[i+1,j]+val1[i+1,j+1]) / 9
Comme on pondre chaque point par ses voisins, tout point sortant de la moyenne des points voisins est "rabot".. L'inconvnient de ce genre de technique est que justement pour les contours nets d'un objet, on a tendance   taler la limite...

Mais on peut changer les coefficients des points autour pour avoir diffrents effets (par exemple mettre tout autour des -1  et  +9 au centre, ce qui au contraire rehausse)..

Et on peut utiliser d'autres formules

----------


## NiuAge

Le flou seul, ca ne marche pas, chez moi en tout cas. C'tait juste pour amliorer un peu le contour. (le flou, c'est simplement la moyenne des composantes RGB des couleurs des pixels environnants le pixel trait. Par exemple la moyenne de (90, 240, 20) et (20, 160, 30) est (55, 200, 25))

La mthode de la mdiane, c'est super simple.
Tu prends la valeur mdiane des couleurs des pixels environnants ^^.

----------


## souviron34

> Le flou seul, ca ne marche pas, chez moi en tout cas. C'tait juste pour amliorer un peu le contour.
> 
> La mthode de la mdiane, c'est super simple.
> Tu prends la valeur mdiane des couleurs des pixels environnants ^^.


Oui je pensais  a.. Je me suis mal exprim.(voir post ci-dessus)

----------


## pseudocode

Un peu plus long que les filtres de convolution (flou/median) mais qui donne de meilleur resultat: la transforme en ondelette.

1. Transformation en ondelette (DWT) de l'image
2. Seuillage
3. Reconstruction de l'image (inverse DWT)

Ca permet d'eliminer les bruits de type "grain uniforme".

----------


## NiuAge

Ca, ca m'interesse ! Parce que les bruits qu'on aura  traiter sont de ce type principalement  :;):

----------


## pseudocode

> Ca, ca m'interesse ! Parce que les bruits qu'on aura  traiter sont de ce type principalement


Le principe est expliqu ici (code en matlab).

Les algo de DWT et inv-DWT sont dispo un peu partout, meme sur wikipedia il me semble.  Tu peux aussi regarder du cot Jpeg2000 (je crois bien qu'ils utilisent la DWT).

Et puis il reste le forum de Developpez.com... Je suis sur que les matheux du coin connaissent les algos de la DWT par coeur  ::P:

----------


## millie

> Mais en fait, la mthode de millie, j'avais fini de l'implmenter ^^.
> Le truc c'est que c'tait VRAIMENT trop long (parcourir des dizaines de fois une norme image...) ! Sinon j'aurai gard cette mthode qui avait de bons rsultats.



Ouais, a c'est pas sympatique du tout. Le temps de calcul devient norme sur de grosses images, et je n'ai pas trouv comment rduire. Mais si quelqu'un a une ide  creuser, je suis preneur.

Ma technique, le L qui disparaissait, je pense que c'est normal car il tait trop petit (en largeur, je crois un pixel)

----------


## millie

Alors, j'ai essay en passant dans le domaine de Fourier et en appliquant un filtre passe bas simple (j'aurais voulu faire un filtre de type butterworth, mais je n'ai pas eu le temps).

Le module de l'image ressemble  a :



Et un filtre avec une frquence de coupure  100 donne :



Donc, pas super, il faudrait rhausser les contours.

*Super edit :*  Oula, je viens de voir qu'il y a des grosses marques noir sur l'image, chose que je n'avais pas vu sur un autre ordinateur  ::?:   ::?:  Et en plus, on voit encore un maximum les points... C'est pas bon du tout ( moins que je me sois tromp)

*Super super edit :*  En fait, j'avais fait une erreur et a ne donne pas a  ::mrgreen::

----------


## millie

> Puisqu'on en est a donner des examples, il y a le logiciel/librairie open-source GREYCstoration.
> Les resultats sont vraiment bluffant. 
> Par contre je n'ai pas trouv d'info sur la methode de filtrage qu'ils utilisents (multi-valued diffusion Partial Differential Equations).
> 
> Pice jointe 10050



J'ai jett un oeil, c'est clair que les rsultats sont sympatiques. C'est une autre mthode base sur des quations aux drives partielles (filtre de choc). C'est utilis pour restauter des images  la fois flou, et  la fois bruite. Mais ils ont une mthode de rsolution qui semble rapide. 

On voit aussi qu'il y a des calculs de drive partielles de l'image  ::aie::  :


```

```

Il y a juste une formalisation du problme ici : ici. J'avais d'autre document pas mal, mais je ne les ai pas sous la main  ::(:  Je prcise que je n'ai jamais essay de l'implmenter.

----------


## millie

> *Super edit :*  Oula, je viens de voir qu'il y a des grosses marques noir sur l'image, chose que je n'avais pas vu sur un autre ordinateur   Et en plus, on voit encore un maximum les points... C'est pas bon du tout ( moins que je me sois tromp)



Bon, je les refais, j'avais fait une erreur dans le code, le filtrage ne donne pas a en fait  ::aie:: . 

Mais le rsultat est vraiment par terrible (pour rappel, c'tait un simple filtre passe bas dans l'espace de Fourier).

Pour la DWT conseill par pseudocode, j'ai eu la flemme de le faire vu que la transforme l n'est pas integr dans la bibliothque fftw (celle que j'utilisais pour faire la DFT).

----------


## kilrou

Bon malgr toutes ces techniques je vais essayer de faire simple donc d'utiliser la mthode de la mdiane, mais j'ai une petite question bte :

Imaginons que j'ai ma matrice de 3*3 :

* * *
* 2 *
* * * 

Comment je sais que tel pixels est le numro ime ?

Une 2me questions :

Une fois que j'ai rcuprer le pixels comment je rcupre sa valeur (niveau de gris) ?

Merci d'avance. :;):

----------


## pseudocode

> Pour la DWT conseill par pseudocode, j'ai eu la flemme de le faire vu que la transforme l n'est pas integr dans la bibliothque fftw (celle que j'utilisais pour faire la DFT).


J'ai test pour toi, et c'est pas terrible non plus. Ca retire bien le "grain" uniforme sur l'image mais ca laisse les "points" isols. Donc apres il faut repasser un filtre despeckle.

----------


## progfou

Pour supprimer un bruit impulsionnel, c'est un filtre mdian qu'il faut utiliser.
Pour le problme pos, un seuillage est largement suffisant.

Edit: j'avais pas vu la seconde page  ::oops::  .

----------


## progfou

> Bon malgr toutes ces techniques je vais essayer de faire simple donc d'utiliser la mthode de la mdiane, mais j'ai une petite question bte :
> 
> Imaginons que j'ai ma matrice de 3*3 :
> 
> * * *
> * 2 *
> * * * 
> 
> Comment je sais que tel pixels est le numro ime ?


Comment a ?
Le pixel numrot "2" dans ton exemple peut tre le 5me (en partant du premier point) ou avoir la coordonne (0,0) (en prenant comme origine en haut  gauche du filtre 3*3 (-1,-1)...




> Une 2me questions :
> 
> Une fois que j'ai rcuprer le pixels comment je rcupre sa valeur (niveau de gris) ?
> 
> Merci d'avance.


Euh, c'est  dire ?
Tu as un RGB en entre et tu veux le niveau de gris ?


```
Y 	= 0,299R + 0,587V + 0,114B
```

----------


## kilrou

Oui, en fait je ne vois pas le principe de numrotation pour pouvoir dire que tel pixel va devoir prendre la valeur mdiane de ceux qui l'entourent....

----------


## progfou

C'est trs simple en fait, le pixel qui prendra la valeur mdiane est celui situ au centre du bloc 3*3. Ce bloc part en haut  gauche de l'image, et se dplace d'une case vers la droite (passage  la ligne  chaque fois que l'on arrive  la largeur videmment).


```

```

p0  p9 sont les pixels sur lequel le filtre est appliqu, le pixel du milieu est le p5. A partir de l, c'est assez simple.
Evidemment, ce n'est qu'une criture trs simple d'une partie de l'algorithme, ce n'est pas implmentable tel que  ::): .

----------


## kilrou

Ha merci je vois, et une fois que j'ai rcuprer le pixel comment je peux faire pour connaitre le "dosage" des couleurs des pixels environnant? 

Merci.

----------


## progfou

C'est  dire ?
Comment sont codes tes images ?
Si tu as trois tableaux (R,G et B), les valeurs sont tries, par exemple, pour un mme canal (les valeurs R des pixels sont compares, puis les G, puis les B), mais a suppose trois filtres medians. Dans le cas propos ici, il vaut mieux commencer par convertir l'image en niveaux de gris, avec la formule donne un peu plus haut, puis les comparer sur la base des niveaux de gris.

----------


## kilrou

Ouais voila je me suis mal exprim, je ne rflchissais pas en niveau de gris mais en dosage des diffrentes couleurs de base... Donc je m'attaque  la transformation de l'image en niveau de gris, ce qui me parait plus ais a manipuler pour comparer ! Bon  la recherche de la formule !

Merci Progfou  ::):

----------


## kilrou

```

```

Bon je commence  implmenter la mthode, je ne sais pas si cela peut marcher car ce n'est qu'un commencement avant de l'insrer dans mon code final.

Je l'explique : j'essaie de convertir toute la page en niveau de gris, puis j'affecte a chaque pixel son niveau de gris.
Enfin je donne au pixel du milieu la valeur mdiane des pixels qui l'entourent...

Sachant qu'il y aura surement des fautes de syntaxe merci de me donner vos conseils. Merci  ::D:

----------


## Matthieu Brucher

1) Tu affectes et tu travailles en mme temps, pas la bonne ide du tout
2) Tu fais un filtre moyenne, pas mdian.

----------


## kilrou

Bon esprons que ces erreurs vont me permettent d'avancer... J'ai dj rectifi quelques lignes niveau syntaxe et assignement.

Comment je peux faire pour sparer l'affectation du travail ? Je fais une boucle pour affecter et une deuxime pour affecter?

Merci pour tes conseils.

EDIT:

"Je fais une boucle pour affecter et une deuxime pour affecter?"

Oula je viens de me relire, c'est pas trs claire, je voulaire dire une boucle pour passer en niveau de gris et une seconde pour affecter !! ^^

----------


## Matthieu Brucher

Tu n'as vraissemblablement pas le choix, je crois  :;):

----------


## kilrou

Par contre l mon gros soucis c'est la transformation en niveau de gris, je procde comme a :



```

```


mais niveau assignement, a passe pas (a cause des types) je comprends pourquoi mais je ne vois pas comment tranformer la synthaxe pour que les 2 types s'accordent  ::?:

----------


## Matthieu Brucher

tab est d'un certain type et tu essaies de le changer, a ne peut pas marcher avec un langage typ statiquement comme le C.

----------


## progfou

Je complte :  moins d'avoir une contrainte forte sur l'utilisation mmoire (je doute), il ne faut pas hsiter  crer un tableau supplmentaire qui contiendra les informations y uniquement.
Typiquement, dans ton cas, tab contiendra les valeurs r,g et b, et tu en cre un autre (tab_y, au hasard  ::):  ) qui n'aura qu'une seule composante, issue du calcul.

De plus, le calcul gnre un flottant ! En tout cas, dans la version que je vois crite. Tu peux utiliser celle-ci :


```
Y = (R + 2*G + B)/4
```

Elle est rapide (pas de flottants), et ne ncessite, a priori, pas de cast. Mais elle ne rpond pas  la norme. Cependant, elle est utilise en compression sans perte, et est efficace, en tout casn largement suffisante dans ton cas.

----------


## kilrou

Merci, il ne me reste plus qu' implmenter le traitement pour donner  mon pixel du milieu la valeur mdiane de la couleur des pixels environnant. Seulement, moi j'avais commenc  faire quelque chose :



```

```

Seulement comme me l'a fait remarqu Miles je fais un filtre moyenne et pas mdian. Donc si quelqu'un peut m'expliquer la diffrence, et a une ide de l'implmentation, je suis preneur. 

Merci d'avance.

----------


## Matthieu Brucher

Tu les classes et tu prends la valeur mdiane.

----------


## kilrou

Comme on dit mieux vaut tard que jamais, donc j'en profite pour vous remercier pour toutes ces rponses qui ont t bnfiques.

Kilrou.

----------

