在 Python 脚本中转换 tiff 图像 - 使用 Tesseract 进行 OCR

在 Python 脚本中转换 tiff 图像 - 使用 Tesseract 进行 OCR

我想将 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/

相关内容