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

请参考: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. 图论之tarjan缩点
  2. 收藏 | 500页阿里、滴滴、快手等公司的大数据最佳实践!PDF限时下载
  3. lisp用entmake生产圆柱体_使用lisp语言实现在平面图中自动画出桥梁的墩柱标识.doc...
  4. Android数据库存放的具体位置
  5. 下拉框_jQuery 美化界面的下拉框
  6. 985研究生连论文都不会写,还面试什么大厂
  7. python大列表分割成小列表_Python有什么方法将列表分割成大小均匀的块?求使用实例...
  8. (转)Struts2访问Servlet的API及......
  9. 应急响应系统日志及日志分析四
  10. redis的key与value乱码问题
  11. 15 种最受欢迎的数据可视化流程图及模板
  12. 确定有限状态自动机(deterministic finite automaton)DFA
  13. vue按住shift键多选(以element框架的table为例)
  14. Kettle构建Hadoop ETL实践(八-2):维度表技术
  15. base ring shell skirt skirt 压力容器_压力容器工程规定(2)
  16. uvalive 4413(梅涅劳斯定理)
  17. c#—MemoryStream读图片存入ImageList
  18. 浅谈Mesh组网与AC+AP组网区别
  19. echarts图表插件炫光的分布地图动画特效
  20. 办公室各种办公用品集锦

热门文章

  1. 关于:WindowsOffice 产品语言包
  2. iOS之加载Gif图片
  3. 怎么找网页源文件位置_win7系统查看网页源文件的三种方法
  4. 手机投屏到电视上怎么操作?
  5. 【华为OD机试真题 JAVA】事件推送
  6. xp怎么看自己计算机密码,XP如何查看wifi密码?
  7. 金蝶KIS专业版V14.1即时库存查询表添加字段条形码|商品描述|最低最高存量
  8. linux中文本保存的快捷键,liunx中vi快捷键编辑
  9. YOLOX安装部署使用训练教程以及报错
  10. 华为模拟器eNSP练习题 - VLAN综合实验