Есть ли способ сделать изображение документа вертикальным из любой позиции? - PullRequest
1 голос
/ 03 ноября 2019

У меня есть такие документы:

В некоторых случаях изображение поворачивается вправо или даже вверх ногами.

Пример документа повернут вправо:

Пример документа повернут вверх ногами:

Есть ли способ сделать изображение вертикальным, независимо от начальной позиции?

Ожидаемый результат:

Ответы [ 2 ]

2 голосов
/ 04 ноября 2019

Имея дело с типичными (прямоугольными) форматами бумаги и текстами, направленными слева направо, как показано в ваших примерах, можно сделать два следующих предположения:

  • Высота бумагивсегда должен быть больше ширины бумаги. Это легко проверить. При необходимости поверните на 90 градусов.
  • На левой стороне будет больше текста, чем на правой. Следовательно, суммируйте значения пикселей по всем строкам. Суммированное значение в левой области документа должно быть больше, чем суммированное значение в правой области. При необходимости поверните на 180 градусов.

Вот код, который я использовал:

import cv2
import numpy as np
from skimage import io              # Only needed for web grabbing images; for local images, use cv2.imread(...)

def correct_orientation(img):

    print('\nImage:\n------')

    h, w = img.shape
    if (w > h):
        img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
        h, w = img.shape
        print('\nRotated 90 degrees')

    summed = np.sum(255-img, axis=0)

    if (np.sum(summed[30:130]) < np.sum(summed[w-130:w-30])):
        img = cv2.rotate(img, cv2.ROTATE_180)
        print('\nRotated 180 degrees')

    return img

correct_1 = io.imread('https://i.imgur.com/Gu8uAp6.jpg', as_gray=True)
rot_90 = io.imread('https://i.imgur.com/o97vu59.jpg', as_gray=True)
rot_180 = io.imread('https://i.imgur.com/XkBNfEb.jpg', as_gray=True)
correct_2 = io.imread('https://i.imgur.com/EvaioRS.jpg', as_gray=True)

images = [correct_orientation(img) for img in [correct_1, rot_90, rot_180, correct_2]]

Вывод для данных изображений:

Image:
------

Image:
------

Rotated 90 degrees

Rotated 180 degrees

Image:
------

Rotated 180 degrees

Image:
------

В вашемизображения, документы имеют дополнительные границы (синий или черный). Это затрудняет поиск начала и конца линий. Таким образом, корректировка ручных заданных значений для левой и правой области должна быть адаптирована в конечном решении.

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Забыли следующие визуализации. Для правильно ориентированного документа суммарные значения по всем строкам выглядят следующим образом:

Correct

См. Большие значения на левой стороне, это строки'начал.

То же самое для документа, повернутого на 180 градусов, выглядит следующим образом:

Not correct

Снова обратите внимание на "артефакты" награницы из-за дополнительных границ изображения.

2 голосов
/ 04 ноября 2019

Я думаю, что вы недовольны способностью EXIF ​​сохранять ориентацию, которую игнорируют некоторые зрители. Самый простой способ - использовать ImageMagick , который входит в большинство дистрибутивов Linux и доступен для macOS и Windows. С помощью этой команды в терминале или командной строки в Windows сначала исправьте ориентацию, затем удалите настройку, чтобы не перепутать зрителей:

magick input.jpg -auto-orient -strip result.jpg

При использовании v6 ImageMagick замените magick на convert.


В противном случае вы можете выполнить итерацию по четырем возможным ориентациям, поворачивая изображение каждый раз на 90 градусов. В каждой ориентации, пропустите изображение через pytesseract и выберите ориентацию, которая дает наибольшее совпадение с /usr/share/dict/words.txt или как она называется в вашей системе. Для дополнительного удовольствия и производительности превратите тест в функцию и вызовите его параллельно в 4 отдельных потоках - по одному на ориентацию.

Это может выглядеть примерно так:

#!/usr/bin/env python3

import numpy as np
import pytesseract
import cv2
import re
from textblob import TextBlob

def analyse(im, rotation):
   text = pytesseract.image_to_string(im, config="--psm 4")
   correctedText = TextBlob(text).correct()
   legit = []
   for found in correctedText.split():
      if found in words:
          legit.append(found)
   print(f"Rotation: {rotation}, word count: {len(legit)}, words: {legit}")

# Load dictionary of permissible words
words = set()
with open('/usr/share/dict/words') as f:
    for line in f:
        # Don't add short words like "at", tesseract often finds small, easily matched strings
        if len(line) > 5:
            words.add(line.rstrip())

# Load document
orig = cv2.imread('document.png',cv2.IMREAD_GRAYSCALE)
h, w = orig.shape
centre = (w//2, h//2)

# Iterate through orientations

# Original, no rotation
r = 0
cv2.imwrite(f'rotated-{r}.png',orig)
analyse(orig,0)

# 90 degrees
r = 90
rotated = cv2.rotate(orig, cv2.ROTATE_90_CLOCKWISE) 
cv2.imwrite(f'rotated-{r}.png',rotated)
analyse(rotated,r)

# 180 degrees
r = 180
rotated = cv2.rotate(orig, cv2.ROTATE_180) 
cv2.imwrite(f'rotated-{r}.png',rotated)
analyse(rotated,r)

# 270 degrees
r = 270
rotated = cv2.rotate(orig, cv2.ROTATE_90_COUNTERCLOCKWISE) 
cv2.imwrite(f'rotated-{r}.png',rotated)
analyse(rotated,r)

Пример вывода

Rotation: 0, word count: 43, words: ['between', 'Secession', 'deserted', 'above', 'noted', 'hereby', 'release', 'other', 'money', 'above', 'together', 'action', 'party', 'against', 'other', 'patty', 'holding', 'depart', 'Canada', 'refund', 'cashier', 'cheque', 'shall', 'their', 'irrevocable', 'author', 'hereby', 'commission', 'regeneration', 'above', 'except', 'hereinbefore', 'shall', 'binding', 'whereof', 'hereunto', 'presence', 'whereof', 'hereunto', 'presence', 'whereof', 'hereunto', 'presence']

Rotation: 90, word count: 0, words: []

Rotation: 180, word count: 10, words: ['saliva', 'sense', 'sleeping', 'anode', 'alone', 'sappy', 'sleeping', 'young', 'sawing', 'Utopian']

Rotation: 270, word count: 0, words: []

Как вы можете видеть, с первым невращенным изображением было найдено гораздо больше слов.

Ключевые слова : Python, tesseract,pytesseract, OCR, psm, config, изображение, обработка изображений, ориентация, автоориентация, автоориентация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...