Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线

基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线

作者头像
小白学视觉
发布于 2021-01-21 03:21:09
发布于 2021-01-21 03:21:09
5.2K00
代码可运行
举报
运行总次数:0
代码可运行

通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚至只是一些小孔,但是无法将其识别为连贯的系统。有时在创建在单元格时,表的某些侧面可能也没有线的存在。表和单元格类型多种多样,因此通常所提出的代码可能并不适合所有情况。尽管如此,如果我们能对提取的表格进行少量修改,大部分程序仍然可以使用。大多数表格识别算法是基于表格的结构。由于没有完整的边线会使一些单元格无法被识别,导致不良的识别率,因此我们需要想办法修复这些丢失的线段。

首先,我们需要导入OpenCV和NumPy。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cv2
import numpy as np

然后,我们需要加载包含表的图像/文档。如果是整个文档,并且表格周围有文字,则需要首先识别该表格,然后从图像提取出表格的部分。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Load the image
image = cv2.imread(/Users/marius/Desktop/holes.png’, -1)

如果大家在输入图像使看到的第二行中的单元格线未完全连接。在表识别中,由于单元格不是封闭的框,因此算法将无法识别和考虑第二行。本文提出的解决方案不仅适用于这种情况。它也适用于表格中的其他虚线或孔。现在,我们需要获取图像的大小(高度和宽度)并将其存储在变量hei和wid中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(hei,wid,_) = image.shape 

下一步是通过高斯滤镜进行灰度和模糊处理,这有助于识别线条。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Grayscale and blur the image
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (3,3), 0)

然后,我们需要对图像进行阈值处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Threshold the image
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

然后使用OpenCV的findContours算法获取所有轮廓的位置。对于所有轮廓,将绘制一个边界矩形以创建表格的框/单元格。然后将这些框与四个值x,y,宽度,高度一起存储在列表框中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Retrieve contours 
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#Create box-list
box = []
# Get position (x,y), width and height for every contour 
for c in contours:
    x, y, w, h = cv2.boundingRect(c)
    box.append([x,y,w,h])

然后将所有高度,宽度,x和y分别存储在列表中,并计算最小高度,宽度以及x和y。此外,最大y和x是也是必需的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Create separate lists for all values
heights=[]
widths=[]
xs=[]
ys=[]
#Store values in lists
for b in box:
    heights.append(b[3])
    widths.append(b[2])
    xs.append(b[0])
    ys.append(b[1])
#Retrieve minimum and maximum of lists
min_height = np.min(heights)
min_width = np.min(widths)
min_x = np.min(xs)
min_y = np.min(ys)
max_y = np.max(ys)
max_x = np.max(xs)

现在使用存储的值来了解表的位置。最小y值可用于获取表的最上一行,该行可以视为表的起点。x的最小值是表格的左边缘。要获得近似大小,我们需要检索最大y值,该值是表底部的单元格或行。最后一行的y值表示单元格的上边缘,而不是单元格的底部。要考虑单元格和表格的整体大小,必须将最后一行的单元格高度加到最大y以检索表格的完整高度。最大的x将是表格的最后一列,并且连续地是表格的最右边的单元格/行。x值是每个单元格的左边缘,并且连续。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Retrieve height where y is maximum (edge at bottom, last row of table)
for b in box:
    if b[1] == max_y:
        max_y_height = b[3]
#Retrieve width where x is maximum (rightmost edge, last column of table)
for b in box:
    if b[0] == max_x:
        max_x_width = b[2]

在下一步中,将提取所有水平线和垂直线并分别存储。这是通过创建阈值并应用形态运算的内核来完成的。水平内核的大小为(50,1)。大家可以根据图像的大小来调整大小。垂直内核的大小为(1,50)。形态学操作根据检测到的结构的几何形状进行转换。扩张是应用最广泛、最基本的形态学操作之一。如果内核下的至少一个像素为白色,则原始图像中正在查看的像素将被视为白色。因此,白色区域变大了。请注意,由于反转,背景为黑色,前景为白色,这意味着表格行当前为白色。扩张可以看作是最重要的步骤。现在修复孔和虚线,为了进一步识别表,将考虑所有单元格。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Obtain horizontal lines mask
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
horizontal_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=1)
horizontal_mask = cv2.dilate(horizontal_mask, horizontal_kernel, iterations=9)
# Obtain vertical lines mask
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
vertical_mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=1)
vertical_mask= cv2.dilate(vertical_mask, vertical_kernel, iterations=9)

然后使用OpenCV的bitwise_or操作将水平和垂直两个蒙版合并到一张表中。要检索原始的前后前景,可通过从255中减去cv2.bitwise_or来反转图像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Bitwise-and masks together
result = 255 — cv2.bitwise_or(vertical_mask, horizontal_mask)

如果桌子被文本包围而不是独自站立(在我的示例中,它没有被包围),我们将其切出并放在白色背景上。现在我们需要前面检索的表的大小。我们使用最小y(顶部的边缘),最大y +最大y单元格的高度(底部的边缘),最小x(即左边缘)和最大x +最大x个像元的宽度(这是右边缘)。然后将图像裁剪为表格的大小。将创建文档原始大小的新背景,并完全用白色像素填充。检索图像的中心,将修复的表格与白色背景合并,并设置在图像的中心。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Cropping the image to the table size
crop_img = result[(min_y+5):(max_y+max_y_height), (min_x):(max_x+max_x_width+5)]
#Creating a new image and filling it with white background
img_white = np.zeros((hei, wid), np.uint8)
img_white[:, 0:wid] = (255)
#Retrieve the coordinates of the center of the image
x_offset = int((wid — crop_img.shape[1])/2)
y_offset = int((hei — crop_img.shape[0])/2)
#Placing the cropped and repaired table into the white background
img_white[ y_offset:y_offset+crop_img.shape[0], x_offset:x_offset+crop_img.shape[1]] = crop_img
#Viewing the result
cv2.imshow(‘Result’, img_white)
cv2.waitKey()

这就是结果。该方法可用于表中的虚线,间隙和孔的多种类型。结果是进一步进行表格识别的基础,对于包含文本的表,仍然有必要将包含表的原始图像与数据与具有修复孔的最终图像合并。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目31讲

在「小白学视觉」公众号后台回复:Python视觉实战项目31讲,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

下载4:leetcode算法开源书

在「小白学视觉」公众号后台回复:leetcode,即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
通过扫描或照片对文档进行数字化处理时,错误的设置或不良的条件可能会影响图像质量。在识别的情况下,这可能导致表结构损坏。某些图标的处理结果可能只是有轻微的瑕疵,甚至只是一些小孔,但是无法将其识别为连贯的系统。有时在创建在单元格时,表的某些侧面可能也没有线的存在。表和单元格类型多种多样,因此通常所提出的代码可能并不适合所有情况。尽管如此,如果我们能对提取的表格进行少量修改,大部分程序仍然可以使用。大多数表格识别算法是基于表格的结构。由于没有完整的边线会使一些单元格无法被识别,导致不良的识别率,因此我们需要想办法修复这些丢失的线段。
AI算法与图像处理
2021/01/20
4.9K0
基于OpenCV的表格文本内容提取
小伙伴们可能会觉得从图像中提取文本是一件很麻烦的事情,尤其是需要提取大量文本时。PyTesseract是一种光学字符识别(OCR),该库提了供文本图像。
小白学视觉
2022/02/14
2.9K0
基于OpenCV的表格文本内容提取
基于OpenCV 的车牌识别
车牌识别是一种图像处理技术,用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于OpenCV编写Python代码来完成这一任务。
小白学视觉
2020/09/04
8K0
OpenCV从零基础---检测及分割图像的目标区域
作者:王抒伟 编辑:王抒伟 算了 爱看多久看多久 零 参考目录: 1.获取图片 2.转换灰度并去噪声 3.提取图像的梯度 4.我们继续去噪声 5.图像形态学(牛逼吧、唬人的) 6.细节刻画 7.找出昆虫区域的轮廓 8.画出轮廓 9.裁剪出来就完成啦 一 第一天: 老师:你知道么,今天有人问了我一个问题。 ~.我:什么? 老师:他说很难。 ~.我:关于什么的? 老师:图像处理。 ~.我:喔,你说说看,我确实做了不少图像处理的东西(心里默念,你不知知道你给过我多少图像吗?) 老师:好嘞!在用深度学习的时候,
机器学习算法工程师
2018/03/06
13.1K1
OpenCV从零基础---检测及分割图像的目标区域
【技术分享会】Python Opencv图像处理基础(下)
完整的notebook文档:https://github.com/IBBD/IBBD.github.io/blob/master/python/python-opencv-guidelines.ipynb
明月AI
2021/10/28
1.2K0
【技术分享会】Python Opencv图像处理基础(下)
【深度学习】实例第二部分:OpenCV
执行以下命令安装opencv-python库(核心库)和opencv-contrib-python库(贡献库)。注意:命令拷贝后要合成一行执行,中间不要换行。
杨丝儿
2022/02/28
1.9K0
【深度学习】实例第二部分:OpenCV
Python 数据科学入门教程:OpenCV
欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定。 OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等。
ApacheCN_飞龙
2022/12/01
1.4K0
Python 数据科学入门教程:OpenCV
【OpenCV入门之十八】通过形态学操作提取水平与垂直线
学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“好看”鼓励一下小白。
小白学视觉
2019/05/31
8510
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
HSV 的色相范围为 [0,179],饱和度范围为 [0,255],值范围为 [0,255]。不同的软件使用不同的规模。
机器视觉CV
2019/07/15
3.1K0
OpenCV Python 系列教程 4 - OpenCV 图像处理(上)
opencv实现银行卡号识别
总体的过程就是将图片转换为二值图像,然后直接把所有的外轮廓都提取出来,然后根据这些轮廓的左上角坐标来进行排序,在排序之后我们就获得了单独的数字图像,如下图
小王不头秃
2024/06/19
4620
opencv实现银行卡号识别
使用python3+opencv3实现的识别答题卡的例子(01)
由于工作需要,最近在研究关于如何通过程序识别答题卡的客观题的答案,之前虽然接触过python,但对于计算机视觉这一块却完全是一个陌生的领域,经过各种调研,发现网上大多数的例子都是采用的OpenCV这个开源库来做的,OpenCV是计算机视觉领域的处理的一个非常优秀的开源库,原生由C++编写,也提供了各个主流编程语言的接口支持,这里选择python完全是因为python在计算机科学领域有着压倒性的优势和生态系统,所以使用它毫无疑问,最快上手的方式莫过于直接阅读网上已有的例子或者轮子了,通过阅读源码以问题驱动的方
我是攻城师
2018/05/15
2.2K0
精通 Python OpenCV4:第二部分
在本书的第二部分中,您将更深入地了解 OpenCV 库。 更具体地说,您将看到计算机视觉项目中所需的大多数常见图像处理技术。 此外,您还将看到如何创建和理解直方图,直方图是用于更好地理解图像内容的强大工具。 此外,您将在计算机视觉应用中看到所需的主要阈值处理技术,这是图像分割的关键部分。 此外,您还将看到如何处理轮廓,轮廓用于形状分析以及对象检测和识别。 最后,您将学习如何构建第一个增强现实应用。
ApacheCN_飞龙
2023/04/27
2.4K0
实战 | 基于OpenCV实现魔方颜色识别与色块排序
为了做自动魔方识别与复原项目,需要用图像处理的方法识别魔方每个色块的位置与颜色。相机拍摄的魔方单面图像如下:
Color Space
2024/06/17
7810
实战 | 基于OpenCV实现魔方颜色识别与色块排序
基于OpenCV的区域分割、轮廓检测和阈值处理
OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域。它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等。
小白学视觉
2020/09/29
2.6K0
基于OpenCV的区域分割、轮廓检测和阈值处理
OpenCV—python 边缘检测(Canny)「建议收藏」
边缘类型:简单分为4中类型,阶跃型、屋脊型、斜坡型、脉冲型,其中阶跃型和斜坡型是类似的,只是变化的快慢不同。
全栈程序员站长
2022/09/02
2.2K0
【OpenCV入门之九】轮廓查找和多边形包围轮廓
学习计算机视觉最重要的能力应该就是编程了,为了帮助小伙伴尽快入门计算机视觉,小白准备了【OpenCV入门】系列。新的一年文章的内容进行了很大的完善,主要是借鉴了更多大神的文章,希望让小伙伴更加容易理解。如果小伙伴觉得有帮助,请点击一下文末的“好看”鼓励一下小白。
小白学视觉
2019/06/02
2K0
Python OpenCV 3.x 示例:1~5
在本章中,我们将学习如何将冷酷的几何效果应用于图像。 在开始之前,我们需要安装 OpenCV-Python。 我们将解释如何编译和安装必要的库,以遵循本书中的每个示例。
ApacheCN_飞龙
2023/04/27
2.7K0
Python OpenCV 3.x 示例:1~5
前端 + AI —— 走进无码时代
导语:前端智能化,就是通过AI/CV技术,使前端工具链具备理解能力,进而辅助开发提升研发效率,比如实现基于设计稿智能布局和组件智能识别等。
Y.one
2020/09/01
1.4K0
前端 + AI —— 走进无码时代
opencv 视觉项目学习笔记(二): 基于 svm 和 knn 车牌识别
    训练数据: 所有训练数据存储再一个 N x M 的矩阵中, 其中 N 为样本数, M 为特征数(每个样本是该训练矩阵中的一行)。这些数据  所有数据存在  xml 文件中, 
用户2434869
2018/10/11
3.1K0
OpenCV的实用图像处理操作案例分享
图像处理适用于图像和视频。良好的图像处理结果会为后续的进一步处理带来很大的帮助,例如提取到图像中的直线有助于对图像中物体的结构进行分析,良好的特征提取会优化深度学习的结果等。今天我们来回顾一下图像处理中的最基础的,但是却非常实用的一些操作。
AI算法与图像处理
2020/09/29
1K0
OpenCV的实用图像处理操作案例分享
相关推荐
基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验