Des lecteurs comme vous aident à soutenir MUO. Lorsque vous effectuez un achat en utilisant des liens sur notre site, nous pouvons gagner une commission d'affiliation. En savoir plus.

Vous souhaiterez peut-être numériser un document pour économiser de l'espace physique ou créer une sauvegarde de sauvegarde. Quoi qu'il en soit, écrire un programme capable de convertir des photos de vos fichiers papier dans un format standard est une tâche dans laquelle Python excelle.

En utilisant une combinaison de bibliothèques appropriées, vous pouvez créer une petite application pour numériser des documents. Votre programme prendra une image d'un document physique en entrée, lui appliquera plusieurs techniques de traitement d'image et produira une version numérisée de l'entrée.

Préparation de votre environnement

Pour suivre cet article, vous devez être familiarisé avec le bases de Python. Vous devez également comprendre comment travailler avec la bibliothèque NumPy Python.

Ouvrez n'importe quel IDE Python et créez deux fichiers Python. Nommez un main.py et l'autre transform.py. Exécutez ensuite la commande suivante sur le terminal pour installer les bibliothèques requises.

instagram viewer

pip install OpenCV-Python imutils scikit-image NumPy

Vous utiliserez OpenCV-Python pour prendre l'entrée d'image et effectuer un traitement d'image. Imutils pour redimensionner les images d'entrée et de sortie. scikit-image pour appliquer un seuil sur l'image. NumPy vous aidera à travailler avec des tableaux.

Attendez que l'installation se termine et que l'IDE mette à jour les squelettes du projet. Une fois la mise à jour des squelettes terminée, vous êtes prêt à commencer à coder. Le code source complet est disponible dans un Référentiel GitHub.

Importation des bibliothèques installées

Ouvrez le fichier main.py et importez les bibliothèques que vous avez installées sur l'environnement. Cela vous permettra d'appeler et d'utiliser leurs fonctions si nécessaire.

importer cv2
importer imutils
depuis skimage.filters importer seuil_local
depuis transformer importer perspective_transform

Ignorez l'erreur générée sur perspective_transform. Il disparaîtra lorsque vous aurez fini de travailler sur le fichier transform.py.

Prendre et redimensionner l'entrée

Prenez une image claire du document que vous souhaitez numériser. Assurez-vous que les quatre coins du document et son contenu sont visibles. Copiez l'image dans le même dossier que vous stockez les fichiers du programme.

Passez le chemin de l'image d'entrée à OpenCV. Faites une copie de l'image d'origine car vous en aurez besoin lors de la transformation de la perspective. Divisez la hauteur de l'image d'origine par la hauteur à laquelle vous souhaitez la redimensionner. Cela maintiendra le rapport hauteur/largeur. Enfin, sortez l'image redimensionnée.

# Passer le chemin de l'image
original_img = cv2.imread('exemple.jpg')
copie = original_img.copie()

# La hauteur redimensionnée en centaines
rapport = original_img.forme[0] / 500.0
img_resize = imutils.resize (original_img, hauteur=500)

# Affichage de la sortie
cv2.imshow("Image redimensionnée", img_resize)

# Attendre que l'utilisateur appuie sur n'importe quelle touche
cv2.waitKey(0)

La sortie du code ci-dessus est la suivante :

Vous avez maintenant redimensionné la hauteur de l'image d'origine à 500 pixels.

Conversion de l'image redimensionnée en niveaux de gris

Convertissez l'image RVB redimensionnée en niveaux de gris. La plupart des bibliothèques de traitement d'images ne fonctionnent qu'avec des images en niveaux de gris car elles sont plus faciles à traiter.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Image grisée", gray_image)
cv2.waitKey(0)

Remarquez la différence entre l'image d'origine et celle grisée.

Le tableau coloré est devenu noir et blanc.

Application d'un détecteur de bord

Appliquez un filtre de flou gaussien sur l'image grisée pour supprimer le bruit. Appelez ensuite la fonction OpenCV canny pour détecter les bords présents dans l'image.

image_floue = cv2.GaussianBlur (image_gray, (5, 5), 0)
edged_img = cv2.Canny (blurred_image, 75, 200)
cv2.imshow('Bords de l'image', edged_img)
cv2.waitKey(0)

Les bords sont visibles sur la sortie.

Les bords avec lesquels vous travaillerez sont ceux du document.

Trouver le plus grand contour

Détecter les contours présents dans l'image délimitée. Triez-les par ordre décroissant en ne gardant que les cinq contours les plus grands. Rapprochez-vous du contour le plus grand avec quatre côtés en parcourant les contours triés.

cnts, _ = cv2.findContours (edge_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = triés (cnts, key=cv2.contourArea, reverse=Vrai)[:5]

pour c dans cnts :
péri = cv2.arcLength (c, Vrai)
approx = cv2.approxPolyDP(c, 0.02 * péri, Vrai)

si longueur (environ) == 4:
doc = environ
casser

Le contour à quatre côtés est susceptible de contenir le document.

Contour des quatre coins du contour du document

Entourez les coins du contour du document détecté. Cela vous aidera à déterminer si votre programme a pu détecter le document dans l'image.

p = []

pour d dans doc :
tuple_point = tuple (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)

cv2.imshow('Points d'angle encerclés', img_resize)
cv2.waitKey(0)

Implémentez l'encerclement sur l'image RVB redimensionnée.

Après avoir détecté le document, vous devez maintenant extraire le document de l'image.

Utilisation de Warp Perspective pour obtenir l'image souhaitée

La perspective Warp est une technique de vision par ordinateur pour transformer une image afin de corriger les distorsions. Il transforme une image en un plan différent vous permettant de voir l'image sous un angle différent.

warped_image = perspective_transform (copier, doc.reshape(4, 2) * rapport)
warped_image = cv2.cvtColor (warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Image déformée", imutils.resize (warped_image, hauteur=650))
cv2.waitKey(0)

Pour obtenir une image déformée, vous devez créer un module simple qui effectuera la transformation de perspective.

Module de transformation

Le module ordonnera les points des coins du document. Il transformera également l'image du document dans un plan différent et changera l'angle de la caméra en une prise de vue aérienne.

Ouvrez le fichier transform.py que vous avez créé précédemment. Importez les bibliothèques OpenCV et NumPy.

importer numpy comme np
importer cv2

Ce module contiendra deux fonctions. Créez une fonction qui ordonnera les coordonnées des points d'angle du document. La première coordonnée sera celle du coin supérieur gauche, la seconde sera celle du coin supérieur droit, la troisième sera celle du coin inférieur droit, et la quatrième coordonnée sera celle du coin inférieur gauche coin.

définitivementpoints_de_commande(points):
# initialisation de la liste des coordonnées à ordonner
rect = np. zéros ((4, 2), dtype = "float32")

s = pts.sum (axe = 1)

# le point en haut à gauche aura la plus petite somme
rect[0] = pts[np.argmin(s)]

# le point en bas à droite aura la plus grande somme
rect[2] = pts[np.argmax (s)]

calculer la différence entre les points, le
le point en haut à droite aura la plus petite différence,
alors que le bas à gauche aura la plus grande différence
diff = np.diff (pts, axe = 1)
rect[1] = pts[np.argmin (diff)]
rect[3] = pts[np.argmax (diff)]

# renvoie les coordonnées ordonnées
retour rectifier

Créez une deuxième fonction qui calculera les coordonnées des coins de la nouvelle image et obtiendra une vue aérienne. Il calculera ensuite la matrice de transformation de perspective et renverra l'image déformée.

définitivementperspective_transform(image, points):
# déballez les coordonnées commandées individuellement
rect = points_de_commande (pts)
(tl, tr, br, bl) = rect

calculer la largeur de la nouvelle image, qui sera la
distance maximale entre bas-droit et en bas à gauche
coordonnées x ou le haut à droite et coordonnées x en haut à gauche
largeurA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
largeurB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = max (int (largeurA), int (largeurB))

calculer la hauteur de la nouvelle image, qui sera la
distance maximale entre le coin supérieur gauche et coordonnées y en bas à gauche
hauteurA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
hauteurB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maxHeight = max (entier (hauteurA), entier (hauteurB))

construire l'ensemble des points de destination pour obtenir une prise de vue aérienne
dst = np.tableau([
[0, 0],
[largeur maximale - 1, 0],
[largeur maximale - 1, hauteur maximum - 1],
[0, hauteur maximum - 1]], dtype = "float32")

# calcule la matrice de transformation de perspective
transform_matrix = cv2.getPerspectiveTransform (rect, dst)

# Appliquer la matrice de transformation
warped = cv2.warpPerspective (image, transform_matrix, (maxWidth, maxHeight))

# renvoie l'image déformée
retour voilé

Vous avez maintenant créé le module de transformation. L'erreur sur l'import perspective_transform va maintenant disparaître.

Notez que l'image affichée a une vue aérienne.

Application d'un seuil adaptatif et enregistrement de la sortie numérisée

Dans le fichier main.py, appliquez le seuil gaussien à l'image déformée. Cela donnera à l'image déformée un aspect numérisé. Enregistrez la sortie de l'image numérisée dans le dossier contenant les fichiers du programme.

T = threshold_local (warped_image, 11, décalage=10, méthode="gaussien")
warped = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+'analyse'+'.png',voilé)

L'enregistrement de la numérisation au format PNG préserve la qualité du document.

Affichage de la sortie

Sortez l'image du document numérisé :

cv2.imshow("Image numérisée finale", imutils.resize (déformé, hauteur=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

L'image suivante montre la sortie du programme, une vue aérienne du document numérisé.

Comment progresser en vision par ordinateur

La création d'un scanner de documents couvre certains domaines essentiels de la vision par ordinateur, qui est un domaine vaste et complexe. Pour progresser dans la vision par ordinateur, vous devez travailler sur des projets intéressants mais stimulants.

Vous devriez également en savoir plus sur la façon dont vous pouvez utiliser la vision par ordinateur avec les technologies actuelles. Cela vous tiendra informé et vous donnera de nouvelles idées de projets sur lesquels travailler.