UnicodeDecodeError с Tesseract OCR в Python

Я пытаюсь извлечь текст из файла изображения с помощью Tesseract OCR в Python, но я сталкиваюсь с ошибкой, которую я могу выяснить, как с этим справиться. все мое окружение хорошо, так как я протестировал образец изображения с ocr в python!

вот код

from PIL import Image
import pytesseract
strs = pytesseract.image_to_string(Image.open('binarized_image.png'))

print (strs)

Ниже приводится ошибка, которую я получаю от консоли затмения

strs = pytesseract.image_to_string(Image.open('binarized_body.png'))
  File "C:\Python35x64\lib\site-packages\pytesseract\pytesseract.py", line 167, in image_to_string
    return f.read().strip()
  File "C:\Python35x64\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 20: character maps to <undefined>

Я использую python 3.5 x64 на Windows10

2 ответа

Решение

Проблема в том, что python пытается использовать кодировку консоли (CP1252) вместо того, что он должен использовать (UTF-8). PyTesseract обнаружил символ Unicode и теперь пытается перевести его в CP1252, чего он не может сделать. На другой платформе вы не столкнетесь с этой ошибкой, потому что она будет использовать UTF-8.

Вы можете попробовать использовать другую функцию (возможно, ту, которая возвращает bytes вместо str так что вам не придется беспокоиться о кодировании). Вы можете изменить кодировку Python по умолчанию, как упомянуто в одном из комментариев, хотя это вызовет проблемы, когда вы попытаетесь напечатать строку в консоли Windows. Или, и это мое рекомендуемое решение, вы можете скачать Cygwin и запустить Python на нем, чтобы получить чистый вывод UTF-8.

Если вы хотите быстрое и грязное решение, которое ничего не сломает (пока), вот способ, который вы могли бы рассмотреть:

import builtins

original_open = open
def bin_open(filename, mode='rb'):       # note, the default mode now opens in binary
    return original_open(filename, mode)

from PIL import Image
import pytesseract

img = Image.open('binarized_image.png')

try:
    builtins.open = bin_open
    bts = pytesseract.image_to_string(img)
finally:
    builtins.open = original_open

print(str(bts, 'cp1252', 'ignore'))

У меня была такая же проблема, как и у вас, но я должен был сохранить вывод pytesseract в файл. Итак, я создал функцию для ocr с pytesseract и при сохранении в файл добавил параметр encoding='utf-8' поэтому моя функция теперь выглядит так:

def image_ocr(image_path, output_txt_file_name):
image_text = pytesseract.image_to_string(image_path, lang='eng+ces', config='--psm 1')
with open(output_txt_file_name, 'w+', encoding='utf-8') as f:
    f.write(image_text)

Я надеюсь, что это помогает кому-то:)

Другие вопросы по тегам