Straighten a poorly scanned text document with deskew

Share this post

Straighten up, why?

You need to recover data from previously scanned document. Obviously you immediately think of using an OCR ( see this article which shows how to use Tesseract )… but there you are, if your document is of good quality, it is not aligned correctly. he is askew! and your OCR cannot interpret its content.

This is quite normal, in fact you must first straighten the document so that it looks straight, ready for the application of this OCR. We will see in this article how to use Python and the deskew library.

The Python deskew library

What’s great about the Python universe is that there is a library for everything. After some quick research on your search engine you will certainly find quite a few begging to be tried.

I’ll show you one of the simplest: the deskew library which you can find here .

Installation is quick and easy (the underlying code is also quick, if you have time to look at it). For information, this library uses another much better known scikit-image library , which is also very useful for managing image data.

pip install deskew

Goal

The goal is rather simple, we need to retrieve the textual information from the following image:

Just to check what I told you in the introduction, let’s try to use Tesseract directly on this 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')
''

Indeed, Tesseract sees absolutely nothing!

Straighten the image with deskew

First of all, let’s import the necessary libraries:

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

Then create a small function that will allow us to straighten the 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)

This function is quite simple. The deskew library indeed encapsulates all the calls necessary for recovery … except perhaps the conversion to gray levels which is an essential step to detect tilt angles.

Then let’s create a small function to test and see the result (with matplotlib ) of our adjustments:

def display_avant_apres(_original):
    plt.subplot(1, 2, 1)
    plt.imshow(io.imread(_original))
    plt.subplot(1, 2, 2)
    plt.imshow(deskew(_original))

The result

I took a few tilted images to test the result. A first test with a tilt of 35 degrees clockwise:

display_avant_apres('img_35h.jpg')

Then with an inclination of 15 degrees counterclockwise:

display_avant_apres('img_15ah.jpg')

The result seems rather conclusive, doesn’t it? let’s try to use Tesseract now on this image:

io.imsave('output.png', deskew('img_35h.jpg'))
image1 = Image.open('output.png')
pytesseract.image_to_string(image1, lang='fra')
'Bonjour'

And There you go ! the result is the expected one.

You want to automate this type of task with the RPA Blue Prism … take a look at this article.

The video below shows the solution in action:

Share this post

Benoit Cayla

In more than 15 years, I have built-up a solid experience around various integration projects (data & applications). I have, indeed, worked in nine different companies and successively adopted the vision of the service provider, the customer and the software editor. This experience, which made me almost omniscient in my field naturally led me to be involved in large-scale projects around the digitalization of business processes, mainly in such sectors like insurance and finance. Really passionate about AI (Machine Learning, NLP and Deep Learning), I joined Blue Prism in 2019 as a pre-sales solution consultant, where I can combine my subject matter skills with automation to help my customers to automate complex business processes in a more efficient way. In parallel with my professional activity, I run a blog aimed at showing how to understand and analyze data as simply as possible: datacorner.fr Learning, convincing by the arguments and passing on my knowledge could be my caracteristic triptych.

View all posts by Benoit Cayla →

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub