【问题标题】:UnicodeDecodeError 'charmap' codec with Tesseract OCR in PythonUnicodeDecodeError 'charmap' 编解码器与 Python 中的 Tesseract OCR
【发布时间】:2016-06-25 00:52:39
【问题描述】:

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

谢谢

【问题讨论】:

    标签: python character-encoding tesseract python-tesseract


    【解决方案1】:

    嗯..那里发生了一些非常奇怪的事情- 当我们谈论“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-03-21
      • 1970-01-01
      • 2023-03-26
      • 2021-04-25
      • 1970-01-01
      • 2017-06-20
      • 2021-10-12
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多