UnicodeDecodeError 与 Python 中的 Tesseract OCR
Posted
技术标签:
【中文标题】UnicodeDecodeError 与 Python 中的 Tesseract OCR【英文标题】:UnicodeDecodeError with Tesseract OCR in Python 【发布时间】:2016-03-21 11:35:05 【问题描述】:我试图在 Python 中使用 Tesseract OCR 从图像文件中提取文本,但我遇到了一个错误,我可以弄清楚如何处理它。我所有的环境都很好,因为我在 python 中使用 ocr 测试了一些示例图像!
这里是代码
from PIL import Image
import pytesseract
strs = pytesseract.image_to_string(Image.open('binarized_image.png'))
print (strs)
以下是我从 eclipse 控制台得到的错误
strs = pytesseract.image_to_string(Image.open('binarized_body.png'))
File "C:\Python35x64\lib\site-packages\pytesseract\pytesseract.py", line 167, in image_to_string
return f.read().strip()
File "C:\Python35x64\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 0x9d in position 20: character maps to <undefined>
我在 Windows10
上使用 python 3.5 x64【问题讨论】:
这让我想起了我过去遇到的一些事情;我不知道这是否是完全相同的问题。你在 Windows 上的事实让我感到震惊——Windows 上 CMD 中的 Python 似乎有一个奇怪的默认代码页。您是否尝试过在sys.setdefaultencoding
进行黑客攻击以查看是否可以帮助您诊断问题? (如果你能提供帮助,我可能会避免在生产代码中保留这种技巧。)
Pytesseract: UnicodeDecodeError: 'charmap' codec can't decode byte的可能重复
【参考方案1】:
问题在于 python 正在尝试使用控制台的编码 (CP1252) 而不是它本来要使用的编码 (UTF-8)。 PyTesseract 找到了一个 unicode 字符,现在正试图将其翻译成 CP1252,但它无法做到。在另一个平台上,您不会遇到此错误,因为它将使用 UTF-8。
您可以尝试使用不同的函数(可能会返回 bytes
而不是 str
,这样您就不必担心编码问题)。您可以更改其中一个 cmets 中提到的 python 的默认编码,尽管当您尝试在 Windows 控制台上打印字符串时会导致问题。或者,这是我推荐的解决方案,您可以下载 Cygwin 并在其上运行 python 以获得干净的 UTF-8 输出。
如果您想要一个(还)不会破坏任何东西的快速而肮脏的解决方案,您可以考虑以下方法:
import builtins
original_open = open
def bin_open(filename, mode='rb'): # note, the default mode now opens in binary
return original_open(filename, mode)
from PIL import Image
import pytesseract
img = Image.open('binarized_image.png')
try:
builtins.open = bin_open
bts = pytesseract.image_to_string(img)
finally:
builtins.open = original_open
print(str(bts, 'cp1252', 'ignore'))
【讨论】:
似乎有一些很好的信息可能与这个答案here有关。 是的,这听起来像是我之前遇到的问题。如果您提供一些代码来解释如何配置 PyTesseract 以使用 UTF8 编码打开该文件(如果可能),这个答案会更好 @BenjaminHodgson PyTesseract 无法指定编码,但我们可以注入我们自己的open
替代...
@randomusername 您的解决方案对提取的结果文本的保真度有影响吗?我得到了很多奇怪的字符,而原始文档是普通的英文字符,即使它有点模糊!例如 iÃŽc1-zo1sîâzzaïzÃœl VE0Ã2ÃŽE BP797Z5SiÃŽc1-zo1sîâzzaïzÃœl VE0Ã2ÃŽE BP797Z5S
@NwawelAIroume 否,但它确实对结果输出产生了严重影响。尝试将输出打印为原始的 bytes
对象,看看您是否可以挽救您所能做的。或者您可以将输出存储在一个文件中并使用支持 UTF-8 的文本编辑器来查看它。【参考方案2】:
我遇到了和你一样的问题,但是我不得不将 pytesseract 的输出保存到一个文件中。因此,我使用 pytesseract 为 ocr 创建了一个函数,并在保存到文件时添加了参数encoding='utf-8'
,所以我的函数现在看起来像这样:
def image_ocr(image_path, output_txt_file_name):
image_text = pytesseract.image_to_string(image_path, lang='eng+ces', config='--psm 1')
with open(output_txt_file_name, 'w+', encoding='utf-8') as f:
f.write(image_text)
我希望这对某人有帮助:)
【讨论】:
谢谢你,你救了我的命以上是关于UnicodeDecodeError 与 Python 中的 Tesseract OCR的主要内容,如果未能解决你的问题,请参考以下文章
python 读写.tar.gz文件 -- UnicodeDecodeError
python UnicodeDecodeError: 'ascii' codec can't decode byte ...
Python2/3的中英文字符编码与解码输出: UnicodeDecodeError: 'ascii' codec can't decode/encode
[python错误]UnicodeDecodeError: 'gbk' codec can't decode byte...