我想将 tiff 图像文件转换为文本文档。我的代码按预期工作,可以使用普通字体转换 tiff 图像,但对于法语脚本字体则不起作用。我的 tiff 图像文件包含文本。文本的字体为法语脚本格式。这是我的代码:
导入图片 导入子流程 导入实用程序 导入错误 tesseract_exe_name = 'tesseract' # 在命令行调用的可执行文件的名称 scratch_image_name = "temp.bmp" # 此文件必须是.bmp 或其他与 Tesseract 兼容的格式 scratch_text_name_root = "temp" # 省略 .txt 扩展名 cleanup_scratch_flag = True # OCR 操作后清理的临时文件 def call_tesseract(输入文件名,输出文件名): “”“在输入文件上调用外部 tesseract.exe(类型限制), 输出output_filename+'txt'""" args = [tesseract_exe_name,输入文件名,输出文件名] proc = 子进程.Popen(参数) retcode = proc.wait() 如果 retcode!=0: 错误.检查错误() def image_to_string(im,cleanup = cleanup_scratch_flag): “”“将 im 转换为文件,应用 tesseract,并获取结果文本。 如果 cleanup=True,操作后删除临时文件。""" 尝试: util.image_to_scratch(im,scratch_image_name) call_tesseract(scratch_image_name,scratch_text_name_root) 文本 = util.retrieve_text(scratch_text_name_root) 最后: 如果清理: util.perform_cleanup(scratch_image_name,scratch_text_name_root) 返回文本 def image_file_to_string(文件名,cleanup = cleanup_scratch_flag,graceful_errors = True): 如果 cleanup=True,操作后删除临时文件。""" 尝试: 尝试: call_tesseract(文件名,scratch_text_name_root) 文本 = util.retrieve_text(scratch_text_name_root) 除了错误.Tesser_General_Exception: 如果出现优雅错误: im = 图像.打开(文件名) 文本 = 图像到字符串 (im,清理) 别的: 增加 最后: 如果清理: util.perform_cleanup(scratch_image_name,scratch_text_name_root) 返回文本 如果 __name__=='__main__': im = 图像.open("/home/oomsys/phototest.tif") 文本 = 图像到字符串(im) 打印文本 尝试: 文本 = 图像文件到字符串('fnord.tif',graceful_errors=False) 除了错误.Tesser_General_Exception,值: 打印“fnord.tif 是不兼容的文件类型。尝试 graceful_errors=True” 打印值 文本 = 图像文件到字符串('fnord.tif',graceful_errors=True) 打印“fnord.tif 内容:”,文本 文本 = 图像文件到字符串 ('fonts_test.png', graceful_errors=True) 打印文本
答案1
通过阅读 Tesseract 文档,您可以训练它理解该字体,如下所示:http://michaeljaylissner.com/blog/adding-new-fonts-to-tesseract-3-ocr-engine
介绍
Tesseract 是一款出色且功能强大的 OCR 引擎,但它们添加新字体的说明非常冗长且复杂。在 CourtListener,我们必须处理几种不常见的黑体字体,因此我们不得不多次重复这个过程。下面我解释了这个过程,以便其他人可以更轻松地将字体添加到他们的系统中。
该过程有几个主要步骤:
- 创建培训文档
- 向 Tesseract 传授文档知识
创建培训文档
要创建训练文档,请打开 MS Word 或 LibreOffice,粘贴名为“standard-training-text.txt”的附加文件的内容。此文件包含 Tesseract 用于所含字体的训练文本。
将行距设置为至少 1.5,并使用字符间距将字母间隔约 1pt。如果有帮助,我还附上了一个示例文档。将文本设置为要使用的字体,并将其保存为 font-name.doc。
将文档保存为 PDF(命名为 [lang].font-name.exp0.pdf,其中 lang 是您所用语言的 ISO-639 三个字母的缩写),然后使用以下命令将其转换为 300dpi tiff(需要 imagemagick):
convert -density 300 -depth 4 lang.font-name.exp0.pdf lang.font-name.exp0.tif
现在,您将获得一个名为 lang.font-name.exp0.tif 的优质训练图像。如果您要添加多种字体,或粗体、斜体或下划线,请多次重复此过程,为每个字体变体创建一个 doc → pdf → tiff。
训练 Tesseract
下一步是在我们刚刚创建的图像上运行 tesseract,看看它对新字体的处理效果如何。在它拍出最佳效果后,我们会对其进行修正。它会为我们提供一个 box 文件,该文件包含它找到的每个字母的 x、y 坐标以及它认为的字母。让我们看看它能做什么:
tesseract lang.font-name.exp0.tiff lang.font-name.exp0 batch.nochop makebox
现在您将有一个名为 font-name.exp0.box 的文件,您需要在 box-file 编辑器中打开它。Tesseract wiki 上有很多这样的编辑器。对我有用的编辑器(在 Ubuntu 上)是 moshpytt,尽管它不支持多页 tiff。如果您需要使用多页 tiff,请参阅主题上的问题以获取提示。打开它后,检查每个字母,并确保正确检测到它。如果跳过了一个字母,请将其作为一行添加到 box 文件中。同样,如果两个字母被检测为一个,则将它们分成两行。
完成后,将盒子文件送回 tesseract:
tesseract eng.font-name.exp0.tif eng.font-name.box nobatch box.train .stderr
接下来,您需要检测所有盒子文件中使用的字符集:
unicharset_extractor *.box
完成后,您需要创建一个 font_properties 文件。它应列出您正在训练的每种字体,每行一个,并确定它是否具有以下特征:<fontname> <italic> <bold> <fixed> <serif> <fraktur>
因此,例如,如果你使用标准训练数据,你最终可能会得到如下文件:
eng.arial.box 0 0 0 0 0 eng.arialbd.box 0 1 0 0 0 eng.arialbi.box 1 1 0 0 0 eng.ariali.box 1 0 0 0 0 eng.b018012l.box 0 0 0 1 0 eng.b018015l.box 0 1 0 1 0 eng.b018032l.box 1 0 0 1 0 eng.b018035l.box 1 1 0 1 0 eng.c059013l.box 0 0 0 1 0 eng.c059016l.box 0 1 0 1 0 eng.c059033l.box 1 0 0 1 0 eng.c059036l.box 1 1 0 1 0 eng.cour.box 0 0 1 1 0 eng.courbd.box 0 1 1 1 0 eng.courbi.box 1 1 1 1 0 eng.couri.box 1 0 1 1 0 eng.georgia.box 0 0 0 1 0 eng.georgiab.box 0 1 0 1 0 eng.georgiai.box 1 0 0 1 0 eng.georgiaz.box 1 1 0 1 0 eng.lincoln.box 0 0 0 0 1 eng.old-english.box 0 0 0 0 1 eng.times.box 0 0 0 1 0 eng.timesbd.box 0 1 0 1 0 eng.timesbi.box 1 1 0 1 0 eng.timesi.box 1 0 0 1 0 eng.trebuc.box 0 0 0 1 0 eng.trebucbd.box 0 1 0 1 0 eng.trebucbi.box 1 1 0 1 0 eng.trebucit.box 1 0 0 1 0 eng.verdana.box 0 0 0 0 0 eng.verdanab.box 0 1 0 0 0 eng.verdanai.box 1 0 0 0 0 eng.verdanaz.box 1 1 0 0 0
请注意,这是 Tesseract 应提供的标准 font_properties 文件,我已为正在训练的黑体字体添加了两行粗体字。您还可以查看开箱即用的字体。
我们快要结束了。接下来,创建聚类数据:
mftraining -F font_properties -U unicharset -O lang.unicharset *.tr cntraining *.tr
如果需要,您可以创建一个单词列表或一个 unicharambigs 文件。如果您不打算这样做,最后一步是合并我们创建的各种文件。
为此,将每个语言文件 (normproto、Microfeat、inttemp、pffmtable) 重命名为具有您的语言前缀,然后运行(注意末尾的点):
combine_tessdata lang.
这将创建您需要的所有数据文件,您只需将它们移动到操作系统上的正确位置即可。在 Ubuntu 上,我可以将它们移动到:
sudo mv eng.traineddata /usr/local/share/tessdata/