UnicodeDecodeError 'charmap' 编解码器与 Python 中的 Tesseract OCR

UnicodeDecodeError 'charmap' codec with Tesseract OCR in Python

我正在尝试使用 teseract-OCR 对 python 中的图像文件执行 OCR。 我的环境是—— Python Windows Machine 上的 3.5 Anaconda。

代码如下:

from PIL import Image
from pytesseract import image_to_string
out = image_to_string(Image.open('sample.png'))

我得到的错误是:

File "Anaconda3\lib\sitepackages\pytesseract\pytesseract.py", line 167, in image_to_string
return f.read().strip()
File "Anaconda3\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 0x81 in position 1583: character maps to <undefined>

我已经尝试了提到的解决方案 破解无效

我已经在 Mac OS 上尝试了我的代码,它正在运行。

我调查了 pytesseract 问题: 这是一个 open issue

谢谢

嗯..那里发生了一些非常奇怪的事情- 当我们谈论 "latin1" 文本编码时,字符“\x81”是不可打印的。但是,在库使用的 "cp1252" 编码上,它被映射到 "undefined character" - 这是明确的。

发生的事情是 "latin1" 有点像 "no-op" 编解码器,有时在 Python 中用于将字节序列简单地转换为 unicode 字符串([=36 中的默认字符串=] 3.x)。编解码器 "cp1252" 与 几乎 相同,在某些情况下它可以与 latin1 互换使用 - 但这个“\x81”代码是两者之间的一个区别。在你的情况下,这是一个关键。

正确的做法是尝试为 image_to_string 函数提供可选的 lang 参数 - 这样它可能会使用正确的编解码器来解码您的文本 - 如果它能更好地识别什么是它公开为“0x81”的字符。但是,这可能行不通 - 因为它可能只是一个与语言完全无关的非常奇怪的字符的 OCR 错误。

因此,您的解决方法是对 "cp1252" 编解码器进行 monkeypatch,这样它就不会出现错误,而是填充 Unicode "unrecognized" 字符 - 一种方法是将这些行插入在调用 tesseract 之前:

from encodings import cp1252
original_decode  = cp1252.Codec.decode
cp1252.Codec.decode =  lambda self, input, errors="replace": original_decode(self, input, errors)

但是,如果可以的话,请打开针对 pytesseract 项目的错误报告。我的猜测是他们此时应该使用 "latin1" 而不是 "cp1252" 编码。