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)

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

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


person Nwawel A Iroume    schedule 15.12.2015    source источник
comment
Это напоминает мне кое-что, с чем я сталкивался в прошлом; Я не знаю, точно ли это та же проблема. Тот факт, что вы работаете в Windows, подсказал мне - Python в CMD в Windows, похоже, имеет странную кодовую страницу по умолчанию. Вы пробовали взломать sys.setdefaultencoding, чтобы узнать, поможет ли это диагностировать проблему? (Я бы, вероятно, избегал использовать этот хак в производственном коде, если вы можете с этим помочь.)   -  person Benjamin Hodgson♦    schedule 15.12.2015


Ответы (2)


Проблема в том, что python пытается использовать кодировку консоли (CP1252) вместо того, что предполагается использовать (UTF-8). PyTesseract обнаружил символ Юникода и теперь пытается перевести его в 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'))
person randomusername    schedule 15.12.2015
comment
Кажется, есть полезная информация, потенциально связанная с этим ответом здесь. - person MPlanchard; 15.12.2015
comment
Да, похоже, проблема, с которой я сталкивался раньше. Этот ответ был бы лучше, если бы вы дали некоторый код, объясняющий, как настроить PyTesseract, чтобы открыть этот файл с кодировкой UTF8, если это возможно. - person Benjamin Hodgson♦; 15.12.2015
comment
@BenjaminHodgson PyTesseract не может указать кодировку, но мы можем ввести нашу собственную open альтернативу ... - person randomusername; 15.12.2015
comment
@randomusername влияет ли ваше решение на точность получаемого извлеченного текста? Я получаю много странных символов, тогда как исходный документ представляет собой простой английский символ, даже если он немного размыт! пример такой: iÃŽc1-zo1sîà ¢ zzaïzÃœl VE0Ã2ÃŽE BP797Z5SiÃŽc1-zo1sîà ¢ zzaïzÃœl VE0Ã2ÃŽE BP797Z5S - person Nwawel A Iroume; 16.12.2015
comment
@NwawelAIroume нет, но это серьезно влияет на результат. Попробуйте распечатать результат как исходный объект bytes, чтобы увидеть, сможете ли вы спасти то, что можете. Или вы можете сохранить вывод в файл и использовать текстовый редактор с поддержкой UTF-8 для его просмотра. - person randomusername; 16.12.2015

У меня была та же проблема, что и у вас, но мне пришлось сохранить вывод 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)

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

person Novak    schedule 02.10.2018
comment
Спасибо, ты спас мне жизнь - person Zafir Stojanovski; 29.10.2018