J'essaie de détecter ces textes d'étiquettes de prix qui sont toujours clairement prétraités. Bien qu'il puisse facilement lire le texte écrit au-dessus, il ne parvient pas à détecter les valeurs de prix. J'utilise python bindings pytesseract bien qu'il échoue également à lire à partir des commandes CLI. La plupart du temps, il essaie de reconnaître la partie où le prix est un ou deux personnages.
Exemple 1:
tesseract D:\tesseract\tesseract_test_images\test.png output
Et la sortie de l'exemple d'image est la suivante.
je Beutel
13
Cependant, si je recadre et étire le prix pour donner l'impression qu'ils sont séparés et qu'ils ont la même taille de police, la sortie est très bien.
Image traitée (prix recadré et réduit):
je Beutel
1,89
Comment faire pour que l'OCS tesseract fonctionne comme je le souhaitais, car je vais parcourir de nombreuses images similaires? Modifier: Ajout de plus d'étiquettes de prix:
sample5sample6sample7
Le problème est que le moteur Tesseract n'a pas été formé pour lire ce type de topologie de texte.
Vous pouvez:
En général, les algorithmes de vision par ordinateur (y compris les CNN) vous donnent un outil pour avoir une représentation plus élevée d'une image (caractéristiques ou descripteurs), mais ils ne parviennent pas à créer une logique ou un algorithme pour traiter les résultats intermédiaires d'une certaine manière.
Dans votre cas, ce serait:
Le fait est qu'il est difficile d'y parvenir grâce à la formation, et en même temps, il est extrêmement simple d'écrire ceci pour un humain en tant qu'algorithme. Désolé de ne pas vous avoir donné d'implémentation réelle, mais mon texte est le pseudo-code.
Apprentissage conjoint non supervisé des représentations profondes et des clusters d'images
Le problème est que l'image que vous utilisez est de petite taille. Maintenant, lorsque tesseract traite l'image, il considère ' 8 ', ' 9 'et' , 'en une seule lettre et le prédit ainsi à' 3 'ou peut considérer' 8 'et' , 'comme une lettre et ' 9 ' comme une lettre différente et produit donc une sortie erronée. L'image ci-dessous l'explique.
Une solution simple pourrait être d'augmenter sa taille par un facteur de 2 ou 3 ou même plus selon la taille de votre image d'origine, puis de passer à tesseract pour qu'il détecte chaque lettre individuellement comme indiqué ci-dessous. (Ici, j'ai augmenté sa taille par un facteur de 2)
Ci-dessous est un simple script python qui résoudra votre objectif
import pytesseract
import cv2
img = cv2.imread('dKC6k.png')
img = cv2.resize(img, None, fx=2, fy=2)
data = pytesseract.image_to_string(img)
print(data)
Texte détecté:
je Beutel
89
1.
Maintenant, vous pouvez simplement extraire les données requises du texte et les formater selon vos besoins.
data = data.replace('\n\n', '\n')
data = data.split('\n')
dollars = data[2].strip(',').strip('.')
cents = data[1]
print('{}.{}'.format(dollars, cents))
Format souhaité:
1.89