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

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

推荐阅读

42个pycharm使用技巧,瞬间从黑铁变王者

Google C++项目编程风格指南 (中文版) 分享

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

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

import cv2import numpy as np

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

# Load the imageimage = cv2.imread(‘/Users/marius/Desktop/holes.png’, -1)

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

(hei,wid,_) = image.shape

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

#Grayscale and blur the imagegray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)blur = cv2.GaussianBlur(gray, (3,3), 0)

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

#Threshold the imagethresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

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

#Retrieve contours contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)#Create box-listbox = []# 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是也是必需的。

#Create separate lists for all valuesheights=[]widths=[]xs=[]ys=[]#Store values in listsfor b in box: heights.append(b[3]) widths.append(b[2]) xs.append(b[0]) ys.append(b[1])#Retrieve minimum and maximum of listsmin_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值是每个单元格的左边缘,并且连续。

#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)。形态学操作根据检测到的结构的几何形状进行转换。扩张是应用最广泛、最基本的形态学操作之一。如果内核下的至少一个像素为白色,则原始图像中正在查看的像素将被视为白色。因此,白色区域变大了。请注意,由于反转,背景为黑色,前景为白色,这意味着表格行当前为白色。扩张可以看作是最重要的步骤。现在修复孔和虚线,为了进一步识别表,将考虑所有单元格。

# Obtain horizontal lines maskhorizontal_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 maskvertical_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来反转图像。

# Bitwise-and masks togetherresult = 255 — cv2.bitwise_or(vertical_mask, horizontal_mask)

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

#Cropping the image to the table sizecrop_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 backgroundimg_white = np.zeros((hei, wid), np.uint8)img_white[:, 0:wid] = (255)#Retrieve the coordinates of the center of the imagex_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 backgroundimg_white[ y_offset:y_offset+crop_img.shape[0], x_offset:x_offset+crop_img.shape[1]] = crop_img#Viewing the resultcv2.imshow(‘Result’, img_white)cv2.waitKey()

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

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

相关推荐

  • [OpenCV]经典霍夫变换原理

    本文主要讲述的是霍夫变换的一些内容,并加入一些在生活中的应用,希望能对读者对于霍夫变换的内容有所了解. 首先我先说的是,霍夫变换是一个特征提取技术.其可用于隔离图像中特定形状的特征的技术,应用在图像分 ...

  • 图像旋转90/180 opencv坐标系

    问题描述: 图像旋转90.180.270等 使用类似下面的代码,会有黑边,图像变形之类的问题 其实windows系统自带类似的功能,但是我需要批量处理图像,因此尝试自己写 算法基础: 这种直角的旋转, ...

  • python+opencv图像处理(四十四)

    童年记忆中的爆米花,小时候只在过年的时候才能吃到,现在偶尔能在路边看到有在爆的,看到了总忍不住想买,虽然味道没什么变化,只是再吃不出来以前的幸福了. 长大了......心也大了...... 可是,实力 ...

  • 浅谈语义分割任务如何给像素点上色

    通常解码器最终输出都会是(batch_size ,num_classes, h, w) num_classes对应任务的类别数 所以在预测任务中,数据经过模型得到预测结果,形状也是 (batch_si ...

  • python+opencv图像处理(四十二)

    Kirsch算子 1.Kirsch算子 Kirsch算子是R.Kirsch提出来一种边缘检测新算法,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方 ...

  • 【CV】基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • 基于OpenCV的实战:轮廓检测(附代码解析)

    重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动态物体上.如果是统计图像,则需要将图像加载到程序中,然后使用OpenCV库,以便跟踪对象. 每当在框架中检测到 ...

  • 基于OpenCV的区域分割、轮廓检测和阈值处理

    重磅干货,第一时间送达 OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域.它在现实世界中的典型应用是人脸识别,物体检测,人类活动识别,物体跟踪等. 现在,假设我们只需要从整个 ...

  • 基于OpenCV的表格文本内容提取

    重磅干货,第一时间送达 小伙伴们可能会觉得从图像中提取文本是一件很麻烦的事情,尤其是需要提取大量文本时.PyTesseract是一种光学字符识别(OCR),该库提了供文本图像. PyTesseract ...

  • 基于OpenCV实战:车牌检测

    重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向发展.如果要给我一张图片,我们如何找到车牌并提取文字? 一般思维步骤: 识别输入数据是图像. 扫描图像以查看由 ...

  • 基于OpenCV实战的图像处理:色度分割

    重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法.为什么大多数人偏爱色度而不是RGB / HSV分割? 可以获得RGB / HSV通道之间的比 ...

  • 基于OpenCV实战:动态物体检测

    重磅干货,第一时间送达 最近,闭路电视安全系统运行着多种算法来确保安全,例如面部识别,物体检测,盗窃检测,火灾警报等.我们在运动检测的基础上实现了许多算法,因为在空闲帧上运行所有这些进程没有任何意义. ...

  • 基于OpenCV实战:对象跟踪

    重磅干货,第一时间送达 介绍 跟踪对象的基本思想是找到对象的轮廓,基于HSV颜色值. 轮廓:突出显示对象的图像片段.例如,如果将二进制阈值应用于具有(180,255)的图像,则大于180的像素将以白色 ...

  • (2条消息) 基于OpenCV使用OpenPose进行多个人体姿态估计

    目录 1.网络的体系结构 2.下载模型的权重文件 3. 第一步:生成图片对应的输出 3.1 读取神经网络 3.2 读取图像并生成输入blob 3.3 向前通过网络 3.4 样本输出 4. 第二步:关键 ...