Image de prétraitement pour Tesseract OCR avec OpenCV
Je suis en train de développer une Application qui utilise Tesseract pour reconnaître le texte à partir de documents prises par un téléphone cam. Je suis à l'aide d'OpenCV pour prétraiter l'image pour une meilleure reconnaissance, l'application d'un flou Gaussien et un Seuil de la méthode de binarisation, mais le résultat est assez mauvais.
Ici est l'image que j'utilise pour les tests:
Et ici l'image prétraitée
Ce que les autres filtre puis-je utiliser pour rendre l'image plus lisible pour Tesseract?
source d'informationauteur Mauricio
Vous devez vous connecter pour publier un commentaire.
J'ai décrit quelques conseils pour la préparation d'images pour Tesseract ici:
À l'aide de tesseract pour reconnaître les plaques d'immatriculation
Dans votre exemple, il y a plusieurs choses qui se passent...
Vous avez besoin pour obtenir le texte en noir et le reste de l'image blanche (pas l'inverse). C'est ce que la reconnaissance des caractères est à l'écoute sur. Niveaux de gris est ok, tant que le fond est surtout à plein blanc et le texte surtout plein de noir; les bords du texte peut être gris (crénelage) et que peut aider à la reconnaissance (mais pas nécessairement - vous devrez faire des essais)
L'une des questions que vous voyez n'est que dans certaines parties de l'image, le texte est vraiment de la "fin" (et les lacunes dans les lettres après seuillage), tandis que dans d'autres endroits, c'est vraiment "épais" (et les lettres de début de fusion). Tesseract ne sera pas comme ça 🙂 Cela arrive parce que l'image d'entrée n'est pas uniformément éclairé, de sorte qu'un seul seuil ne fonctionne pas partout. La solution est de faire "localement seuillage adaptatif" où un autre seuil est calculé pour chaque neighbordhood de l'image. Il y a beaucoup de façons de le faire, mais de vérifier par exemple:
cv2.adaptiveThreshold(...,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,...)
Un autre problème que vous avez est que les lignes ne sont pas droites. Dans mon expérience, Tesseract peut gérer un très limitée degré de non-droites (quelques pour cent de la distorsion de perspective, d'inclinaison ou de l'inclinaison), mais ça ne fonctionne pas vraiment avec ondulé lignes. Si vous le pouvez, assurez-vous que la source des images ont des lignes droites 🙂 Malheureusement, il n'existe pas de simples hors-the-shelf réponse à cette question; vous auriez à regarder dans la documentation de recherche et de mettre en œuvre l'un de l'état de l'art des algorithmes de vous-même (et open-source, si possible, - il existe un réel besoin pour une solution open source). Une recherche sur Google Scholar pour "ligne courbe ROC d'extraction" vous permettra de commencer, par exemple:
Enfin: je pense que vous feriez beaucoup mieux de travailler avec le python de l'écosystème (ndimage, skimage) qu'avec OpenCV en C++. OpenCV python wrappers sont ok pour des choses simples, mais pour ce que vous essayez de faire, ils ne seront pas faire le travail, vous aurez besoin de prendre beaucoup de pièces qui ne sont pas dans OpenCV (bien sûr, vous pouvez mélanger et assortir). La mise en œuvre de quelque chose comme la courbe de détection en C++ va prendre un ordre de grandeur plus que dans python (* ceci est vrai même si vous ne savez pas python).
Bonne chance!
J'ai écrit un module qui lit le texte dans l'Image, qui à son tour le traitement de l'image pour obtenir un résultat optimal de ROC, Le Texte De L'Image Lecteur .
Remarque: ce devrait être un commentaire d'Alex je réponds, mais c'est trop long donc je l'ai mis comme réponse.
de "Un Aperçu de la Tesseract OCR moteur, par Ray Smith, Google Inc." à https://github.com/tesseract-ocr/docs/blob/master/tesseracticdar2007.pdf
"Traitement suit une traditionnelle étape-par-étape
pipeline, mais certaines étapes sont inhabituels dans leur
jour, et éventuellement de le rester, même maintenant. La première étape est
une composante connexe d'analyse dans lequel les contours de
les composants sont stockés. C'était un calcul
cher conception d'une décision à la fois, mais avait un
avantage important: par l'inspection de l'imbrication de
les contours et le nombre d'enfants et petits-enfants
les contours, il est simple de détecter inverse de texte et
reconnaître aussi facilement que le noir-sur-blanc. Tesseract
a probablement été le premier moteur d'OCR capable de gérer
blanc-sur-noir de texte donc trivialement."
Il semble donc qu'il n'est pas nécessaire d'avoir le texte en noir sur fond blanc, et devrait être l'inverse aussi.