Я думаю, что вы недовольны способностью 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, изображение, обработка изображений, ориентация, автоориентация, автоориентация.