我正在尝试使用 teseract-OCR 在 python 中对图像文件执行 OCR。 我的环境是—— Windows 机器上的 Python 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>
我已经尝试了提到的解决方案 here 黑客不起作用
我已经在 Mac OS 上尝试了我的代码,它可以正常工作。
我调查了 pytesseract 问题: 这是一个 open issue
谢谢
请您参考如下方法:
嗯..那里发生了一些非常奇怪的事情 - 当我们谈论“latin1”文本编码时,字符“\x81”是不可打印的。然而,在库使用的“cp1252”编码上,它被映射到一个“未定义的字符”——这是明确的。
“latin1”有点像“无操作”编解码器,有时在 Python 中用于将字节序列简单地转换为 unicode 字符串(Python 3.x 中的默认字符串)。编解码器“cp1252”几乎是一样的,在某些情况下它可以与 latin1 互换使用——但是这个“\x81”代码是两者之间的一个区别。在您的情况下,这是一个至关重要的问题。
正确的做法是尝试为 image_to_string 函数提供可选的 lang 参数 - 这样它就可以使用正确的编解码器来解码您的文本 - 如果它更好地识别它暴露为“0x81”的字符是什么。但是,这可能行不通 - 因为它可能只是一个与语言完全无关的非常奇怪的字符的 OCR 错误。
因此,您的解决方法是对“cp1252”编解码器进行猴子修补,这样它就不会出现错误,而是填充一个 Unicode“无法识别”的字符 - 一种方法是在调用 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”编码。
