2017-10-03 5 views
0

J'ai fait un système OCR de base dans Matlab en utilisant la corrélation. (Ce n'est pas un projet professionnel, seulement comme un exercice et je n'utilise pas la fonction ocr() de Matlab). Mon code fonctionne presque correctement pour les images de texte propre. Mais si je rends le travail un peu plus difficile (en prenant la photo de texte pour la position latérale avec l'angle) mon code ne donne pas de bons résultats. J'utilise l'analyse en composantes principales pour l'alignement correct du texte, mais si je le fais (en prenant une photo avec un angle), les caractères sont très proches et je ne peux pas les séparer pour le processus de reconnaissance.Comment séparer des caractères très proches dans une image binaire pour l'OCR dans matlab?

Image originale et après prétraiter (seuillage adaptatif, réglage, PCA)

Original Image and after preprocessing (adaptive thresholding, adjusting,PCA)

Comment puis-je séparer correctement les caractères?

+0

S'il vous plaît votre code, actuellement votre question est hors-sujet. – RobAu

+0

@RobAu: voir le code ne va pas aider. C'est une question de méthode. –

+0

@YvesDaoust Je ne suis pas d'accord. Je pense que le problème pourrait être dans le prétraitement, et actuellement nous n'avons aucun moyen de voir ce qui a été fait. – RobAu

Répondre

-1

Diviser des caractères est un problème assez difficile. A moins que les largeurs de caractères ne soient constantes (ce qui est le cas pour cette image mais peut ne pas l'être avec d'autres lettres), les méthodes basées sur l'analyse de projection (étendue verticale des caractères en fonction de l'abscisse) échoueront. En fait, pour qu'une méthode soit efficace, elle doit être sensible à la police, c'est-à-dire savoir à l'avance à quoi ressemble l'alphabet. En d'autres termes, vous ne pouvez pas séparer la segmentation de la reconnaissance.

Une possibilité est de tenter de décomposer le blob supposé être fait de caractères tactiles (éventuellement basés sur des projections ou des tailles de caractères connues), d'effectuer la reconnaissance et de vérifier les résultats de la reconnaissance. De préférence, essayez plusieurs décompositions et gardez le meilleur.

0

Une alternative à ce que suggère Yves est d'éroder l'image. Lequel est implémenté sous imerode dans matlab. Peut-être mettre à l'échelle l'image en premier (bien que ce ne soit pas nécessaire ici)

par exemple. avec ce code

ocr(imerode(I,strel('disk',3))) 

où I est votre "BOOLEAN" image noir-blanc, je reçois

ocrText with properties: 
        Text: 'BOOLEAN↵↵' 
CharacterBoundingBoxes: [9×4 double] 
    CharacterConfidences: [9×1 single] 
       Words: {'BOOLEAN'} 
    WordBoundingBoxes: [14 36 208 43] 
     WordConfidences: 0.5477