Skip to main content
 首页 » 编程设计

python之在 Python 中使用 Tesseract OCR 的 UnicodeDecodeError 'charmap' 编解码器

2024年10月17日26daizhj

我正在尝试使用 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”编码。