如何在 Python 中使用 tesseract 获得图像中最大的文本?

Posted

技术标签:

【中文标题】如何在 Python 中使用 tesseract 获得图像中最大的文本?【英文标题】:How do I get the largest text in an image using tesseract in Python? 【发布时间】:2021-06-22 00:08:45 【问题描述】:

我正在尝试提取 PDF 文件的标题。文件的元数据并没有真正的帮助。所以我正在考虑将每个 PDF 文件的第一页转换为图像并使用 Tesseract 读取此图像。我可以假设图片上最大的文字是标题。

我使用fitz 阅读 PDF 并加载要存储为图像格式的第一页。

import fitz

doc = fitz.open(filename)
page = doc.loadPage(0)
pix = page.getPixmap()
pix.writePNG("output.png")

然后我使用 OpenCV 读取图像文件,将其放入 tesseract,并在检测到的单词上放置边界框。

filename = 'output.png'

img = cv2.imread(filename)
h, w, _ = img.shape

boxes = pytesseract.image_to_boxes(img) # also include any config options you use

for b in boxes.splitlines():
    b = b.split(' ')
    img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)

cv2.imshow(filename, img)
cv2.waitKey(0)

我对 OCR tesseract 不是很熟悉,所以这就是我卡住的地方。如何获取具有最大边界框的文本?

我的 PDF 文件主要是科学论文/期刊。这样你就知道我的文件是什么样子了。

谢谢。

【问题讨论】:

对于任意输入,我想,很难找到通用的解决方案。即使是科学研究论文的外观也千差万别。不要使用pytesseract.image_to_boxes,您应该使用形态学操作(例如关闭)来查找标题的候选边界框,然后检查xy 坐标、宽度和高度以找到最佳候选者。有了那个边界框,您可以简单地在该子图像上使用pytesseract.image_to_string。但同样,如果没有看到您的一些示例,就不可能提供解决方案。 【参考方案1】:

通常 Tesseract 将 OCR 运算结果作为嵌套结构返回,如下所示:

块 线 单词 字符(仅在 Tesseract 3 中,对于 Tesseract 4,您只有单词框)

使用pytesseract.image_to_data 你应该得到关于行/单词索引的数据。

我的建议是遍历每一行的单词,找到平均字高最大的那一行,这很可能是论文的标题。

请参考this answer查看获取词框的方法

【讨论】:

以上是关于如何在 Python 中使用 tesseract 获得图像中最大的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 或 Tesseract OCR 从输入图像中检测语言或脚本?

如何使用 python-tesseract 获取 Hocr 输出

使用Python,Tesseract更正文本方向

在 python 中使用 tesseract 4

如何在 anaconda 上为 python 安装 tesseract

在 Tesseract 上获取文本方向 - Python API