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

Cli usage

Get the skew angle:

deskew input.png

Deskew an image:

deskew --output output.png input.png

Lib usage

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))

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)

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

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 Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

deskew-1.0.21-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: deskew-1.0.21-py3-none-any.whl
  • Upload date:
  • Size: 5.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.8.10

File hashes

Hashes for deskew-1.0.21-py3-none-any.whl
Algorithm Hash digest
SHA256 aea656dd8b31717b6c31eb73dec19c3768dbe7b5fffb599f4447eceea5bc4803
MD5 285efc38453f8c9480d30c7625abd305
BLAKE2b-256 6e8e976aa5fd32d9c82e5570cf0eee690cd2ef125901571e4c4a1119a2daf5b2

See more details on using hashes here.

Provenance

Supported by

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