J'ai cette image qui contient du texte (chiffres et alphabets). Je veux obtenir l'emplacement de tous les textes et nombres présents dans cette image. Je veux également extraire tout le texte.
Comment obtenir les coordonnées ainsi que tout le texte (chiffres et alphabets) de mon image. Pour par exemple 10B, 44, 16, 38, 22B etc.
python
opencv
machine-learning
image-processing
deep-learning
Pulkit Bhatnagar
la source
la source
Réponses:
Voici une approche potentielle utilisant des opérations morphologiques pour filtrer les contours non textuels. L'idée est:
Obtenez une image binaire. Charger l'image, niveaux de gris, puis le seuil d'Otsu
Supprimez les lignes horizontales et verticales. Créez des noyaux horizontaux et verticaux en utilisant
cv2.getStructuringElement
puis supprimez les lignes aveccv2.drawContours
Supprimez les lignes diagonales, les objets circulaires et les contours courbes. Filtre utilisant la zone de contour
cv2.contourArea
et l'approximation de contourcv2.approxPolyDP
pour isoler les contours non textuelsExtraire les ROI et l'OCR du texte. Trouvez les contours et filtrez les ROI puis l'OCR en utilisant Pytesseract .
Suppression des lignes horizontales surlignées en vert
Suppression des lignes verticales
Suppression des contours non textuels assortis (lignes diagonales, objets circulaires et courbes)
Régions de texte détectées
la source
D'accord, voici une autre solution possible. Je sais que vous travaillez avec Python - je travaille avec C ++. Je vais vous donner quelques idées et j'espère que si vous le souhaitez, vous pourrez mettre en œuvre cette réponse.
L'idée principale est de ne pas utiliser du tout le prétraitement (du moins pas au stade initial) et de se concentrer à la place sur chaque personnage cible, d'obtenir certaines propriétés et de filtrer chaque blob en fonction de ces propriétés.
J'essaie de ne pas utiliser le prétraitement car: 1) les filtres et les étapes morphologiques pourraient dégrader la qualité des blobs et 2) vos blobs cibles semblent présenter certaines caractéristiques que nous pourrions exploiter, principalement: le rapport d'aspect et la zone .
Vérifiez-le, les chiffres et les lettres semblent tous être plus grands que plus larges… en outre, ils semblent varier dans une certaine valeur de zone. Par exemple, vous souhaitez supprimer les objets "trop larges" ou "trop gros" .
L'idée est que je filtre tout ce qui ne correspond pas aux valeurs pré-calculées. J'ai examiné les caractères (chiffres et lettres) et suis venu avec des valeurs minimales et maximales de surface et un rapport d'aspect minimum (ici, le rapport entre la hauteur et la largeur).
Travaillons sur l'algorithme. Commencez par lire l'image et redimensionnez-la à la moitié des dimensions. Votre image est bien trop grande. Convertissez en niveaux de gris et obtenez une image binaire via otsu, voici en pseudo-code:
Cool. Nous allons travailler avec cette image. Vous devez examiner chaque goutte blanche et appliquer un "filtre de propriétés" . J'utilise des composants connectés avec des statistiques pour parcourir chaque blob et obtenir sa zone et son rapport d'aspect, en C ++, cela se fait comme suit:
Maintenant, nous allons appliquer le filtre des propriétés. Ce n'est qu'une comparaison avec les seuils pré-calculés. J'ai utilisé les valeurs suivantes:
Dans votre
for
boucle, comparez les propriétés de blob actuelles avec ces valeurs. Si les tests sont positifs, vous "peignez" le blob en noir. Continuer à l'intérieur de lafor
boucle:Après la boucle, construisez l'image filtrée:
Et c'est à peu près tout. Vous avez filtré tous les éléments qui ne sont pas similaires à ce que vous recherchez. En exécutant l'algorithme, vous obtenez ce résultat:
J'ai également trouvé les boîtes englobantes des blobs pour mieux visualiser les résultats:
Comme vous le voyez, certains éléments sont mal détectés. Vous pouvez affiner le "filtre des propriétés" pour mieux identifier les caractères que vous recherchez. Une solution plus approfondie, impliquant un peu d'apprentissage automatique, nécessite la construction d'un "vecteur de caractéristiques idéal", extrayant les caractéristiques des blobs et comparant les deux vecteurs via une mesure de similarité. Vous pouvez également appliquer un post- traitement pour améliorer les résultats ...
Quoi qu'il en soit, mec, votre problème n'est pas trivial ni facile à évoluer, et je vous donne juste des idées. Espérons que vous pourrez mettre en œuvre votre solution.
la source
Une méthode consiste à utiliser une fenêtre coulissante (c'est cher).
Déterminez la taille des caractères de l'image (tous les caractères sont de la même taille que celle indiquée dans l'image) et définissez la taille de la fenêtre. Essayez tesseract pour la détection (l'image d'entrée nécessite un prétraitement). Si une fenêtre détecte des caractères consécutivement, stockez les coordonnées de la fenêtre. Fusionnez les coordonnées et obtenez la région sur les personnages.
la source