IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

Lire un chiffre à partir de ses pixels


Sujet :

Traitement d'images

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut Lire un chiffre à partir de ses pixels
    Bonjour,

    Je suis à la recherche d'un algorithme pour répondre au besoin d'un de mes programmes.
    J'ai des petits rectangles de quelques pixels dans lesquels sont écrits des chiffres.
    Je voudrais que mon programme puisse reconnaitre les chiffres inscrits dans les rectangles à partir de la couleur des pixels.
    Cela consisterait donc en une fonction qui convertirait un chiffre "dessiné" sur une image en une variable entière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entier Convertir(Image monImage)
    Vous trouverez ci-dessous toutes les caractéristiques de la situation.
    Note: quand je parlerai du "blanc pur" il s'agit de la couleur blanche RVB=(255;255;255).

    • Les primitives du langage que j'utilise (le C/C++, pour info) me permettent de lire les couleurs RVB d'un pixel à partir de ses coordonnées (x;y). La lecture consiste en une extraction de 3 entiers entre 0 et 255 pour le rouge, le vert et le bleu.
    • Les rectangles font 20x25 pixels environs.
    • Les chiffres sont entre 0 et 99.
    • Les chiffres sont centrés dans le rectangle. Un même chiffre sera toujours à la même place.
    • Les chiffres sont écrits en blanc sur fond uni de couleur vert, bleu, rouge, ou noir. La teinte des couleurs de fond est constante et connue, donc facilement reconnaissable.
    • La police d'écriture des nombres est toujours la même.
    • Ce qui rends le décodage plus compliqué c'est que le tracé n'est pas parfait: il y a comme un léger flou sur les bords des chiffres qui va se mêler au fond. Il n'est donc pas possible d'enregistrer une matrice des pixels "blanc pur" de chaque chiffre pour les identifier. Il y a néanmoins quelques pixels de chaque chiffre qui reste constamment "blanc pur".

    J'ai déjà quelques idées pour commencer, comme par exemples stocker dans des matrices les pixels "blanc pur" pour les 10 chiffres (de 0 à 9). Ainsi on peut toujours comparer les pixels qui correspondent mais je ne suis pas sur que ça va suffire et être fiable, du fait du faible nombre de pixel.

    Existe-t-il un algorithme pour ce genre de décodage ?
    Une librairie C existe-t-elle ? En existe-t-il une qui puisse simplifier l'algorithme ?
    Sinon quelles méthodes privilégier ? Comment procéder ?

    D'avance merci à tous pour votre aide amicale.

    Cordialement,

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    pour la libraire C je ne sais pas, probablement
    autrement si j'ai bien compris tu cherche un truc dans ce style

    http://www.discover.uottawa.ca/~qche...ter_thesis.pdf

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Oui c'est exactement cela que je veux faire.

    A la nuance près que le cas dans lequel je me trouve est beaucoup plus simple: pas de rotation, pas de changement d'échelle ni de grosse perturbations.Utiliser des transformées de Fourier, des transformations complexes et autres technique de pointe me semble être une véritable usine à gaz pour le cas que je présente. Et pour terminer le code source donné à la fin est du code MATLAB que je ne peux que très difficilement exploiter.

    J'attends donc d'autre idées pour avancer sur le sujet :S

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Salut,

    Citation Envoyé par FabaCoeur Voir le message
    J'ai déjà quelques idées pour commencer, comme par exemples stocker dans des matrices les pixels "blanc pur" pour les 10 chiffres (de 0 à 9). Ainsi on peut toujours comparer les pixels qui correspondent mais je ne suis pas sur que ça va suffire et être fiable, du fait du faible nombre de pixel.
    Personnellement, c'est l'idée que je testerai en premier, ça ne sert à rien de sortir l'artillerie lourde alors qu'il n'y a "que" le flou introduit dans les images qui peut poser problème. La corrélation de ton image avec un ensemble de masques représentant les chiffres devrait donner un bon taux de reconnaissance. Pour le flou, tu peux peut-être essayer de jouer sur l'histogramme pour pour être sûr de démarquer les pixels appartenant au chiffre de ceux appartenant au fond (ou peut-être travailler sur une image binaire?).
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Tu confirmes bien ce que je pensais, je voulais avoir une confirmation avant de fabriquer fastidieusement toutes les matrices...
    Quand tu parles d'image binaire, il s'agit de convertir les images en "blanc pur" et "noir pur" et de comparer aux matrices des "blanc pur" des chiffres ? Il suffit de faire la moyenne RVB des pixels et vérifier si ca dépasse le seuil des 128 ?

    Je pensais dans ce cas là fournir un pourcentage de correspondance car il peut y avoir des erreurs. As-tu une idée pour calculer/estimer le taux idéal ?

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Par défaut
    Citation Envoyé par FabaCoeur Voir le message
    Tu confirmes bien ce que je pensais, je voulais avoir une confirmation avant de fabriquer fastidieusement toutes les matrices...
    Quand tu parles d'image binaire, il s'agit de convertir les images en "blanc pur" et "noir pur" et de comparer aux matrices des "blanc pur" des chiffres ? Il suffit de faire la moyenne RVB des pixels et vérifier si ca dépasse le seuil des 128 ?

    Je pensais dans ce cas là fournir un pourcentage de correspondance car il peut y avoir des erreurs. As-tu une idée pour calculer/estimer le taux idéal ?
    Tout cela dépend en grande partie de tes données...
    Pour le seuillage (la binarisation), il faut étudier tes images, regarder l'influence du flou sur le pixel "blancs purs", pour cela tu peux utiliser des les outils statistiques classiques (moyenne, écrat-type, ...) afin de déterminer la valeur de ton seuil.

    pour ton taux idéal, c'est un peu pareil, la reconnaissance dépendra de tes données et de tes matrices de chiffres, donc en faisant des tests, tu devrait avoir une idée du taux à atteindre pour être sûr d'avoir reconnu le bon chiffre.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Question tes images sous forme de chiffre entre [0-9], sont-elles toujours identiques?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    A priori, oui. Peut être quelques toute petite différences de couleurs dans les teintes, mais très faible. Une solution serait donc d'enregistrer les 100 matrices mais bon c'est très très fastidieux !

  9. #9
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    ou de chopper un sous ensemble de points blanc/noir pur qui ne changes pas et qui te permet de discriminer chacune de tes images

    un peu comme une signature.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Donc en fait en partant sur cette base il faudrait:
    • Déterminer une matrice de couleurs fixes (blanc pur, noir pur) pour chacun des nombres (et pas chiffre)
    • Balayer l'image avec cette matrice de gauche à droite pour trouver une/des correspondances
    • En effet dans le cas du chiffre "43", si on utilise la matrice du "3" il faut balayer en "survolant" le 4

    Cela ne s'annonce pas si simple entre les chiffres à 2 ou 1 nombre.

    Une autre solution est de faire 100 matrices mais ça me semble déjà très long de les faire de 0 à 9.

  11. #11
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    J'aurais tendance à proposer :
    • Adaptation (éventuelle) à une taille fixe et connue à l'avance, de référence (20x25 par exemple).
    • Binarisation de l'image à reconnaître.
    • Différence binaire entre l'image binarisée et une matrice de référence (10 matrices, de 0 à 9). L'image devient donc grisée à blanche sur fond noir (les deux fonds blancs s'annulent).
    • Calcul de l'intensité moyenne restante sur l'image sur les pixels non-noirs "pur", donc en éliminant le fond. Éventuellement, rajouter l'écart-type, mais c'est sûrement inutile.
    • Si l'intensité moyenne calculée est inférieure à une constante prédéfinie, l'image est reconnue. Sinon, on prends l'image ayant donné la plus faible intensité moyenne lors de la comparaison avec les 10 matrices de référence.

    Reste que c'est un poil long malgré tout, malgré le faible nombre de pixels. Toutefois, vu justement le faible nombre de pixels, je ne suis pas certain qu'une méthode plus complexe offrirait de meilleurs résultats : comparer/sommer 500 valeurs entières est très certainement plus rapide à faire que de calculer des fonctions mathématiques plus ou moins complexes pour obtenir une "signature" de chaque chiffre à reconnaitre...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par FabaCoeur Voir le message
    [*]Balayer l'image avec cette matrice de gauche à droite pour trouver une/des correspondances
    Tu peux passer dans l'espace de Fourier et faire une corrélation de phase, ca sera plus rapide.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Encore une fois, cela me semble d'une complexité un peu élevée face à celle du problème.
    Je vais essayer de prendre toutes les idées du topic et de développer ma fonction.

    Merci à tous pour vos solutions !

  14. #14
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    les valeurs des nombres allant de 0 à 99, ça n'en reste pas moins de simples chiffres de 0 à 9.
    Donc la première chose à faire dans ton imagette est de séparer les composantes connexes afin de séparer les chiffres. Tu réduis ainsi l'espace de recherche.

    Ensuite, vu que tes chiffres n'ont pas l'air de subir de grosses transformations :
    - mise à la même dimension (à toi de choisir laquelle).
    - transformation en niveaux de gris.
    - seuillage binaire (entropie par exemple).
    - séparation des composantes connexes.

    A partir de là, est ce que tu t'es renseigné sur les différents algorithmes utilisés dans les OCR ?

    Un k-plus proches voisin brute donnera de très bon résultat vu que tu ne travailles que sur quelques pixels (Surtout après séparation des composantes connexes).

    Si tu veux réduire les caractéristiques, un bon algorithme pour les OCR sont les "histogrammes de projections".
    Je te conseille aussi de compter le nombre de trous dans les formes, cela peut t'orienter grandement sur les chiffres.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire des chiffres avec les virgules
    Par stiko dans le forum C++
    Réponses: 4
    Dernier message: 19/07/2006, 23h04
  2. [Projet Jeu] - Lire un MP3 à partir d'un stream
    Par Leobaillard dans le forum Langage
    Réponses: 8
    Dernier message: 06/05/2006, 10h45
  3. Réponses: 3
    Dernier message: 31/12/2005, 09h06
  4. Comment Lire une valeur à partir d'un fichier XML en C++?
    Par Hamdi Hedhili dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 13/12/2005, 10h09
  5. [Servlet][EJB]lire un fichier à partir de mon bean
    Par kimausoleil dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/02/2004, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo