Python + OpenCV: ROC de la Segmentation d'Images
Je suis en train de faire de l'OCR à partir de ce jouet exemple de Recettes. À l'aide de Python 2.7 et OpenCV 3.1.
En niveaux de gris + Flou + Bord Externe de Détection + Segmentation de chaque secteur dans les Recettes (par exemple "Catégorie" à voir plus tard ce qui est marqué dans le cas présent de trésorerie).
Je trouve compliqué lorsque l'image est "biaisée" pour être en mesure de transformer et puis "automatiquement" segment de chaque segment de recettes.
Exemple:
Toute suggestion?
Le code ci-dessous est un exemple pour se rendre jusqu'à la détection de bord, mais lors de la réception, c'est comme la première image. Mon problème n'est pas l'Image au texte. Est le pré-traitement de l'image.
Toute aide plus apprécié! 🙂
import os;
os.chdir() # Put your own directory
import cv2
import numpy as np
image = cv2.imread("Rent-Receipt.jpg", cv2.IMREAD_GRAYSCALE)
blurred = cv2.GaussianBlur(image, (5, 5), 0)
#blurred = cv2.bilateralFilter(gray,9,75,75)
# apply Canny Edge Detection
edged = cv2.Canny(blurred, 0, 20)
#Find external contour
(_,contours, _) = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Vous devez vous connecter pour publier un commentaire.
Un tutoriel sur la première étape que vous avez décrit est disponible à pyimagesearch (et ils ont beaucoup de tutoriels en général)
En bref, comme décrit par Ella, vous devez utiliser
cv2.CHAIN_APPROX_SIMPLE
. Un peu plus robuste que la méthode serait d'utilisercv2.RETR_LIST
au lieu decv2.RETR_EXTERNAL
et puis trier les domaines, comme il se doit décemment de travail, même dans un fond blanc/si la page inscrit une plus grande forme à l'arrière-plan, etc.Venir à la deuxième partie de votre question, un bon moyen de segmenter les caractères serait d'utiliser le au Maximum stable extrémal région extracteur disponible dans OpenCV. Une mise en œuvre complète en RPC ici dans un projet que j'avais en aidant à récemment. Le Python de la mise en œuvre permettrait d'aller le long de la lignes de Code ci-dessous fonctionne pour OpenCV 3.0+. Pour le OpenCV 2.x la syntaxe, consultez en ligne)
Cela donne le résultat sous la forme
Maintenant, pour éliminer les faux positifs, vous pouvez simplement faire défiler les points de coques, et calculer le périmètre (somme de la distance entre tous les points adjacents dans des enveloppes[i], où les coques[i] est une liste de tous les points dans un convexHull). Si le périmètre est trop grand, le classer comme pas un personnage.
La diagnol à travers les lignes de l'image sont à venir, car la frontière de l'image est en noir. cela peut être tout simplement supprimé par l'ajout de la ligne suivante dès que l'image est en lecture (en dessous de la ligne 7)
qui donne à la sortie
L'option sur le haut de ma tête nécessite l'extraction des 4 coins de l'image inclinée. Ceci est fait en utilisant
cv2.CHAIN_APPROX_SIMPLE
au lieu decv2.CHAIN_APPROX_NONE
lors de la recherche de contours. Par la suite, vous pouvez utilisercv2.approxPolyDP
et j'espère rester avec les 4 coins de la réception (Si toutes vos images sont comme celui-ci alors il n'ya aucune raison pourquoi il ne devrait pas travailler).Maintenant utiliser
cv2.findHomography
etcv2.wardPerspective
de rectifier l'image en fonction de la source des points qui sont les 4 points extraites de l'image inclinée et les points de destination qui doit avoir la forme d'un rectangle, par exemple la pleine dimension de l'image.Vous trouverez ici des exemples de code et plus d'informations:
OpenCV-Transformations Géométriques des Images
Aussi cette réponse peut être utile - AFIN de Détecter et de corriger le texte d'inclinaison
EDIT: Corrigé de la deuxième chaîne env à
cv2.CHAIN_APPROX_NONE
.Prétraitement de l'image en convertissant le texte souhaité dans l'avant-plan à noir en tournant de fond indésirable à blanc peut aider à améliorer la précision de l'OCR. En outre, en supprimant les lignes horizontales et verticales peuvent améliorer les résultats. Voici l'image prétraitée après la suppression des bruits indésirables tels que les lignes horizontales et verticales. Remarque la disparition de la frontière et de la table de lignes de