2

我正在尝试使用 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>

我已经尝试过这里提到的解决方案 黑客不起作用

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

我调查了 pytesseract 问题:这是一个未解决的问题

谢谢

4

1 回答 1

3

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

发生的情况是“latin1”在某种程度上是一种“无操作”编解码器,有时在 Python 中用于简单地将字节序列转换为 unicode 字符串(Python 3.x 中的默认字符串)。编解码器“cp1252”几乎是一样的,在某些情况下它可以与 latin1 互换使用——但是这个“\x81”代码是两者之间的一个区别。在你的情况下,一个至关重要的。

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

因此,您的解决方法是对“cp1252”编解码器进行monkeypatch,以便它填充一个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”编码。

于 2016-06-25T01:26:27.203 回答