我们在对表格进行提取之前,要先对扫描进来的表格进行矫正,由于我做的项目的原因,所需要的处理的表格全都是扫描版的,所以不会出现前文表格线是弯曲的情况,所以表格矫正的方法比较简单。

请参考:https://blog.csdn.net/asiwxy/article/details/82955185

将表格矫正之后,我们接下来应该对表格进行提取,首先,先对传进来的表格模板进行图形处理,先对将要使用的函数进行介绍:

一,函数介绍

1)  函数  findContours(....) 用于查找轮廓。


void findContours//提取轮廓,用于提取图像的轮廓
(
InputOutputArray image,//输入图像,必须是8位单通道图像,并且应该转化成二值的
OutputArrayOfArrays contours,//检测到的轮廓,每个轮廓被表示成一个point向量
OutputArray hierarchy,//可选的输出向量,包含图像的拓扑信息。其中元素的个数和检测到的轮廓的数量相等
int mode,//说明需要的轮廓类型和希望的返回值方式
int method,//轮廓近似方法
Point offset = Point()
)

里面的参数介绍请参照:https://blog.csdn.net/qq_29540745/article/details/52496477

(2)函数 drawContours(....)   用于画出轮廓。


void drawContours//绘制轮廓,用于绘制找到的图像轮廓
(InputOutputArray image,//要绘制轮廓的图像InputArrayOfArrays contours,//所有输入的轮廓,每个轮廓被保存成一个point向量int contourIdx,//指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓const Scalar& color,//绘制轮廓所用的颜色int thickness = 1, //绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充int lineType = 8, /绘制轮廓的线的连通性InputArray hierarchy = noArray(),//关于层级的可选参数,只有绘制部分轮廓时才会用到int maxLevel = INT_MAX,//绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效//maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓//maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。//maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与子节点以及子节点的子节点Point offset = Point()
)

(3) 函数 adaptiveThreshold(.......) 用于自动阈值化

void adaptiveThreshold(InputArray src, //原图像,无符号的八位
OutputArray dst,                       //输出图像
double maxValue,
int adaptiveMethod,                    //在领域内计算阈值采用的方法,块处理//ADAPTIVE_THRESH_MEAN_C 平均值         //ADAPTIVE_THRESH_GAUSSIAN_C 高斯分布加权和
int thresholdType,                     //二值化的类型//CV_THRESH_BINARY 大于为最大值//CV_THRESH_BINARY_INV 小于为最大值
int blockSize,                         //块的大小,为基数
double C)                              //偏移量,但不知道有什么用....尴尬

参数介绍:

1). int adaptiveMethod :块处理的方法,

ADAPTIVE_THRESH_MEAN_C 相当于对图片进行均值滤波的处理,计算出领域的平均值再减去第七个参数C

DAPTIVE_THRESH_GAUSSIAN_C 相当于对图片进行了高斯模糊,计算出领域的平均值再减去第七个参数C

(4)形态学 getStructuringElement(.....)获取结构元素, erode(......)腐蚀,黑色区域增多,   dilate(......)膨胀,白色区域增多。

腐蚀膨胀参数完全一样。

Mat getStructuringElement(int shape,  //矩形:MORPH_RECT;//交叉形:MORPH_CORSS;//椭圆形:MORPH_ELLIPSE;
Size esize,
Point anchor = Point(-1, -1));        //锚点,默认在中心void erode( const Mat& src,
Mat& dst,
const Mat& element,                   //结构元素
Point anchor=Point(-1,-1),            //内核中心点
int iterations=1,                     //腐蚀次数
int borderType=BORDER_CONSTANT,       //推断边缘类型
const Scalar& borderValue=morphologyDefaultBorderValue() ); //边缘值

二,表格提取代码

提供了源代码的下载,但是 adaptiveThreshold()函数的最后两个参数,要根据实际的情况库,自己慢慢调,要不然对表格进行处理之后,就会产生一些奇怪的现象,比如,表格的某条线被你弄丢了,或者某条线短了一截。对,没毛病。。。我被这个坑了好几天,换了好几种方法。(瑟瑟发抖。。。)

void dealImage(const Mat & img, Mat & mask, Mat & joints)
{// 调整尺寸Mat rsz;Size size(700, 900);resize(img, rsz, size);// 检查是否为灰度图,如果不是,转化为灰度图Mat gray;if (rsz.channels() != 1) {cvtColor(rsz, gray, CV_BGR2GRAY);}else {gray = rsz;}//转化为二值图 Mat bw;adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 161, -2);Mat horizontal = bw.clone();Mat vertical = bw.clone();int scale = 15; //使用这个变量来增加/减少待检测的行数/** 提取水平线条  */ //指定水平轴上的大小 int horizontalsize = horizontal.cols / scale;//结构元素Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontalsize, 1));// 形态学erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));/** 提取竖直线条  */ // Specify size on vertical axisint verticalsize = vertical.rows / scale;Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, verticalsize));erode(vertical, vertical, verticalStructure, Point(-1, -1));dilate(vertical, vertical, verticalStructure, Point(-1, -1));//将两张图片进行与操作bitwise_and(horizontal, vertical, joints);imshow("joints", joints);// create a mask which includes the tablesmask = horizontal + vertical;
}

原图像如下:

图一

将图像进行水平方向的腐蚀和膨胀之后,结果如下:

图二

对图像进行竖直方向的腐蚀膨胀,结果如下:

图三

将图一和图二相,结果如下:(图有点黑,其实上面是有小点点的)

图四

将图二和图三相加,结果如下:

经过以上的处理之后,我们就得到了只剩下线条的,完全空白的表格了,这下在对表格的每个格子进行提取就方便很多了。

参考:http://answers.opencv.org/question/63847/how-to-extract-tables-from-an-image/

opencv 表格识别之表格的提取(一)相关推荐

  1. opencv 表格识别之表格透视矫正(一)

    这个项目的目的是让用户选择模板表格(未填写的表格)中的多个或者一个小格子,然后将扫描(注意:是扫描的表格)传入的填写好的表格对应的格子提取出来,对格子中的选择进行处理. 在对表格进行处理之前,我们应该 ...

  2. opencv 表格识别之表格透视矫正(二)

    上一篇文章中给出了一种对表格进行矫正的方法,但是只能用于只有一个表格的情况,对于有多个表格的情况的矫正的方法,将在这篇文章中给出. 单个表格矫正:链接 一, 函数的介绍 (1)Homography(. ...

  3. OpenCV人脸识别(3)提取面部特征

    准备工作 1)在新建的pyCharm项目加入如下文件夹,和文件 百度网盘链接:https://pan.baidu.com/s/1wUYqnW10HcjvnZ9xO7Nktg 提取码:m762 把这些文 ...

  4. 【技术新趋势】合合信息:表格识别与内容提炼技术理解及研发趋势

    点击领取AI产品100元体验金,助力开发者高效工作解决文档难题: AI产品专享礼遇 引言: 表格是各类文档中常见的对象,其结构化的组织形式方便人们进行信息理解和提取.表格的种类根据有无边框可以划分有线 ...

  5. 2021-IEEE论文-深度神经网络在文档图像表格识别中的应用现状及性能分析

    2021年5月12日收到, 2021年6月4日接受, 出版日期2021年6月9日, 当前版本日期2021年6月24日. 原论文下载地址 摘要 - Abstract   表格识别的第一阶段是检测文档中的 ...

  6. 三篇论文,纵览深度学习在表格识别中的最新应用

    本文从三篇表格识别领域的精选论文出发,深入分析了深度学习在表格识别任务中的应用. 表格识别是文档分析与识别领域的一个重要分支,其具体目标是从表格中获取和访问数据及其它有效信息.众所周知,本质上表格是信 ...

  7. 通用票据识别/通用文字识别/通用表格识别/手写识别简述

    经济日益繁荣,随之而来的是多如牛毛的合同.文件.表单和票据,尤其是一些大的企业集团,文件资料更是数不胜数,这些纸质资料十分占用空间,并且易丢失.易损坏,不宜传递和保存,如何有效的保存.处理和分享这些纸 ...

  8. Windows系统下使用pyinstaller打包PaddleOCR中表格识别PP-Structure

    Windows系统下使用pyinstaller打包PaddleOCR中表格识别PP-Structure 一.系统环境及PP-Structure简述 二.安装Python环境与PP-Structure ...

  9. 【精华】表格识别技术-MI

    文章目录 一.背景 三.表格检测算法 四.表格识别算法 五.对齐算法 表格识别是指将图片中的表格结构和文字信息识别成计算机可以理解的数据格式,在办公.商务.教育等场景中有着广泛的实用价值,也一直是文档 ...

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

最新文章

  1. 让你直呼哇塞的API管理神器!
  2. .NET Core微服务 权限系统+工作流(二)工作流系统
  3. 如何科学高效的学习Web前端开发?
  4. javascirpt如何模仿块级作用域(js高程笔记)
  5. do还是doing imagine加to_Want后面竟然可以跟doing?!to do和doing有什么区别?
  6. 算法 Tricks(二) —— 大数的处理
  7. 框架之---Flask
  8. 进击的华为云医疗AI:顶会两篇论文连发,研究和落地加速
  9. 计算机网络习题——循环冗余校验
  10. 交互设计和UI设计有区别吗 UI学习路线是什么
  11. JAVA 赛码网|笔试时输入输出的控制
  12. 软件工程专业四年注意事项以及学习计划
  13. SIP协议详解(中文)-6
  14. 回头再说--赶紧说两句
  15. c语言变量大全,C语言变量
  16. 大工14春 计算机文化基础 在线测试,大工14春《计算机文化基础》在线测试1
  17. 二叉搜索树BST的学习
  18. layui显示分页,搜索后重置分页
  19. WOW平衡性设计理念
  20. 【ISAR成像定标方法(2)—平动目标ISAR成像的运动补偿方法MATLAB仿真】

热门文章

  1. ValueError: operands could not be broadcast together with shapes (416,416,4) (3,)
  2. 我为什么要转到软件工程专业
  3. mysql frm、MYD、MYI数据文件恢复,导入MySQL中
  4. WebP是什么格式?如何免费批量转换JPEG
  5. 小程序自动定位当前位置
  6. nRF51 SDK 例程分析——Blinky Example
  7. r语言nonzerocoef函数_R语言如何做COX回归分析和nomogram?
  8. Linux命令学习手册-vi介绍
  9. 猫加路由加服务器加交换机怎么配置文件,光猫接交换机和路由器,怎么设置?...
  10. 【Vue】以登录token为例,理解vuex状态管理使用