Tesseract OCR:解析表格单元格

2024-01-14

我正在使用 cmd 中的 Tesseract-OCR v4.0.0 (alpha?) 从如下所示的表格的 png 中提取文本:

我希望 Tesseract-OCR 能够解析一个单元格中的内容,然后再转到下一个单元格。我不想继续“行”中的下一个单词。

预期的:

. . . John Smith 07 March,2017 Chicago Milwaukee Detroit Pacific Ocean . . .

Actual:

. . . John Smith 07 March,2017 Chicago Pacific Ocean Milwaukee Detroit . . .

我努力了:

  • 使用 --psm 标志更改页面分段(从 0-13)。结果要么通常相同但有细微差别,要么不可读。

是否有其他方法可以将 Tesseract 配置为读取一个单元格的所有内容,然后再转到下一个单元格?另外,还有什么解决方法吗?


我有时会花时间回答这个问题,但我发现很少有人问同样的问题。

我这里使用的解决方案是在使用tesseract之前使用Opencv对图像进行预处理。之后需要一些安排。 抱歉,我的代码太长了,我想有些可以使它更短。但无论如何它完成了工作。 我无法逐行解释代码,但我添加了注释,希望它可以让您对正在发生的事情有一个大概的了解。

import cv2 
import numpy as np
import pytesseract 
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract"

读取图像并过滤

table = cv2.imread("Table.png")
# adding some Border around image 
table= cv2.copyMakeBorder(table,20,20,20,20,cv2.BORDER_CONSTANT,value=[255,255,255])

去除图像中的噪声

table_c = cv2.GaussianBlur(cv2.cvtColor(table,cv2.COLOR_BGR2GRAY),(3,3),0,0)
# Threshold
_,thre = cv2.threshold(table_c,200,255,cv2.THRESH_BINARY,cv2.THRESH_OTSU)

仅获取图像中的行

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(100,1))
morph = cv2.morphologyEx(thre,cv2.MORPH_CLOSE,kernel)
contours,h = cv2.findContours(morph, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
rows = [None]*len(contours)
for i, c in enumerate(contours):
    rows[i] = cv2.boundingRect(cv2.approxPolyDP(c, 3, True))
rows = sorted(rows, key=lambda b:b[1], reverse=False)

仅在图像中变冷

kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(1,50))
morph2 = cv2.morphologyEx(thre,cv2.MORPH_CLOSE,kernel2)
contours,h = cv2.findContours(morph2, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
table = cv2.drawContours(table, contours, 0, (0,255,0), 3)

cols = [None]*len(contours)
for i, c in enumerate(contours):
    cols[i] = cv2.boundingRect(cv2.approxPolyDP(c, 3, True))
cols = sorted(cols, key=lambda b:b[0], reverse=False)

删除行和列并仅保留文本

_,thre2 = cv2.threshold(thre,0,255,cv2.THRESH_BINARY_INV)
no_table = cv2.bitwise_and(morph,thre2)
no_table = cv2.bitwise_and(morph2,no_table)

kernel2 = cv2.getStructuringElement(cv2.MORPH_RECT,(10,2))
mask = cv2.morphologyEx(no_table,cv2.MORPH_CLOSE,kernel2)

获取框中的每个文本

contours,h = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours_poly = [None]*len(contours)
boundRect = [None]*len(contours)
for i, c in enumerate(contours):
    contours_poly[i] = cv2.approxPolyDP(c, 3, True)
    boundRect[i] = cv2.boundingRect(contours_poly[i])
#     cv2.rectangle(table, (int(boundRect[i][0]), int(boundRect[i][1])),
#                  (int(boundRect[i][0]+boundRect[i][2]), int(boundRect[i][1]+boundRect[i][3])), (0,0,255), 2)
# table = cv2.drawContours(table, contours, -1, (0,255,0), 3)

裁剪每个框并识别文本

获取每个文本的行和列及其在图像中的位置

text_position = []
offest = 10
boundingBoxes = sorted(boundRect, key=lambda b:b[0], reverse=False)


for rect in boundingBoxes:
    if rect[2] > 30 and rect[3]>10:
        image = table[rect[1]-offest:rect[1]+rect[3]+offest,rect[0]-offest:rect[0]+rect[2]+offest]
        text = pytesseract.image_to_string(image)
        for i,row in enumerate(rows):
            if i < len(rows):
                if rect[1] >row[1] and rect[1] <rows[i+1][1]:
                    r = i 
                    break 
        for i,col in enumerate(cols):
            if i < len(cols):
                if rect[0] >col[0] and rect[0] <cols[i+1][0]:
                    c = i 
                    break
                    
        text_position.append({'Text':text.split("\n")[0],"row":r,'col':c,"X":rect[0],"Y":rect[1]})
        

同一行和同一列中的组合文本

indexs = []
for j,t in enumerate(text_position):
    list_re = []
    for i,tt in enumerate(text_position):
        if tt["row"] == t["row"] and tt["col"] == t["col"] :
            list_re.append(i)
    if len(list_re)>1:
        indexs.append(list_re)
        
indexs = list(set(tuple(i) for i in indexs))
text = ""
for indexs_ in indexs:
    text_repeated = [text_position[i] for i in indexs_]
    text_repeated = sorted(text_repeated, key=lambda b:b["Y"], reverse=False)
    for i in range(len(text_repeated)):
        text += text_repeated[i]["Text"]+" "
    new_dic = {'Text': text, 'row':text_repeated[0]["row"] , 'col': text_repeated[0]["col"], 'X': text_repeated[0]["X"], 'Y': text_repeated[-1]["Y"]}
    for i in indexs_:
        text_position.pop(i)
    text_position.append(new_dic)

最终输出将是一个字典列表,每个字典包含表格中每个单元格的文本、行和列,如下所示

[{'Text': 'Jane Doe', 'row': 3, 'col': 1, 'X': 67, 'Y': 167},
 {'Text': 'John Smith', 'row': 2, 'col': 1, 'X': 67, 'Y': 86},
 {'Text': 'Name', 'row': 1, 'col': 1, 'X': 68, 'Y': 59},
 {'Text': '07 March, 2017', 'row': 3, 'col': 2, 'X': 301, 'Y': 167},
 {'Text': '07 March, 2017', 'row': 2, 'col': 2, 'X': 301, 'Y': 86},
 {'Text': ' ', 'row': 1, 'col': 2, 'X': 302, 'Y': 59},
 {'Text': 'Los Angeles', 'row': 3, 'col': 3, 'X': 536, 'Y': 167},
 {'Text': 'Detroit', 'row': 2, 'col': 3, 'X': 536, 'Y': 140},
 {'Text': 'Locations', 'row': 1, 'col': 3, 'X': 536, 'Y': 58},
 {'Text': 'Currently in', 'row': 1, 'col': 4, 'X': 769, 'Y': 58},
 {'Text': 'Pacific Ocean', 'row': 2, 'col': 4, 'X': 770, 'Y': 85},
 {'Text': 'Chicago Milwaukee Detroit ',
  'row': 2,
  'col': 3,
  'X': 535,
  'Y': 140}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tesseract OCR:解析表格单元格 的相关文章

  • 烦人的 python tesseract 错误打开数据文件时出错 ./tessdata/eng.traineddata

    我遇到了这个错误 这让我对 tesseract 的 python 包装器有点疯狂 这是一个名为 tesseract 的 python 模块 这是我尝试运行的 python 代码 img cv2 imread image 0 api tess
  • 使用贝叶斯类进行数字识别

    我需要编写一个仅用于数字的 OCR 程序 我将使用 MNIST 数据集 问题是我不知道从哪里开始 有很多论文并没有真正解释算法 我对模式识别真的了解不多 所以我有几个问题 Q1 在哪里可以找到算法 或教程 Q2 如何对数字进行分类 我不需要
  • 超正方错误 - 图像太大

    对于大小为 5 MB 的图像 我从 tesseract 收到以下错误 Tesseract 开源 OCR 引擎 v3 01 与 Leptonica 第0页 图片太大 39667 56133 处理过程中出错 文件大小是否有限制 或者是否有参数可
  • 让 tesseract 只识别数字

    我正在尝试改进我制作的 OCR 程序来读取我正在使用的某个图像的布局 现在 我希望我的 OCR 程序只能识别数字 0 9 我尝试遵循问题的解决方案 限制 tesseract 正在寻找的字符 https stackoverflow com q
  • tesseract (v3.03) 输出为 PDF [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么会返回这个错误呢 root amd 3700 2gb ocr test tesseract l dan pdf png out pd
  • 从图像中识别数字

    我正在尝试编写一个应用程序来查找图像内的数字并将它们相加 如何识别图像中的书写数字 图像中有很多框 我需要获取左侧的数字并将它们相加得出总数 我怎样才能实现这个目标 编辑 我对图像进行了 java tesseract ocr 但没有得到任何
  • 使用 Tesseract OCR 和 python 进行数字识别

    我使用 Tesseract 和 python 读取数字 从能量计 除了数字 1 之外 一切都运行良好 Tesseract 无法读取 1 数字 This is the picture I send to tesseract tesseract
  • 在进行字符识别之前使用 OpenCV 进行图像预处理(超正方体)

    我正在尝试开发简单的 PC 应用程序用于车牌识别 Java OpenCV Tess4j 图像不是很好 进一步它们会很好 我想对超立方体图像进行预处理 但我被困在车牌检测 矩形检测 上 我的步骤 1 源图像 Mat img new Mat i
  • Tesseract OCR 将削减的 0 混淆为 8

    我已经在终点字体上训练了 tesseract 但无论如何 我都无法让它识别 0 我正在使用 jTessEditor 创建训练 tif 和框 即使在验证时 它也会将所有 0 读取为 8 我有什么遗漏的吗 下面是 0 的示例 它将其读作 8 我
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • 使用 python 突出显示图像中的特定文本

    我想突出显示网站屏幕截图中的特定单词 句子 截取屏幕截图后 我使用提取文本pytesseract and cv2 效果很好 我可以获得有关它的文本和数据 import pytesseract import cv2 if name main
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 如何将 Tesseract 导入 Angular2 (TypeScript)

    我正在尝试将 Tesseract 导入 Angular2 TypeScript 我可以看到它保存到 node modules 文件夹中 但是在使用时 import Tesseract from types tesseract js it s
  • 在 google Vision OCR 中被识别为单个单词的特殊字符?

    我试图让谷歌视觉 OCR 正则表达式可搜索 我已经完成了它 并且当文档仅包含英文字符时效果很好 但当有其他语言的文本时 它就会失败 发生这种情况是因为我在谷歌视觉单词组件中只有英文字符 如下所示 VISION API WORD COUNTE
  • 以编程方式识别 PDF 文件中的扫描文本 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 PDF 文件 其中包含我们需要导入数据库的数据 这些文件似乎是打印的字母数字文本的 pdf
  • 将姓名拆分为名字和姓氏 Java(Android OCR)[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我使用本机 Android JAVA 创建了一个 OCR 光学字符识别 应用程序 我可以将图像转换为文本视图 但是我如何使用这些词分别识别名
  • 使用 Kivy 应用程序进行 Tesseract OCR

    是否可以将 Tesseract OCR 或 Tess Two 与 Kivy 应用程序集成 我正在寻找使用 Kivy 框架创建一个用于基于 OCR 的文本识别的 Android 应用程序 我在我的 PC 上使用 Tesseract API 一
  • 训练 tesseract 与 iPhone 一起使用

    我正在尝试在我的 iPhone 应用程序中使用 tesseract 2 04 只想检测数字 我在这里所做的首先是使用这篇文章交叉编译 tesseract 以生成 lib 文件http robertcarlsen net 2009 07 15
  • 在Tomcat中设置环境变量TESSDATA_PREFIX

    我们正在使用名为 Tess4J 的 Tesseract OCR Java 库 如果作为独立应用程序运行 它可以正常工作 它需要一个名为 TESSDATA PREFIX 的变量 其中包含 tessdata 配置和其他字符集相关文件 它也可以与
  • 在 R 中使用深度网络和 MNIST 数据读取手写数字第 3 部分

    我尝试编写一个基于深度网络的程序来读取手写数字 我在 Youtube 上找到了一个代码 https www youtube com watch v 5bso 5X7Zu4 https www youtube com watch v 5bso

随机推荐

  • 使用 opencv 从 SIFT 生成百分比相似度分数

    在 python 2 7 x opencv 2 4 9 中使用 SIFT 比较两个图像后 我一直试图找到一种生成相似性得分 以 为单位 的方法 我只能找到在比赛之间画线的例子 我该怎么做呢 Matlab 中有一个相当于 vl ubcmatc
  • 在 for 循环中等待点击事件 - 类似于prompt()

    这可能没有最伟大的标题 我试图理解回调函数 我想知道如何在不丢失 for 循环的情况下替换以下代码中的提示 for i 0 i lt 4 i let x prompt Input an integer store input into an
  • JAXB 解组验证抛出 cvc-elt.1: 找不到元素声明错误

    我对 JAXB 和验证有点陌生 并且花了几个小时试图解决这个问题 但无济于事 我创建了一个简单的 JAXB 解组器示例来解析 XML 文件 我也创建了一个适当的 XSD 文件 但验证器一直抱怨它无法找到元素的声明 我认为这可能与命名空间问题
  • 从多列表框中取消选择时如何获取当前选定的选项值

    您好 我有如下所示的多选列表框 div class id 100 div
  • scipy 链接格式

    我已经编写了自己的聚类例程 并希望生成树状图 最简单的方法是使用 scipy dendrogram 函数 但是 这要求输入的格式与 scipy 链接函数生成的格式相同 我找不到如何格式化输出的示例 我想知道是否有人可以启发我 我同意http
  • 这也叫适配器吗? + 适配器与装饰器

    我有 2 个项目 A 和 B 它们应该相互交互 项目A引入接口名称ISpecialTask 项目B应该实现它 Projet B 有一个名为 TaskWithListOfProperties 的实体 该实体无法实现 ISpecialTask
  • C++ 支持成员函数引用吗?

    C 允许函数指针 and 函数参考 https stackoverflow com questions 480248 function references 它还允许指向成员函数的指针 But 是否允许引用成员函数 我似乎无法从标准中推断出
  • Emacs 颜色。为什么当前行是灰色的?森伯恩主题

    我安装了Prelude https github com bbatsov prelude在我的 emacs24 上 我使用的是ubuntu 12 04 我第一次使用它时效果很好 但接下来的次数就不行了 在我当前的行上 字体颜色是灰色的 因此
  • ngx-翻译和 *ngFor

    我有这个代码 div span img alt span h4 service name h4 p service desc p div 如何对具有 3 个参数的每个服务进行翻译 在正常情况下我使用 something translate
  • 在 Keras 中,当我创建具有 N 个“单元”的有状态“LSTM”层时,我到底要配置什么?

    正常的第一个参数Dense层也是units 是该层中神经元 节点的数量 然而 标准 LSTM 单元如下所示 这是 的修改版本 了解 LSTM 网络 http colah github io posts 2015 08 Understandi
  • 使用 Lumen 获取 file_get_contents

    我将此代码放入函数 php 类 中 theFile test test xml these are in the public folder dd file get contents theFile 如果我去mydomain local t
  • 基于两个表之间的子查询的Oracle SQL更新

    我目前正在编写更新语句 以使可查询的表不断保持最新 两个表之间的架构相同 内容并不重要 STAGING ID NAME COUNT PRODUCTION ID NAME COUNT 我的更新语句如下所示 update PRODUCTION
  • C# 小数类型除法的精度在 Mono 上不同?

    decimal d1 4 0m decimal d2 40 0m decimal d d1 d2 string repr d ToString 在 Windows 上 我得到的 repr 为 0 1 在 Mono Xamarin Andro
  • 为什么未初始化的属性在课堂上公开?

    请考虑以下代码 class foo function bar this gt baz hello there f new foo f gt bar echo f gt baz hello there 为什么上面的代码有效 我的意思是我还没有
  • Oracle CASE 语句?

    我有一个存储过程 我在其中传递布尔值 例如IS ELIGIBLE 现在我希望能够编写如下查询 SELECT col1 CASE WHEN IS ELIGIBLE THEN col2 100 ELSE col2 50 END INTO OUT
  • JavaFX 导航栏和内容窗格

    我想在我的新项目中使用 JavaFX 并且想要像下面的屏幕截图所示的东西 在左侧网站上我需要一个导航栏 在右侧网站上我需要一个内容 因此 我会在左侧使用 VBox 在右侧使用 AnchorPane 或者更好的是 ScrollPane 当我单
  • Terraform:heredoc 锚点中的无效字符

    我正在尝试在中使用多行字符串provisioner remote exec 我的 Terraform 脚本块 然而每当我使用EOT文档和各种示例中概述的语法我收到一个错误 抱怨有 invalid characters in heredoc
  • 包含 json 的数据属性中的单引号

    化妆品问题 我有一个 html 元素 其中包含一些嵌入图像的可能尺寸 这些尺寸存储为 div class inside div
  • Chrome 扩展程序不发送 SameSite=Lax cookie

    我在通过弹出脚本的 chrome 扩展处理 cookie 时遇到一些问题 popup js 内容 document addEventListener DOMContentLoaded gt function cookieinfo chrom
  • Tesseract OCR:解析表格单元格

    我正在使用 cmd 中的 Tesseract OCR v4 0 0 alpha 从如下所示的表格的 png 中提取文本 我希望 Tesseract OCR 能够解析一个单元格中的内容 然后再转到下一个单元格 我不想继续 行 中的下一个单词