Redresser, pourquoi ?
Vous devez récupérer les données provenant de document préalablement scannés. Evidemment vous pensez immédiatement à utiliser un OCR (Cf. cet article qui montre comment utiliser Tesseract) … mais voilà, si votre document est de bonne qualité, il n’est pas aligné correctement. il est de travers ! et votre OCR n’arrive pas à interpréter son contenu.

C’est tout à fait normal, en fait il faut au préalable redresser le document afin qu’il se présente de manière droite, prête à l’application de cet OCR. Nous allons voir dans cet article comment utiliser Python et la librairie deskew.
La librairie Python deskew
Ce qui est génial avec l’univers Python c’est qu’il y a une librairie pour tout. Après quelques recherches rapide sur votre moteur de rechercher vous en trouverez certainement un certain nombre qui ne demandent qu’à être essayé.
Je vais vous montrer l’une des plus simple : la librairie deskew que vous pouvez trouver ici.
L’installation est simple et rapide (le code sous-jacent l’est aussi d’ailleurs, si vous avez le temps regardez le). pour information, cette librairie utilise une autre librairie bien plus connue scikit-image, qui est aussi très pratique pour gérer des données images.
pip install deskew
Objectif
L’objectif est plutôt simple, nous devons récupérer l’information textuelle de l’image suivante :

Histoire de vérifier ce que je vous disais en introduction, essayons d’utiliser directement Tesseract sur cette image :
try:
from PIL import Image
except ImportError:
import Image
import pytesseract
image1 = Image.open('img_35h.jpg')
pytesseract.image_to_string(image1, lang='fra')
''
En effet, Tesseract ne voit strictement rien !
Redressons l’image avec deskew
Avant tout importons les librairies nécessaires :
import numpy as np
from skimage import io
from skimage.transform import rotate
from skimage.color import rgb2gray
from deskew import determine_skew
from matplotlib import pyplot as plt
Puis créons une petite fonction qui nous permettra de redresser l’image :
def deskew(_img):
image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, resize=True) * 255
return rotated.astype(np.uint8)
Cette fonction est plutôt simple. La librairie deskew encapsule en effet tous les appels nécessaire au redressement … excepté peut être la conversion en niveaux de gris qui est une étape indispensable pour détecter les angles d’inclinaison.
Créons ensuite une petite fonction pour tester et voir le résultat (avec matplotlib) de nos redressements :
def display_avant_apres(_original):
plt.subplot(1, 2, 1)
plt.imshow(io.imread(_original))
plt.subplot(1, 2, 2)
plt.imshow(deskew(_original))
Le résultat
J’ai pris quelques images inclinées pour tester le résultat. Un premier test avec une inclinaison de 35 degrés dans le sens horaire :
display_avant_apres('img_35h.jpg')

Puis avec une inclinaison de 15 degrés dans le sens anti-horaire :
display_avant_apres('img_15ah.jpg')

Le résultat semble plutôt concluant n’est-ce pas ? essayons d’utiliser Tesseract maintenant sur cette image :
io.imsave('output.png', deskew('img_35h.jpg'))
image1 = Image.open('output.png')
pytesseract.image_to_string(image1, lang='fra')
'Bonjour'
Et voilà ! le résultat est bien celui attendu.
La vidéo ci-dessous montre la solution en action :
Ingénieur en informatique avec plus de 20 ans d’expérience dans la gestion et l’utilisation de données, Benoit CAYLA a mis son expertise au profit de projets très variés tels que l’intégration, la gouvernance, l’analyse, l’IA, la mise en place de MDM ou de solution PIM pour le compte de diverses entreprises spécialisées dans la donnée (dont IBM, Informatica et Tableau). Ces riches expériences l’ont naturellement conduit à intervenir dans des projets de plus grande envergure autour de la gestion et de la valorisation des données, et ce principalement dans des secteurs d’activités tels que l’industrie, la grande distribution, l’assurance et la finance. Également, passionné d’IA (Machine Learning, NLP et Deep Learning), l’auteur a rejoint Blue Prism en 2019 et travaille aujourd’hui en tant qu’expert data/IA et processus. Son sens pédagogique ainsi que son expertise l’ont aussi amené à animer un blog en français (datacorner.fr) ayant pour but de montrer comment comprendre, analyser et utiliser ses données le plus simplement possible.
Merci pour cet article très utile, qui m’a permis de redresser par mal de documents automatiquement. Reste le problème des marges. Existe-t-il une solution afin de cadrer automatiquement toutes les pages selon le même format ?
bonjour,
ayant eu une valeur d’angle à None pour un image générée par package ‘pdf2image’, j’ai modifié la fonction comme ci-dessous et qui ne génère plus d’erreur :
def deskew(_img):
image = io.imread(_img)
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
print(angle)
if angle == None:
angle = 0.0
rotated = rotate(image, angle, resize=True) * 255
return rotated.astype(np.uint8)