Skip to main content

Skew detection and correction in images containing text

Project description

Deskew

Note: Skew is measured in degrees. Deskewing is a process whereby skew is removed by rotating an image by the same amount as its skew but in the opposite direction. This results in a horizontally and vertically aligned image where the text runs across the page rather than at an angle.

The return angle is between -45 and 45 degrees to don't arbitrary change the image orientation.

By using the library you can set the argument angle_pm_90 to True to have an angle between -90 and 90 degrees.

Skew detection and correction in images containing text

Image with skew Image after deskew
Image with skew Image after deskew

Installation

You can install deskew directly from pypi directly using the following comment

python3 -m pip install deskew

Or to upgrade to newer version

python3 -m pip install -U deskew

Cli usage

Get the skew angle:

deskew input.png

Deskew an image:

deskew --output output.png input.png

Lib usage

With scikit-image:

import numpy as np
from skimage import io
from skimage.color import rgb2gray
from skimage.transform import rotate

from deskew import determine_skew

image = io.imread('input.png')
grayscale = rgb2gray(image)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, resize=True) * 255
io.imsave('output.png', rotated.astype(np.uint8))

With OpenCV:

import math
from typing import Tuple, Union

import cv2
import numpy as np

from deskew import determine_skew


def rotate(
        image: np.ndarray, angle: float, background: Union[int, Tuple[int, int, int]]
) -> np.ndarray:
    old_width, old_height = image.shape[:2]
    angle_radian = math.radians(angle)
    width = abs(np.sin(angle_radian) * old_height) + abs(np.cos(angle_radian) * old_width)
    height = abs(np.sin(angle_radian) * old_width) + abs(np.cos(angle_radian) * old_height)

    image_center = tuple(np.array(image.shape[1::-1]) / 2)
    rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0)
    rot_mat[1, 2] += (width - old_width) / 2
    rot_mat[0, 2] += (height - old_height) / 2
    return cv2.warpAffine(image, rot_mat, (int(round(height)), int(round(width))), borderValue=background)

image = cv2.imread('input.png')
grayscale = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
angle = determine_skew(grayscale)
rotated = rotate(image, angle, (0, 0, 0))
cv2.imwrite('output.png', rotated)

Debug images

If you get wrong skew angle you can generate debug images, that can help you to tune the skewing detection.

If you install deskew with pip install deskew[debug_images] you can get some debug images used for the skew detection with the function determine_skew_debug_images.

To start the investigation you should first increase the num_peaks (default 20) and use the determine_skew_debug_images function.

Then you can try to tune the following arguments num_peaks, angle_pm_90, min_angle, max_angle, min_deviation and eventually sigma.

Inspired by Alyn: https://github.com/kakul/Alyn

Contributing

Install the pre-commit hooks:

pip install pre-commit
pre-commit install --allow-missing-config

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

deskew-1.6.0.tar.gz (7.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

deskew-1.6.0-py3-none-any.whl (8.3 kB view details)

Uploaded Python 3

File details

Details for the file deskew-1.6.0.tar.gz.

File metadata

  • Download URL: deskew-1.6.0.tar.gz
  • Upload date:
  • Size: 7.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for deskew-1.6.0.tar.gz
Algorithm Hash digest
SHA256 1d8818a42369b8a3b0d34d29893f7a8828ec6b36fc009b392a3f66938d9c273a
MD5 b0056aa1e34c95e69a1790a633046d9b
BLAKE2b-256 40bca636466ff1486223e464ea8203bb0a1522ab347711c018458daa63a29d0b

See more details on using hashes here.

File details

Details for the file deskew-1.6.0-py3-none-any.whl.

File metadata

  • Download URL: deskew-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 8.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for deskew-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fc52a3dbb0c13bd923648535b0dd8e3f78f935ff80ca34f2b21e1bc4063e87d3
MD5 cfb0cefbe365a6d6c4ae048591c44def
BLAKE2b-256 ff43cdceb51f1a715e5ac3484db1a02df30b93a2c43409605b0f430d03247bf2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page