如何在 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
,您应该使用形态学操作(例如关闭)来查找标题的候选边界框,然后检查x
、y
坐标、宽度和高度以找到最佳候选者。有了那个边界框,您可以简单地在该子图像上使用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 输出