# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  faire un OCR

## bigbill

hello

je dois faire un OCR. Donc en partant d'une image, je dois pouvoir en extraire un texte.
Pour cela, je dois donc analyser l'image. 
Et la ? Je pense que pour m'y prendre,je dois faire une matrice de points, non ? cad analyser pixel par pixel si un pixel est noir ou pas, et renvoyer le rsultat dans cette matrice.  Ensuite essayer de reconnatre cette lettre mais c'est autre chose.

Est-ce que pour cette premire partie c  peu prs a ? Dites moi si je me trompe....

----------


## Le Furet

C'est une faon de faire. Ca marchera bien si ton texte est (par exemple) blanc et si tu es sr que le reste de l'image n'est pas blanc.

Sinon, tu auras des pixels parasite.

Il y a plus efficace mais plus compliqu. Par exemple, tu peux dcouper ton image en blocs 8*8 ou 16*16, appliquer une DCT (Discrete Cosine Transform : Tranforme en Cosinus Discret, celle utilis pour la compression JPEG), et regarder les blocs gardant de hautes valeurs pour les coefficients correspondant aux contours verticaux et horizontaux.

Il y a aussi un filtre charg de dtecter contours horizontaux et verticaux, je crois que c'est le filtre de Hough maisje peux dire une connerie, je me rveille juste.

Dans tous les cas, pour lapartie extraction ou la partie OCR, citeseer est ton ami  ::D:

----------


## Catbull

Il me semble que les algos de  reconnaissance de texte se base sur la logique flou...

----------


## bigbill

les algos se basant sur la logique floue ?
oula, c flou a......

quant  l'autre solution donne par le Furet (....), a me semble bien cho....
je crois que je vais rester sur mon ide    ::oops::  

alors comme a, oui, les pixels parasites  virer, je note....
 et aprs j'essaie de diffrencier les pixels noirs des pixels blancs, puis je dcoupe d'abord horizontalement (pour les lignes) puis verticalement (pour les lettres) en tenant compte que certaines peuvent tre plus grandes ou plus grosses.
Pour le principe, c tjs bon ? enfin, c une faon de faire ?

----------


## rbag

Pour ce que j'en sais des algos d'ocr, il me semble qu'il faut d'abord nettoyer l'image, supprimer les zones de non texte (images) et extraire les contours des lettres pour faciliter le travail de reconnaissance. Il faut ensuite sparer lettres par lettres le texte puis les analyser une par une dans un rseau de neurones pour rapprocher au plus du modle d'apprentissage.

Par contre pour sparer les lignes et chaque caractre, il faut prendre en compte que le texte n'est pas toujours scann trs droit et ventuellement corriger cela avant le traitement. Des mthodes pour amliorer la reconnaissance se basent sur des dictionnaires: une fois que le mot est reconnu, on cherche une correspondance dans un dictionnaire et si l'on ne le trouve pas, on repasse slectivement les lettres suspectes dans l'analyseur pour tomber sur un mot qui existe.

----------


## Le Furet

Dans tous les cas, l'OCR, le vrai, c'est un problme mathmatiquement pas vident du tout. Dj, quelle est ta source (scan ? Image numrique), ton type d'criture (manuelle, sujette  la dformation (cause scan) ou image faite par ordinateurs avec lettres propres et variant peu) ? 

Tu espres quelle efficacit ? 

Si tu veux un truc basique et qui doit dj tre assez rigolo  programmer, regarde les sources de Subrip, un programme qui sert  rcuprer les sous-titres des DVDs.

----------


## Catbull

J'ai dj travaill sur un logiciel de reconnaissance de forme. Le principe de reconnaissance tait le suivant :
- Identifier des critres de discrimination pour chaque forme  distinguer

Ces critres peuvent tre la circonfrence de objet (ou primtre), la surface, le diametre (ou la diagonale), la rotondit, le nombre de branches, le nombre d'lment, etc...

Si tu ne devais identifier que 2 lettres i et o par exemple un seul critre suffit : la rotondit par exemple. Pour 26 lettres (+tous les autres caractres) et 50 polices de caratress diffrentes il te faudra une combinaison de critre (pas vident  dfinir).

--> C'est de la logique floue : une lettre est plus ou moins un a, un b un c etc... par ce que cette lettre sera plus ou  moins ronde, allonge, convexe, concave, conique, triangulaire etc...

Comme le dit rbag, il faut faire un pr-traitement sur l'image afin de l'purer de retracer les contours, cloturer (ventuellement l'image), boucher les trous etc...

PS : La matrice de point dont tu parlais permet de calculer le primtre, la rondeur etc des lettres. La logique floue  n'intervient que dans ce que tu appelles une autre chose...   ::wink::

----------


## bigbill

ah oui, mais a, c autre chose .......

Pour rpondre dj au Furet, la source, c un scan. D'abord je vais essayer plus simple, avec des images faites par ordi et plus tard, si a marche bien, alors j'enchanerai avec les lettres manuscrites, qui je le suppose doit tre bien chiant  faire....

mais il faut dfinir tout seul les critres de reconnaissance ? je croyais que a fonctionnait avec un rseau de neurones. A savoir, faire passer  la machine un bon nombre de fois la lettre a, b, c ..... pour toutes les polices. Et aprs, faire passer la matrice de points ( donne par l'analyse de l'image ),  et la comparer avec ce que la machine a mmoris et le comparer. Je pensais justement que l'avantage du rseau de neurones tait qu'il apprenait tout tout seul....

----------


## Mac LAK

[Hypothse : OCR d'un texte dactylographi, scann assez proprement]

Par rapport aux conditions initiales, la premire chose  faire est effectivement de nettoyer l'image, et de la "mettre droite".
Pour a, tu peux utiliser la pente moyenne de la premire ligne, par exemple, ou les marges verticales si ton texte est assez bien justifi.

Pour le nettoyage, un seuillage pour commencer, suivi soit d'une segmentation, soit d'une suppression des pixels isols.

Aprs tout a, tu as un texte propre. Tu peux alors chercher les diffrentes lettres, ou pour tre plus prcis, pour chaque lettre de l'image, une zone rectangulaire englobant la lettre. Tu peux "extraire" ce rectangle de l'image d'origine, et ensuite appliquer l'algo de reconnaissance de ton choix.

1) Mthode primaire (voire primitive) : comparer, aprs mise  l'chelle, avec des caractres de rfrence obtenus par "impression" de chaque lettre de chaque fonte, la comparaison tant faite pixel par pixel. Le plus grand pourcentage de concordance a gagn. Ca marche bien si le texte est imprim avec une fonte installe sur ton PC. Ne pas oublier d'galiser les histogrammes avant la comparaison.

2) Mthode plus labore : Segmenter le caractre, chercher la squence de vecteurs composant le caractre.
Par exemple, un "H" est compos de 3 vecteurs, dont les tailles et directions relatives sont plus ou moins constantes. Tu prends un point d'origine (le dpart de segment le plus en haut  gauche par exemple), et tu cherches ces vecteurs pour les comparer  une base, obtenue elle aussi par analyse des caractres produits par les fontes sur ton PC (histoire d'alimenter un peu la base de connaissances de l'algo).
C'est une comparaison algbrique (diffrence de vecteurs) ou gomtrique, suivant comment tu le vois.

3) Raffinement : mthode 2), la reconnaissance passant via un rseau neuronal afin de pouvoir apprendre de nouveaux caractres. De toutes faons,  la base, a ne marchera proprement qu'avec une image segmente, j'ai des doutes sur un rseau neuronal bas sur une comparaison "bitmap" (la base de connaissances serait proprement monstrueuse !!!).

Quel que soit la mthode choisie, il faudra de toutes faons constituer une base de connaissances " la main"... Pour les comparaisons bitmap, tu peux  la limite de contenter de "tracer" la lettre de rfrence  la vole, la liste des fontes tant trie par frquence d'utilisation suivant les rsultats de l'OCR. Pour la base vectorielle, c'est plus difficile de le faire  la vole, la segmentation pouvant tre une opration assez longue => un programme de "compilation" de cette base peut tre requis pour obtenir des performances un minimum dcentes.

Par contre, il semble que tu aie une fausse ide d'un rseau neuronal : il n'apprend rien tout seul si tu n'en as pas dcid ainsi, le problme se rsumant souvent  coder intelligemment la base de connaissance de l'algo, et surtout  savoir l'augmenter sans la parasiter (ce qui induirait une dgnrescence de l'algo  court terme). Demande aux spcialistes des rseaux neuronaux, ils devraient te confirmer que ce n'est pas un problme trivial.

----------


## bigbill

ouille a faisait longtemps
dsl mais c seulement maintenant que je peux commencer  m'y mettre faute de temps....

bon, comme j'en suis encore qu'au tout dbut, je suppose que j'ai une image scanne nickel bien cadre, toute propre sans trace de chocolat dessus ( je bouffe bcp qd je travaille ...)
maintenant 1ere chose : je dois  prsent dtecter ce que sont des lignes ( horizontalement ) et aprs, ce que sont des lettres ( verticalement ) c bon ? 
mais bon, je vais d'abord me concentrer sur les lignes ( qui sera la base pour dtecter les lettres )
(j'ai dcouvert qu'on pouvait utiliser qqch qui s'appelait sdl et qui semble assez cool. )
Mais la pour les lignes, a risque d'tre cho, parce qu'il y a des lettres plus hautes ou plus basses que d'autres non ? comment on fait ?

----------


## Sub0

Salut!

Je te conseillerais de jeter un oeil sur les programmes disponibles (gratuits sur le net) pour t'en inspirer et de voir les options qu'ils possdent pour la reconnaissance... Par exemple, j'en ai un qui me permet de choisir une police true type qui se rapprocherait du texte  analyser... Le programme va alors se servir de cette police (vectorielle) pour le traitement... 

Bon courage, +

----------


## mat.M

> Par exemple, tu peux dcouper ton image en blocs 8*8 ou 16*16, appliquer une DCT (Discrete Cosine Transform : Tranforme en Cosinus Discret, celle utilis pour la compression JPEG), et regarder les blocs gardant de hautes valeurs pour les coefficients correspondant aux contours verticaux et horizontaux.


juste une question le Furet ( je ne suis pas un expert en maths ) :quel serait l'intrt de filtrer avec une DCT ??  ::D: 




> Quel que soit la mthode choisie, il faudra de toutes faons constituer une base de connaissances " la main"...


Yes tout  fait mais par exemple sous Windows on peut effectuer une comparaison avec les fontes disponibles ;




> supprimer les zones de non texte (images)


On est d'accord rbag ; mais qu'est ce qui me dit qu'un ensemble de pixels reprsente une lettre .
Pas vident d'enlever tous les pixels qui ne correspondant pas aux lettre proprement dit

----------


## Mac LAK

> Yes tout  fait mais par exemple sous Windows on peut effectuer une comparaison avec les fontes disponibles ;


Oui, mais il est risqu de ne se baser *que* sur les fontes disponibles sur le poste client : qui te dit que ce ne sera pas un Windows "minimal", sans les fontes installes par Office, par exemple ?
=> Il faut, sur une machine sur laquelle BEAUCOUP de fontes sont installes, "caractriser" chaque fonte (sans inclure cette fonte dans le programme, car a serait une copie illgale) => c'est a que j'appelle une "base de connaissance faite  la main".

----------


## bigbill

sans doute mais l en fait, vous me parlez tous "dj" de reconnaissance des caractres  ( qui sont donc dj prlevs du texte scann ). 
Mais pour l'instant j'en suis qu'au prlvement des caractres .... mm pas, j'en suis qu'au prlvement des lignes. Et comme je suis un peu lent  et un peu nul en programmation, je rflchis bcp, je passe du temps, mais a avance pas du tout !!! 
L, je pense regarder chaque ligne de pixels, voir si il y a un seul pixel noir, si oui, c que la ligne n'est pas termine, si il n'y en a pas, a veut dire que la ligne prcdent est termine, et que je peux renvoyer l'index de cette ligne ( et sa hauteur )
en plus j'essaie de faire a  l'aide de SDL ( que je peine  utiliser car tout juste dcouvert ) donc c pour a que je galre un peu....

mais  part a, le principe est bon ?

----------


## Le Furet

> Envoy par Le Furet
> 
>  Par exemple, tu peux dcouper ton image en blocs 8*8 ou 16*16, appliquer une DCT (Discrete Cosine Transform : Tranforme en Cosinus Discret, celle utilis pour la compression JPEG), et regarder les blocs gardant de hautes valeurs pour les coefficients correspondant aux contours verticaux et horizontaux.
> 
> 
> juste une question le Furet ( je ne suis pas un expert en maths ) :quel serait l'intrt de filtrer avec une DCT ??


C'est une mthode que j'ai lue dans un papier sur citeseer. L'ide est toute bte : les contours verticaux et horizontaux surreprsents dans les lettres de l'alphabet latin se traduisent par des coefficients anormalement hauts dans les coefs correspondant de la DCT. Tu fais un seuillage sur ces coefficients, tu obtiens un ensemble de blocs fortement susceptibles de contenir du texte.

Tu ne gardes que les blocs formant des lignes, et tu te retrouves avec une zone de l'image ayant de trs fortes chances de contenir du texte.

Je l'avais implment pour faire une petite appli permettant de retrouver les sous-titres sur une video avec des sous-titres incrusts (type fansub), a marchait trs bien, mme quand le sous-titre tait de la mme couleur que le fond, cas dans lequel une mthode "classique" (donner la couleur du texte a priori, et reprer les pixels de cette couleur) se fourvoyait lamentablement.

Ca a t la premire fois que le fait d'avoir fait autant de maths dans ma vie m'a paru pouvoir avoir une utilit   ::D:

----------


## SKZ81

Ton projet est quand mme trs ambicieux...
Un OCR pour du texte dactylographi, encore passe, mais pour du texte manuscript, quelqu'un qui se dfini d'



> un peu lent  et un peu nul en programmation


devrais savoir poser la barre moins haut.
Je parle en connaissance de cause, combien de fois j'ai pas eu envie de boire la mer avant de me rendre compte que tout ce que j'arrivais  faire c'tait de boire la tasse !!! Attention aux dceptions des  un trop-plein d'ambition...

Dans un premier temps, pour ton algo, tu devrais chercher la Bounding box optimale. C'est  dire le plus petit quadrilataire qui n'intersecte pas un caractre. Il ne faut pas oubli qu'il peut y avoir des rotations avec un scan ; donc il sera necessaire de BANIR l'hypothse selon laquelle la hauteur de la ligne en dbut et fin de ligne est gale...

----------


## Sub0

Effectivement, je suis aussi de ton avis SKZ81... mais bon, ce n'est pas un projet irralisable, il suffira d'tre persvrant et de travailler rgulirement... *Bigbill*, si tu ne l'as pas dj fait, je te conseil de faire une petite recherche sur Google. Perso, je bosse avec Delphi et j'ai pu trouver des choses trs intrressantes, voir des sources... Tu trouveras ci-dessous, une API permettant d'obtenir cette fonctionalit :
http://www.neoptec.com/public_html/produits/api/api.php

Et d'autres liens trouvs sur Google.
http://www.developpez.net/forums/viewtopic.php?t=96691
http://www.image-etc.com/produits/imagxpress.htm

Une ide par exemple, tu peux contacter des auteurs d'OCR qui sauront te conseiller... 
Bon courage, +

----------


## bigbill

ouais, je sais que la barre est un peu haute pour moi (et quand qqn se dfinit soi-mme comme nul c qu'il est vraiment nul ....)
mais cette barre, c pas moi qui l'ai pose ! en fait, c un devoir et je suis oblig de le faire. Evidemment je fais pas tout, c un travail de groupe ( heureusement .... les algorithmes de reconnaissances qui ont t proposs auparavant, j'ai bien l'impression que j'arriverai JAMAIS  un tel niveau ! )

ah et puis  propos, la feuille scanne que je traiterais, sera dj traite par un autre membre du groupe donc je suppose que tous les pb de rotation, hauteur de ligne dbut et fin .... sont rgls   ::D: 

en tout cas, a avance ( un peu )

----------


## ALEX77

La ralisation d'un OCR est quelque chose de TRES TRES difficile.   ::cry::  

Et je sais de quoi je parle vous pouvez me croire je m'y suis essay. 8) 

Celui qui m'a le plus fascin est FineReader, sa facilit de reconnaissance est dconcertante et  pleurer. Sur une page en 300 ppp, il faut le voir pour le croire. Les OCR ont depuis beaucoup progress pour atteindre la quasi perfection.

*Bigbill*, si tu peux essayer FineReader, tu comprendras la difficult de l'opration car il cela consiste en gros  :

-analyser la page : reprer les blocs de texte et les diffrencier des images
-remettre la page bien droite (deskewing pour le connaisseurs)
-analyser chaque bloc : segmenter les lignes, puis isoler les caractres, en sachant que dans certaines polices de caractres, certains caractres s'embotent les uns dans les autres (comme "Fin" par exemple en Times New Roman, le i est  l'intrieur du F)

La mthode que j'ai essay est proche de la tienne. En fait je n'ai pas besoin de deviner pour mon application la police de caractre  tester puique cette appplication rcupre des formulaire grce  un scanner  chargeur automatique et donc lorsqu'on cr un formulaire, on renseigne quelle police de caractre on va tester. Il faut fixer un taux de tolrance, et encore quelques paramtres comme le nombre le pixels minimum entre chaque caractre considrs comme des espaces, etc... mais a fonctionne pas trop mal.

*J'aimerais changer de mthode    et faire en sorte que le programme "squelettise" ou en dduise des courbes mathmathiques comme l encore c'est un secret bien gard. L'ide est de "squelettiser", d'en dduire des courbes et d'attribuer un poids  chacune de ces courbes, le score obtenu oriente le choix du caractre reconnu.

C'est la mthode d'analyse qui permet non seulement de reconnaitre des polices de caractres inconnues (sans avoir besoin comme dans le cas d'une analyse matricielle de renseigner celle qu'on doit tester) mais c'est celle ci qui est utilise par les logiciels du march tels qu'Omnipage, FineReader, etc... les pros quoi.

Si quelqu'un a des tuyaux moi aussi a m'intrresse de pouvoir faire a !*

Je vous mets quelques liens :

http://http.cs.berkeley.edu/~fateman/kathey/ code source en C++, projet OCRchie
http://jocr.sourceforge.net/download.html code source encore en C++, projet GOCR s'utilise en ligne de commande
http://web.mit.edu/stanrost/www/cs585p1/p1.html comment faire un OCR avec MatLab
http://www.efg2.com/Lab/ImageProcessing/index.html faire un OCR c'est aussi comprendre et manipuler les pixels, faire de l'image processing, ce site est une mine d'or pour la manipulation d'image en Delphi

En esprant que cela a pu vous tre utile.   ::wink::

----------


## bigbill

merciiii
les sites que tu m'a pass semblent bien clairs, bien cools, nickel.

 part a, ton autre mthode d'analyse, ben ... je suis trs mal plac pour te dire quoi que ce soit dessus.
 dsl  ::oops::

----------


## bigbill

bonjour 

a y est, j'ai non sans mal russi  avoir qq rsultats pour prlever des lignes ( je sais c peut tre facile pour vous mais bon, moi.... ).
Mais l, je vois un autre pb : 
en rgle gnrale, mon truc devrait marcher, mais a doit marcher pour tous les cas, mm les cas plus chiants. 
Par exemple, j'ai essay de prlever une ligne ne contenant que des i , ou que des  , bref, les lettres qui se dcomposent en deux parties. Et videmment, mon algo les sparent : la ligne de i est spare en une ligne de points, et une ligne de barres. C pas tout  fait ce que je veux .....

J'ai essay de faire des rapports de hauteurs, mais l encore, si il rsout ce pb, il en rajoute un autre.
Est-ce-qu'il une rgle spcifique pour la hauteurs des lettres ?
ou alors vous avez peut tre une autre solution ?

----------


## Mac LAK

> Est-ce-qu'il une rgle spcifique pour la hauteurs des lettres ?


Pas  ma connaissance.




> ou alors vous avez peut tre une autre solution ?


Plutt que d'isoler les lignes de lettres, qui peuvent tre variables en hauteur comme tu t'en es rendu compte, pourquoi ne pas plutt chercher la hauteur des interlignes, qui sont constantes, elles ? Ca me parat tre une piste intressante  suivre...

----------


## bigbill

> pourquoi ne pas plutt chercher la hauteur des interlignes, qui sont constantes, elles ?


ben je sais pas, par exemple, l'interligne n'est pas gal entre 2 lignes de hauteur maximale ( par exemple, une ligne contenant un f et un p minuscule ) et 2 lignes de hauteur minimale ( une ligne ne contenant que des a, e , i.....)

----------


## ALEX77

*Bigbill,* Tu dveloppes ton OCR avec quel langage dj ?

----------


## bigbill

en C, pkoi ?

----------


## Mac LAK

> ben je sais pas, par exemple, l'interligne n'est pas gal entre 2 lignes de hauteur maximale ( par exemple, une ligne contenant un f et un p minuscule ) et 2 lignes de hauteur minimale ( une ligne ne contenant que des a, e , i.....)


Si, elle est gale, c'est juste que tu n'as pas bien saisi ce qu'est l'interligne... C'est l'espacement entre les deux lignes "basses" de deux lignes conscutives, c'est  dire la ligne "virtuelle" sur laquelle sont "poses" les lettres.
Sur une lettre matricielle, a donne a :


```

```

En pratique, il "suffit" d'liminer les "pics" de pixels sur la partie infrieure de tes blocs de pixels, pour en dduire la ligne de rfrence. Tu dois pouvoir t'en sortir en reprant la ligne la plus basse *et* possdant le plus de pixels noirs.
Si tu fais la mme chose pour toutes les lignes, tu vas pouvoir calculer l'interligne moyenne de la page. Tu vas surtout pouvoir calculer les extrma de valeur de l'interligne : par exemple, si une majuscule est situe sous une lettre longue comme "f" ou "p", tu vas avoir une valeur proche du minima. Par contre, si tu as un point, une virgule ou autre caractre "bas" sous un caractre comme "" ou "", ou des guillemets, tu auras une valeur proche du maximum.

Aprs, tu vas donc avoir tes multiples blocs (un "i" tant constitu de deux blocs, comme un ""). Si deux blocs sont spars par moins de pixels en hauteur que la valeur moyenne de l'interligne (ou valeur minimale, suivant le raffinement du calcul de ce minimum), c'est qu'ils font partie du mme caractre.

Tu vois mieux ce que je veux dire ?

----------


## ALEX77

*Pour BigBill :*




> en C, pkoi ?


Parce que si tu m'avais dit Delphi j'aurais peut tre pu te filer un coup de main mais le C... j'y comprends que dalle   ::wink::  

Toujours est-il que tu sera plus avantag par rapport aux sites que je t'ai pass qui utilise le langage C pour les projets OCR qu'ils proposent. Car pour moi, j'ai eu du mal  comprendre la transcription C <--> Delphi.   :8O:

----------


## bigbill

aaaaa ok, 
trs interessant, enfin je veux dire que j'aurai pas du tout pens  a.
N'empche,  Mac LAK, t'as du te casser le cul  faire le schma, mais au moins j'ai mieux compris avec a. 

Bon, je retourne bosser a. 
Merci.

----------


## Mac LAK

> N'empche,  Mac LAK, t'as du te casser le cul  faire le schma, mais au moins j'ai mieux compris avec a.


Mme pas : vive UltraEdit et le fait d'avoir pas mal travaill avec les fontes bitmap...  ::mrgreen::  Enfin, si tu as compris, a me paie de l'effort ! ;-)

----------


## maamar

voila un lien  pour une thse tres interressante
"*Experiments in Image Segmentation for Automatic US License Plate Recognition*"

 ::arrow::  http://scholar.lib.vt.edu/theses/available/etd-07022004-132444/
 ::wink::

----------


## Mac LAK

> voila un lien  pour une thse tres interressante
> "*Experiments in Image Segmentation for Automatic US License Plate Recognition*"
> 
>  http://scholar.lib.vt.edu/theses/available/etd-07022004-132444/


Effectivement, cette thse est trs intressante... 
J'apprcie beaucoup moins son application ( ::furieux::  de radars automatiques !!!!), mais a n'enlve rien  l'intrt du document.

----------


## ALEX77

Peut tre trouverez vous votre bonheur dans ces documents (en espagnol) qui expliquent le fonctionnement d'un systme OCR :

http://www.cvc.uab.es/shared/teach/master/ocr1.pdf
http://www.cvc.uab.es/shared/teach/master/ocr2.pdf

Si quelqu'un arrive  faire une application en se basant l dessus, qu'il me contacte ! Apparement j'ai pas trouv plus complet comme documentation, il ya des shmas des illustrations... bref avec a, les OCR ne devraient plus avoir de secret pour les non initis. Mme si on ne trouve pas de code source, les thories y sont expliques.

En esprant que a vous sera utile.   ::D:

----------


## bigbill

oui c'est trs complet ....mais c en espagnol et c cho de comprendre ce qu'ils essaient de faire passer, 
dj que le truc en anglais, j'ai pas compris gd chose.....

----------


## bigbill

mac lac j'ai un trs trs gros pb ....  ::oops:: 

j'ai essay de faire ta mthode en calculant la ligne de "base" sur laquelle sont poses les lettres, mais j'ai bo y passer toute la journe, mon prog m'envoie chier  chq fois!! 
je suppose que tu sais lire le C : 
j'essaie de faire une fonction renvoyant la base d'une ligne, connaissant la limite haute [b}]y_haut[/b] d'une ligne, et sa limite basse *y_bas*( en pixel)

int calc_base(SDL_Surface *image, int y_haut, int y_bas)
{      
        int i;
	int max = y_haut;

 	for (i = y_haut; i < y_bas; i++)
  	{
   		if (ligne_nbnoir(image,max) <= (2*ligne_nbnoir(image,i+1)))
        	      max = i + 1;					
        }
        return (max);		
}

vala la fonction ligne_nbnoir(image, y) calcule le nbr de pixels sur l'image de la y-ime ligne.

par contre pour la condition if( ligne_nb.......)  si j'ai multipli par deux *ligne_nbnoir(image,i+1)*, c juste pour privilgier les lignes basses. C une meth trs bte je sais, et ne me demandez pas pkoi j'ai pris cette solution plutot qu'une autre, je sais pas.

En fait, j'essaie de garder l'index de la ligne possdant le plus de pixel. Mais  chaque fois, ce que la fonction me retourne, c *( y_bas - 1)*, a commence  me faire lgrement chier.... 

tu peux me guider un petit peu  ::):  ? c urgent !
et pour les autres, si vous avez une ide, ou que vous voyez une erreur ds mon code ( yen a forcment une  ::x:  ...)  , n'hsitez pas

----------


## Mac LAK

*[NOTE : Pense aux balises CODE /CODE stp]*




> mac lac j'ai un trs trs gros pb ....


Au vu de ta fonction, c'est normal, je pense. Et c'est Lak avec un "K".

Je vais utiliser des termes mathmatiques pour dcrire ce qu'il faut chercher :
- Pour chaque ligne de bas en haut, sur un nombre de lignes variable (disons 40  60% de la hauteur gnrale du bloc au maximum), il faut calculer le nombre de pixels "allums" de la ligne, mmoriser ce rsultat.Exemple : Sur un bloc initial de 100 pixels de haut (0..99), tu vas calculer a sur les lignes numrotes de 80  99 inclus, et ranger ce dcompte de pixels dans un vecteur [0..19]
- Ensuite, le but est de chercher soit une variation brutale du nombre de pixels, soit un maximum local.Sur l'exemple prcdent, on obtient a :

```

```

La premire colonne est l'indice de ligne, ensuite la ligne, la dernire est le nombre de pixels par ligne.
Report en graphique, le nombre de pixels par ligne donne a :

L, tu peux te rendre compte que tu as une courbe assez haute pour les lignes 2  8 incluses, puis une chute brutale pour la ligne 9.
Dans ton cas prcis, une fois ces donnes calcules (appelons PC[i] le nombre de pixels de la ligne "i"), il faut calculer les variations, c'est  dire pour chaque ligne i, la diffrence *(PC[i]-PC[i+1])*. On obtient un nouveau tableau VPC[], contenant ces variations. Bien sr, il n'y a pas de variation pour la dernire ligne.
Toujours dans l'exemple ci-dessus, on obtient : VPC = { -8, 0, -2, +6, -4, +2, +3, -12, +2 }
On cherche le "-12", et on peut l'identifier par le fait que non seulement cette valeur est plus leve que la prcdente, mais aussi plus leve que la suivante, c'est un "pic" ngatif. Il suffit de chercher la plus grande variation (en valeur absolue) *ngative*, et tu verras que sur ce tableau, c'est -12. Mais pour que ce soit "juste", il faut rester sur les lignes basses de ton bloc, sinon tu risques des fausses dtections.
- Une fois cette ligne de rfrence trouve, tu vas pouvoir, pour toutes les lignes de texte de la page, trouver la ligne de base correspondante. Il te suffit, ensuite, de faire une moyenne des diffrences de hauteur pour trouver la valeur moyenne de l'interligne (penser  liminer les valeurs aberrantes, par exemple au moyen d'une rgression linaire).




> if (ligne_nbnoir(image,max) <= (2*ligne_nbnoir(image,i+1)))


Je n'ai pas compris cette ligne : tu cherches un maximum "simple", le facteur 2 n'a rien  foutre l !!
De plus,  chaque fois tu prends un "i+1" dans tes indices, j'avoue que je ne comprends pas  quoi il sert (mis  part ralentir le code et ne pas traiter la ligne "y_haut"), et produire un effet de bord en dpassant la limite basse "y_bas". Bref, pas bon.

Je te le rpte : *il ne faut pas analyser tout le bloc*, mais seulement la partie basse, sinon le dbut des lettres ou les majuscules/minuscules vont perturber le calcul !

Je pense que ce type de calcul que tu as choisi est trop simpliste pour tre efficace, mais bon, c'est  tester quand mme : on a parfois de bonnes surprises, surtout si tu calcule ensuite l'interligne par une rgression linaire.
Cependant, j'aurais plutt crit un truc comme a :


```

```

Le parcours se fait de bas en haut, avec optimisation des appels  "ligne_nbnoir".




> En fait, j'essaie de garder l'index de la ligne possdant le plus de pixel. Mais  chaque fois, ce que la fonction me retourne, c *( y_bas - 1)*, a commence  me faire lgrement chier....


Comme tu as d t'en rendre compte sur mes explications ci-dessus, c'est un tout petit peu plus complexe, mais ce n'est pas terrible non plus.
J'ai beaucoup dtaill l'algo, mais on peut mchamment l'optimiser et tout faire en une seule passe. J'ai prfr m'attarder sur le principe pour que tu comprennes ce que j'avais en tte.

C'est un peu plus clair pour toi ?

----------


## bigbill

scuse Mac La*K*...
bon je viens juste de lire ton message, et je peux pas te dire si j'ai tout pig du premier coup, mais ya dj un truc bizarre : 

pour ton calcul de diffrence PC[i] - PC[i+1] , ton tablo VPC, ce serait pas plutt : 

{-8, 0, 2, -6, 4, -2, -3, 12, -2} ? 

puisqu'on cherche la valeur absolue max, a revient au mm, mais c'est juste histoire de savoir si j'ai carrment pas pig le truc, ou si c toi qui a fait des erreurs de calcul....

----------


## ALEX77

Encore un lien utile pour toi Bigbill :

http://www.loria.fr/~abelaid/Enseign...cours8-ocr.pdf

 ::lol::

----------


## bigbill

u, cool !!! ( parce qu'il est un franais )

merci, a va peut tre m'inspirer un peu plus

----------


## ALEX77

Ceci dit, mme les docs en espagnol (pour le peu que l'on essaye de traduire) sont dj de bonne qualit. Le seul inconvnient majeur c'est de comprendre la jargon mathmatique et les formules compliques et bien vdement de les adapter en algorithme... mais grce aux shmas et aux illustrations, on s'aperoit qu'il existe d'autres mthodes auxquelles on aurait pas pens...

*BigBill si ton problme est de trouver les caractres alors ceci devrait plus que jamais t'intresser :*

Pour sparer les caractres, il faut d'abord sparer les lignes. Dans l'hypothse o l'on connait dj le bloc d'image  analyser. On prend donc une zone de l'image de coordonnes TRect que l'on va "balayer".

Voici comment faire  ma faon :

-balayer de haut en bas l'image en fixant un seuil de pixels (1 ou 2) qui corresponds aux "pattes" des lettres, pixels, parasites. Chaque ligne compltement blanche ou qui a au maximum 1 ou 2 pixels est considre comme vide. Ds que l'on trouve une ligne "non vide", retenir dans une variable Y1 le premier point Y (l o commence la premire ligne non vide). On peut maintenant continuer jusqu' rencontrer une ligne vide et on retiendra Y2 la ligne de pixels juste d'avant : ce qui donnera un rectangle (0,Y1,[largeur de l'image],Y2)

Pour trouver les caractres, c'est  peu prs la mme chose sauf qu'il faut procder verticalement, de gauche  droite, on retient d'abord X1 puis X2. On peut donc en dduire grce aux coordones de la ligne, les rectangles correspondants  chaque caractre.

Il faut aussi pouvoir rogner les zones blanches autour du caractre afin de ne garder que le caractre aux bords du rectangle. Utiliser le mme procder en balayant horizontalement, de haut en bas puis de bas en haut, verticalement, de gauche  droite et de droite  gauche.

Au final, on peut ensuite comparer le caractre dans une matrice et afficher le rsultat. Mais l encore, il y a du boulot   ::wink:: 

Seuil de tolrance, espaces minimum entre caractre considrs comme espaces, ratio de L/H, etc...   ::arf:: 

Pour rsumer, les tapes les plus cruciales : Segmentation des caractres et mthode de reconnaissance.

----------


## Mac LAK

> pour ton calcul de diffrence PC[i] - PC[i+1] , ton tablo VPC, ce serait pas plutt :


Oui, je me suis trompationn... ;-) [Mauvaise Foi] C'tait pour voir si tu suivais, voyons !! [/Mauvaise Foi]

Par contre, le *sens* de variation a son importance, c'est pour a qu'il ne faut pas prendre la valeur absolue de la diffrence, mais bien la diffrence "normale", avec signe.

----------


## SKZ81

Et le fait d'avoir choisi ACP sur le graphique...
C'est une image subliminale ??   ::wink::

----------


## Mac LAK

> Et le fait d'avoir choisi ACP sur le graphique...
> C'est une image subliminale ??


 Pourquoi, a veut dire quoi "ACP" pour toi ?? C'est juste que ce sont des lettres faciles  dessiner, pas plus... Si j'avais voulu faire du subliminal, j'aurais fait 

```

```

  ::mrgreen::

----------


## SKZ81

Analyse en Composante Principale.
C'est utilis en reconnaissance des formes.

Le principe est le suivant :
Tu prend un nuage de points en 3D ou 2D, mais tu te rend compte que finalement ce nuage est globalement linaire. Alors tu trouve la droite qui correspond, et tu code un point comme son abscisse sur la droite. Ensuite la varience moyenne du nuage par rapport  la droite (l'inertie du nuage). Ca c'est l'apprentissage.
Pour la reconnaissance, tant donn un nouveau point, est-il d'ascisse et de distance (inertie par rapport  l'axe de rotation pour les physiciens) conforme au nuage en question. Si oui, il fait partie du nuage de point, nous l'avons *catgoris*, classifi, reconnu.



Vu que a marche en dimension n, on peut l'appliquer a des formes...


[edit]Vu que a sert  dectecter les invariant, pourquoi pas en reconnaissance de caractre?
Ceci dis c'est mathmatiquement assez lourd  mettre en place...[/edit]

----------


## bigbill

a y est, j'ai  peu prs russi  prlever des lignes.
Maintenant je passe au prlvement des lettres ....

----------


## Mac LAK

> Analyse en Composante Principale.
> C'est utilis en reconnaissance des formes.


Ah... Nous, on appelait a une "Transformation de Karhunen-Loeve"... ;-) L'appellation "ACP" tait la "sous-appellation", que nous n'utilisions qu'assez rarement... Mais c'est marqu aussi, j'viens de vrifier dans mes HTML de RF !  ::mrgreen::

----------


## ALEX77

> a y est, j'ai  peu prs russi  prlever des lignes. 
> Maintenant je passe au prlvement des lettres ....


As tu au moins lu ma mthode pour le prvlement des lignes et des lettres *BigBill* ?

J'espre que j'ai pas pris le temps d'crire tout a pour rien   ::wink:: 

Pour le prlvement, la mthode la plus simple c'est le balayage rapproch comme dans mon prcdent message.

Si tu as procd autrement, merci ne nous dire comme du as fait a m'intresse aussi   ::lol::

----------


## SKZ81

Mak LAK : +1   ::wink:: 

Mais -- pour la "sous-appellation"...   ::x:  
Sans rancune...   ::D:

----------


## bigbill

t'inquites, je lis *tout*, c sr !
euh... tu parlais de koi dj ? (la phrase que je viens d"crire c une blague hein ! t'nerves pas ...)
videmment que je lis tout, vu le niveau que j'ai, tout ce qui vient, a vient pas pour rien. 

mais pour le moment, je vais faire un petit break, juste pour dcompresser un petit peu. Et ce que je dois voir, c comment faire pour dtecter des caractres crits en italique...mais c pour plus tard

----------


## ALEX77

Si tu as russi  progresser dans tes prlvements tiens nous au courant.

Moi aussi j'aimerais changer de mthode de prlvement. Par exemple avec certaines fontes, quand on a des mots qui commencent par "Fi" on constate que le "i" est plac sous le "F" donc ma mthode (bien que primitive) face  ce problme traite (suivant le seuil de pixels minimum) les deux lettres comme tant un seul caractre et renvoie le bloc d'image correspondant  "Fi" au lieu de renvoyer conscutivement le "F" et le "i".

C'est pour a si tu fait des progrs, bah dcris au moins comment tu as russi  le faire.

----------


## bigbill

ouhlala a fait longtemps que j'ai pas touch  mon petit OCR, plus d'un mois...

pisque c les vacances, je vais continuer tiens.
Alors...si je me souviens bien, j'ai fini le prlvement des lignes, et je passe au prlvement des caractres.

bon, je vais repasser l'ensemble du topic en revue pour me mettre les ides en place, et c reparti !

----------


## bigbill

J'ai relu les qq docs que Alex77 a indiqu.
Soit dit en passant, j'ai appliqu exactement la mm meth que alex77 ( balayement )  pour extraire les lignes, sauf que j'ai rajout en plus le principe de '"l'interligne moyen" (qui m'a bcp troubl au nivo difficult,enfin bon ... )

donc pour essayer d'extraire les caractres, je suis tomb sous une doc d'Alex, et il a qqch qui m'a compltement terrifi : 



et je pense que vous comprenez pk.
Le i n'est pas seulement, comme l'avait dit alex, en dessous du f, il est carrment confondu avec lui...il ressemblerait presque  un A majuscule.
ya-t-il une mthode pour pouvoir les diffrencier qd mm ?

----------


## ALEX77

Pour rpondre  ta question bigbill pour le problme du :


il faut utiliser la mtode de "skeletization" avec l'algorithme de *Zhang Suen* qui permet de faire cela trs bien. Grce  cette mthode tu peux largement sparer les caractres qui se touchent. Si tu programmes en C, va voir sur sourceforge.net il y a un projet vec 1.1.5 (ou vectorize 1.1.5 je sais plus trs bien) il y a le code source qui permet de raliser l'algo de *Zhang Suen*.

*Mais cette mthode ne vaut que pour une analyse morphologique ou vectorielle. Donc pas ncessaire pour un approche matricielle o l'on compare deux bitmaps point  point.


Pourtant, j'y suis presque maintenant. Il ne me reste qu' "vectoriser" ce que j'ai "squeletizer". Ou mieux encore, en dduire le chemin du trac de la lettre skeletise c'est  dire dans l'ordre des points tels qu'on les aurait faits  main leve avec un stylo (et non dans l'ordre de la matrice).

C'est l qu'est toute l'ide : comparer les formes grce  un rseau de neurones. On aura auparavant appris au rseau la forme pour chaque lettre avec une fonte donne.

Suffit ensuite de comparer la matrice des points du caractre avec les matrices du rseeau neuronal.

Mon seul problme, est comme je l'ai dit de pouvoir constituer une matrice de points dans l'ordre du trac. Et l c'est beaucoup plus difficile.... si quelqu'un a une ide... ????
*

----------


## bigbill

je suis all voir un peu l'algo de Zhang Suen

mais c super long, j'ai la flemme de tout lire, et en plus j'ai pas le temps de le lire ( pisque je dois faire mon rapport assez tot )
mais en gros c koi la mthode de skeletization ?

moi j'ai discut un peu avec un membre de mon groupe, et on a trouv une mthode qui permet de sparer le f du i, mais pas qd ils sont colls, seulement quand la surface du i rentre dans la surface du f.

on va prendre un pixel  au milieu  d'une lettre, et on va regarder si les pixels autour sont noir ou pas. si oui, on continue avec les pixels autour avec la mthode des Graphes, et si un pixel n'est pas noir, on n'y va pas.  Comme a on peut sparer le f du i s'ils sont pas colls.

----------


## ALEX77

> mais en gros c koi la mthode de skeletization ?


Et bien voil un exemple :

la lettre i par exemple I majuscule  l'cran donnerait ceci :



```

```




> mais c super long, j'ai la flemme de tout lire


Oh c'est pas si long que a car mme moi qui n'aime pas trop le C++ il a bien fallut que je me le farcice et j'ai russit  l'adapter pour Delphi donc c'est pas si dr que a. Du moins pour la mise en place de la squeletisation.   ::wink::

----------


## ALEX77

http://www.ppgia.pucpr.br/~facon/Afi...oZhangSuen.pdf

En espagnol mais explique l'algo de Zhang-Suen.  :o

----------


## ALEX77

Voici un autre lien intressant que j'ai trouv qui numre diffrentes mthodes d'image processing. Il y en a pas mal...  :o 

http://www.mathnetbase.com/ejournals...toc.asp?id=888

----------


## bigbill

ah u, je vois  peu prs le truc avec ton dessin 

par contre, vite de mettre des trucs en espagnol, je comprend strictement rien. 
Tout ce que j'ai compris, au niveau de qq images,  c que l'algorithme fait des choses bizarres entre l'affinement ( ? ) du "X" et du "8", o les rsultats sont inverses  ceux qu'on voulait. 

C vrai qu'avec cette mthode, on distinguera mieux les lettres,  mais par exemple avec ton dessin du I ,  le rseau de neurones, lui ne reconnait que le premire version ( la version normale ) ou il sera capable ossi de reconnaitre le deuxime ( celui qui est tout fin ) ?

----------


## ALEX77

> par contre, vite de mettre des trucs en espagnol, je comprend strictement rien.


Tu prfrerais peut tre en chinois ou en russe ? J'te met les documents que je peux trouver et non pas que je veux. Sinon tu penses bien si je les trouvais en franais les mettrais.   ::wink::  




> C vrai qu'avec cette mthode, on distinguera mieux les lettres, mais par exemple avec ton dessin du I , le rseau de neurones, lui ne reconnait que le premire version ( la version normale ) ou il sera capable ossi de reconnaitre le deuxime ( celui qui est tout fin ) ?


  ::arrow::  Le but du rseau de neurones et de pouvoir comparer en calculant un delta. Bien videment c'est la deuxime version du I qui nous intresse dans ce cas de figure : on va le comparer  une autre lettre d'un bitmap gnr par une fonte et lui aussi squeletis. Donc on ne garde que l'essentiel des informations. Et on va le comparer autant de fois que ncessaire pour chaque lettre de l'alphabet. Celui qui obtient le plus grand score est le caractre retenu.

----------


## bigbill

euh dsl de te demander tant de trucs, 
mais tu pourrais m'expliquer grossomodo le principe d'affinement de Zhang suen ? 
juste pour voir si je peux me lancer dedans ou pas, ( c une piste assez intressante )
ou si je reste sur ma technique, qui fait moins de choses, mais quand mm plus simple pour moi.

----------


## ALEX77

> mais tu pourrais m'expliquer grossomodo le principe d'affinement de Zhang suen ? 
> juste pour voir si je peux me lancer dedans ou pas, ( c une piste assez intressante )


La skeletization Zhang suen tu veux plus d'infos la dessus ? Je croyais pourtant avec mon shma t'avoir largement clair   ::wink::  Mais bon disons qu'en gros a effectue plusieurs "passes" lorsque a scanne l'image et que a retourne une image compltement skelitise. Ne pas essayer avec une image autres que des lettres etc... car s'il y a trop de pixels noirs, a risque de prendre un moment   ::lol:: 




> ou si je reste sur ma technique, qui fait moins de choses, mais quand mm plus simple pour moi.


Ta technique je l'ai expriment et crois moi a fait bien longtemps que j'en cherche une autre ! Elle convient cependant lorsque l'on connait la police de caractre du papier imprim et sa taille, en particulier pour les chiffres car c'est plus pour ce genre de caractre que je m'tais lanc la dedans.

Maintenant si tu veux continuer ta technique, tu te heurteras  beaucoup d'obstacles comme le fait qu'il suffit qu'un caractre soit un peu numris de travers pour que la comparaison n'aboutisse pas... il faut aussi stretcher l'image du caractre numris  l'image du caractre gnr, effectuer un AutoCrop... tout a il y a bien longtemps que a fonctionne chez moi mais c'est un systme trop limit...

L'approche neuro vectorielle est celle mise en place dans les OCR du march.

*Tu veux un bon exemple d'un bon OCR ? regardes (je sais pas si tu as dj entendu parl) SimplyOCR ou WOCAR. Il est gratuit ce petit programme et trs rapide. Bien dommage qu'il n'y ai pas le code source mais on comprend pourquoi aussi... faire un OCR c'est pas facile donc on a pas forcment envie de donner aux autres des mois et des mois de travail de recherche etc... Toujours est-il que ce petit programme si tu le teste, tu verras qu'il n'y a pas de fonte  tester. C'est le programme qui analyse tout seul les caractres.  *

----------


## bigbill

> La skeletization Zhang suen tu veux plus d'infos la dessus ? Je croyais pourtant avec mon shma t'avoir largement clair


nan c pas a, la skeletization, j'ai pig ce que a fait 

ce que je veux savoir, c *comment* on fait pour skeletizer, 
a veut dire koi que a fait plusieurs passes qd a scanne l'image...

dsl de rien comprendre

----------


## ALEX77

Si tu veux vraiement piger ce que a fait, va voir vec 1.1.5 sur sourceforge.net et regardes l'unit skeletize.
http://sourceforge.net/project/showf...kage_id=102521

Tu trouveras ces fonctions :


```

```

----------


## bigbill

j'ai fait encore qq recherches sur ces algo d'affinement et je suis tomb sur plusieurs trucs.

En gros, il faut connaitre l'algo du "hit-and-miss". C ce qu'il fo utiliser pour faire l'amincicement d'une lettre. 
Je sais pas si c a qu'utilise l'algo de Zhang suen, vu que je l'ai pas super compris. C peut tre la mm chose, je sais po ....

Tu connais le "hit-and-miss" alex ?

----------


## ALEX77

Non je connais pas le hit and miss mais essayes ce code c'est l'algo de Zhang Suen. Disons qu'en gros a garde que le squelette des lettres d'o le nom de cette opration : la squeletisation. En tout cas a fonctionne chez moi. La preuve en images :

avant :


aprs :


Si a marche pour moi pourquoi pas pour toi ? C'est pas si compliqu  mettre en place et comme je te l'ai dis si tu programmes en C, tu sera plus avantag que moi car je programme en Delphi. Donc tu ne devrais pas trop rencontr de problmes pour comprendre les projets que j'ai mis en liens sur ce sujet.   ::wink::

----------


## bigbill

tu peux me faire voir ce que a donne pour le "fi" en Times new roman ? ( c une des polices pour lesquelles ces 2 lettres sont colles ) 
en une police assez grosse

c juste pour vrifier .....

----------


## ALEX77

comme tu peux le constater avec certaines tailles le f et le i ne se touchent pas toujours.

J'espres que a rpond  ta question.  ::wink::

----------


## bigbill

a mes questions  : OUI
a mes attentes : NON

je croyais que a les sparerais compltement, moi...  ::cry::

----------


## ALEX77

Par exemple avec le mot "fin". Si vraiement ton souci est d'viter que le programme ne considre fi comme un seul caractre lors de la segmentation, autant envisager la comparaison de ce bloc non ? Tu crer un bitmap gnr "fi" et lorsque le programme fera la comparaison, il trouvera que c'est plus adapt et te renverra deux lettres au lieu d'une fausse : "fi".

Aprs, la mthode de skeletization, c'est utile uniquement si tu souhaites extraire des vecteurs, courbes mathmatiques mais pas dans le cas d'une analyse matricielle.   ::lol::

----------


## ALEX77

Pour ceux que a intresse, voici un article que j'ai scann dans un vieux numro SVM de 1993.

Y est expliqu comment fonctionne un OCR, 6 pages :

http://grosalex.free.fr/images/ocr/a...VM-1993-01.jpg
http://grosalex.free.fr/images/ocr/a...VM-1993-02.jpg
http://grosalex.free.fr/images/ocr/a...VM-1993-03.jpg
http://grosalex.free.fr/images/ocr/a...VM-1993-04.jpg
http://grosalex.free.fr/images/ocr/a...VM-1993-05.jpg
http://grosalex.free.fr/images/ocr/a...VM-1993-06.jpg

J'espre que vous y trouverez votre inspiration, surtout toi *BigBill*  ::wink::

----------


## Le Furet

Pour le f et le i qui sont colls, il faut savoir que souvent, c'est fait exprs ! En typographie, a s'appelle une ligature, c'est--dire un caractre qui en combine 2 (ou plus).

Si vous regardez les tables de caractres d'une police truetype ou postscript, vous verrez quelque part qu'un caractre correspond au doublet "fi" (vous en trouverez aussi pour "ff", "fl", plus rarement pour "ffi", "ffl", "ct", "st", voire d'autres).

Ca veut donc dire que dans un OCR, il faut prvoir non seulement les lettres simples, mais aussi certains doublets.

----------


## aydin24alain

Et au final a marche ou pas ???

----------


## julienber

ou en etes vous ? quelqu'un aurait-il un code ?

----------


## pretyy

> La ralisation d'un OCR est quelque chose de TRES TRES difficile.   
> 
> Et je sais de quoi je parle vous pouvez me croire je m'y suis essay. 8) 
> 
> Celui qui m'a le plus fascin est FineReader, sa facilit de reconnaissance est dconcertante et  pleurer. Sur une page en 300 ppp, il faut le voir pour le croire. Les OCR ont depuis beaucoup progress pour atteindre la quasi perfection.
> 
> *Bigbill*, si tu peux essayer FineReader, tu comprendras la difficult de l'opration car il cela consiste en gros  :
> 
> -analyser la page : reprer les blocs de texte et les diffrencier des images
> ...


Salut
Mon sujet de recherche set la reconnaissance d'criture rabe imprim AOCR  ::calim2:: le lien d'OCR sous matlab ne fonctionne pas...Est ce que vous pouvez m'aider par un lien d'OCR sous matlab.Essentiellement, la segmentation en caractre de l'criture cursive  :8O: 
Merciiii

----------


## Black_Templar

Dommage ce trou de 10 annes. Quelqu'un aurait-il dbouch ?

----------


## Flodelarab

Bonjour,

(je n'ai pas lu la discussion)



> La ralisation d'un OCR est quelque chose de TRES TRES difficile


 Pas forcment. J'avais commenc  faire, navement, comme Billbill, un petit module de reconnaissance de caractre en calculant la probabilit que ce soit une lettre plutt qu'une autre,  partir d'une grille noire et blanche. Cela marchait trs bien. Trop bien en fait. Car comme il s'agissait de lire une page web, le texte tait toujours crit de lettres parfaites, et l'aspect "proba" ne servait  rien. La connaissance de points "pertinents" taient suffisants.

Bref, ce n'est pas forcment difficile.

----------


## Black_Templar

Bonjour Flodelarab,

j'ai galement besoin d'un petit module d'OCR. Je n'ai en revanche pas particulirement envie de rcrire un programme utilisant les rseaux de neurones ou des chaines de Markov caches.

J'ai une image BitMap d'environ 350 par 400 contenant quelques lignes de texte (moins de 10). Je cherche  rcuprer ces donnes. J'ai mis l'image en noir et blanc, supprimer le bruit et dcouper le bloc en lignes de caractres et les lignes en caractres. J'en suis donc  l'envoi d'un caractre sous forme d'un petit bout de Bitmap  une fonction qui me renverrait le caractre.

Je vais donc constituer un dico contenant les 26 minuscules, les 26 majuscules, les 10 chiffres et les caractres spciaux. Si la fonction ne reconnait pas le texte, elle demande  l'utilisateur et stocke cette connaissance. C'est naf, mais simple.

J'aimerais en savoir plus sur ceci :




> La connaissance de points "pertinents" taient suffisants.

----------


## Flodelarab

Exemple: Si le point de coordonnes (23;17) est blanc pour a b o et noir pour les autres, alors tu n'as pas besoin de tester tous les points de ton rectangle. Seul ce point pertinent est ncessaire. 
Si tu es dans ce cas de lettre parfaitement (et systmatiquement) dessine, tu gagnes tu temps en analyse. Une simple dichotomie suffit.

----------

