CN112036294B - 一种纸质表格结构自动识别的方法及装置 - Google Patents
一种纸质表格结构自动识别的方法及装置 Download PDFInfo
- Publication number
- CN112036294B CN112036294B CN202010882990.1A CN202010882990A CN112036294B CN 112036294 B CN112036294 B CN 112036294B CN 202010882990 A CN202010882990 A CN 202010882990A CN 112036294 B CN112036294 B CN 112036294B
- Authority
- CN
- China
- Prior art keywords
- point
- list
- word
- points
- vertical
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06V—IMAGE OR VIDEO RECOGNITION OR UNDERSTANDING
- G06V30/00—Character recognition; Recognising digital ink; Document-oriented image-based pattern recognition
- G06V30/40—Document-oriented image-based pattern recognition
- G06V30/41—Analysis of document content
- G06V30/413—Classification of content, e.g. text, photographs or tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06V—IMAGE OR VIDEO RECOGNITION OR UNDERSTANDING
- G06V10/00—Arrangements for image or video recognition or understanding
- G06V10/20—Image preprocessing
- G06V10/32—Normalisation of the pattern dimensions
Abstract
本发明公开一种纸质表格结构自动识别的方法及装置,该方法包括:读取通过纸质表格转化的图片文件并转成灰度图,利用mser算法计算单个文字的平均宽度和高度像素值;对灰度图像进行二值化处理,生成img_bin;对img_bin分别进行水平和垂直方向的腐蚀操作、翻转处理、膨胀操作、翻转处理,得到水平和垂直方向处理后的图像;对二者进行逻辑与操作,获取所有交叉点并记录;对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合。本发明的表格结构识别更准确、高效。
Description
技术领域
本发明属于图像处理技术领域,涉及实线、封闭的纸质表格结构自动识别,尤其涉及一种纸质表格结构自动识别的方法及装置。
背景技术
随着信息化的不断推进,各行各业都在进行着信息化的建设。有些信息化系统中需要把纸质表格数据录入到系统中,通常的处理方式是先把纸质表格拍照或者扫描成图片文件,然后通过表格识别处理,获取表格里的数据,但是由于拍照或扫描的设备不同,导致图像的分辨率不同,进而表格线条粗细不同、文字大小不同,另外还有图像中的表格线变形或者存在手写字体干扰等等,常常识别准确率不够,导致表格元素多检或漏检。
现有技术(如CN110751038A)大多针对PDF文档中的表格进行处理,此种场景下的表格大多规整,转成图像后的尺寸和现实尺寸相当,不像拍照或者扫描的纸质表格,尺寸会放大很多倍。现有技术中也有人提出来解决表格元素多检或漏检的方法,但是这些方法大多需要人为干预,需要根据实际表格的情况,人为设定参数来提高准确率。
发明内容
本发明针对由于拍照或扫描的设备不同,导致图像的分辨率不同,进而表格线条粗细不同、文字大小不同;图像中的表格线变形或者存在手写字体干扰等,使识别准确率不够,导致表格元素多检或漏检的问题,提出一种纸质表格结构自动识别的方法及装置,可以减少由于表格尺寸放大、表格线条变形或者其他干扰导致到漏检、多检表格元素的问题,减少人工参与,提高表格识别准确率。
为了实现上述目的,本发明采用以下技术方案:
一种纸质表格结构自动识别的方法,包括:
步骤1:读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;
步骤2:对灰度图像进行二值化处理,生成二值化图像img_bin;
步骤3:对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
步骤4:对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
步骤5:对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
步骤6:对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
步骤7:按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构。
进一步地,所述步骤3包括:
步骤3.1:应用大小为(1,2)的卷积核对二值化图像img_bin进行水平腐蚀操作,重复水平腐蚀操作word_width次,过滤掉低于word_width像素的水平线条;
步骤3.2:对图像进行翻转处理,再应用大小为(1,2)的卷积核对图像进行水平膨胀操作,重复word_width次水平膨胀操作恢复保留下来的水平线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_horizontal。
进一步地,所述步骤4包括:
步骤4.1:应用大小为(2,1)的卷积核对二值化图像img_bin进行垂直腐蚀操作,重复垂直腐蚀操作word_width次,过滤掉低于word_width像素的垂直线条;
步骤4.2:对图像进行翻转处理,再应用大小为(2,1)的卷积核对图像进行垂直膨胀操作,重复word_height次垂直膨胀操作恢复保留下来的垂直线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_vertical。
进一步地,所述步骤6中,对所有交叉点按行进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照y值进行排序得到list<point_y>;
遍历list<point_y>,计算当前点与前一个点的y轴差值,如果所述y轴差值小于等于2*h,则认为是同一行的点,前后两个点分成一组;如果所述y轴差值大于2*h并且小于word_height,则认为是干扰点丢弃掉当前点,同步在list<point_x>中丢弃掉相同的点;如果所述y轴差值大于word_height,则认为是另外一行的点,将当前点分到一个新组中;最终按照一行为一组的原则生成按行分组的交叉点集合list<list<point_y>>。
进一步地,所述步骤6中,对所有交叉点按列进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照x值进行排序得到list<point_x>;
遍历list<point_x>,计算当前点与前一个点的x轴差值,如果所述x轴差值小于等于2*w,则认为是同一列的点,前后两个点分成一组;如果所述x轴差值大于2*w并且小于word_width,则认为是干扰点丢弃掉当前点,同步在list<list<point_y>>中丢弃掉相同的点;如果所述x轴差值大于word_width,则认为是另外一列的点,将当前点分到一个新组中;最终按照一列为一组的原则生成按列分组的交叉点集合list<list<point_x>>。
进一步地,所述步骤7包括:
步骤7.1:遍历按行分组的交叉点集合list<list<point_y>>,按顺序取出交叉点point(x,y,w,h),在按列分组的交叉点集合list<list<point_x>>中同步查找同一个点point(x,y,w,h)的位置;
步骤7.2:按行获取本行的下一个交叉点point_y_next(x,y,w,h),如果点point_y_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤7.4;
步骤7.3:按列获取本列的下一个交叉点point_x_next(x,y,w,h),如果点point_x_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤7.4;
步骤7.4:根据point_y_next(x,y,w,h),point_x_next(x,y,w,h)计算出point(x,y,w,h)的对角点point_across(x,y,w,h);然后以该4个点为顶点,分别判断是否存在4条边线,即上边线、左边线、下边线及右边线;其中,上边线为point(x,y,w,h)-point_y_next(x,y,w,h),左边线为point(x,y,w,h)-point_x_next(x,y,w,h),下边线为point_x_next(x,y,w,h)-point_across(x,y,w,h),右边线为point_y_next(x,y,w,h)-point_across(x,y,w,h);
步骤7.5:如果上边线或左边线不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果下边线不存在,则转至步骤7.3继续执行;如果右边线不存在,则转至步骤7.2继续执行;如果4条边线都存在,则根据4个顶点的信息,按照4条边线的内边缘位置记录单元格信息rect(x1,y1,x2,y2),其中x1和y1为单元格的左上角坐标,x2和y3为单元格的右下角坐标;
步骤7.6:遍历完交叉点集合list<list<point_y>>所有元素后,返回单元格集合list<rect(x1,y1,x2,y2)>,代表表格结构。
进一步地,所述步骤7.4中,判断是否存在4条边线,包括:
如果两个点组成的线段为水平线段,则计算两个点之间x值的差值,如果小于两个点组成的线段内的像素值的和,则认为上边线或下边线存在;
如果两个点组成的线段为垂直线段,则计算两个点之间y值的差值,如果小于两个点组成的线段内的像素值的和,则认为左边线或右边线存在。
一种纸质表格结构自动识别的装置,包括:
第一计算模块,用于读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;
二值化处理模块,用于对灰度图像进行二值化处理,生成二值化图像img_bin;
水平处理模块,用于对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
垂直处理模块,用于对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
交叉点获取模块,用于对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
交叉点处理模块,用于对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
交叉点遍历模块,用于按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构。
与现有技术相比,本发明具有的有益效果:
本发明针对由于拍照或扫描的设备不同,导致图像的分辨率不同,进而表格线条粗细不同、文字大小不同;图像中的表格线变形或者存在手写字体干扰等,使识别准确率不够,导致表格元素多检或漏检的问题,提出一种纸质表格结构自动识别的方法及装置,可以减少由于表格尺寸放大、表格线条变形或者其他干扰导致到漏检、多检表格元素的问题,减少人工参与,提高表格识别准确率。本发明通过计算获取表格中文字的平均尺寸,作为处理参数,进行后续的处理过程,适应性更强,表格结构识别更准确;运算过程简单、运算量小、识别更高效。
附图说明
图1为本发明实施例一种纸质表格结构自动识别的方法的基本流程图;
图2为本发明实施例一种纸质表格结构自动识别的方法的交叉点按行分组和过滤流程图;
图3为本发明实施例一种纸质表格结构自动识别的方法的交叉点按列分组和过滤流程图;
图4为本发明实施例一种纸质表格结构自动识别的方法的遍历交叉点、获取表格结构流程图;
图5为本发明实施例一种纸质表格结构自动识别的装置的结构示意图。
具体实施方式
下面结合附图和具体的实施例对本发明做进一步的解释说明:
如图1所示,一种纸质表格结构自动识别的方法,包括:
步骤S101:读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;具体地,可把纸质表格扫描或拍照成图片文件;
步骤S102:对灰度图像进行二值化处理,生成二值化图像img_bin;
步骤S103:对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
步骤S104:对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
步骤S105:对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
步骤S106:对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
步骤S107:按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构。
进一步地,在步骤S107之后,还可包括:
利用ocr识别单元格中的文字,以json格式返回。
进一步地,所述步骤S103包括:
步骤S103.1:应用大小为(1,2)的卷积核对二值化图像img_bin进行水平腐蚀操作,重复水平腐蚀操作word_width次,过滤掉低于word_width像素的水平线条;
步骤S103.2:对图像进行翻转处理,再应用大小为(1,2)的卷积核对图像进行水平膨胀操作,重复word_width次水平膨胀操作恢复保留下来的水平线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_horizontal。
进一步地,所述步骤S104包括:
步骤S104.1:应用大小为(2,1)的卷积核对二值化图像img_bin进行垂直腐蚀操作,重复垂直腐蚀操作word_width次,过滤掉低于word_width像素的垂直线条;
步骤S104.2:对图像进行翻转处理,再应用大小为(2,1)的卷积核对图像进行垂直膨胀操作,重复word_height次垂直膨胀操作恢复保留下来的垂直线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_vertical。
进一步地,如图2所示,所述步骤S106中,对所有交叉点按行进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照y值进行排序得到list<point_y>;
遍历list<point_y>,计算当前点与前一个点的y轴差值,如果所述y轴差值小于等于2*h,则认为是同一行的点,前后两个点分成一组;如果所述y轴差值大于2*h并且小于word_height,则认为是干扰点丢弃掉当前点,同步在list<point_x>中丢弃掉相同的点;如果所述y轴差值大于word_height,则认为是另外一行的点,将当前点分到一个新组中;最终按照一行为一组的原则生成按行分组的交叉点集合list<list<point_y>>。
进一步地,如图3所示,所述步骤S106中,对所有交叉点按列进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照x值进行排序得到list<point_x>;
遍历list<point_x>,计算当前点与前一个点的x轴差值,如果所述x轴差值小于等于2*w,则认为是同一列的点,前后两个点分成一组;如果所述x轴差值大于2*w并且小于word_width,则认为是干扰点丢弃掉当前点,同步在list<list<point_y>>中丢弃掉相同的点;如果所述x轴差值大于word_width,则认为是另外一列的点,将当前点分到一个新组中;最终按照一列为一组的原则生成按列分组的交叉点集合list<list<point_x>>。
进一步地,如图4所示,所述步骤S107包括:
步骤S107.1:遍历按行分组的交叉点集合list<list<point_y>>,按顺序取出交叉点point(x,y,w,h),在按列分组的交叉点集合list<list<point_x>>中同步查找同一个点point(x,y,w,h)的位置;
步骤S107.2:按行获取本行的下一个交叉点point_y_next(x,y,w,h),如果点point_y_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤S107.4;
步骤S107.3:按列获取本列的下一个交叉点point_x_next(x,y,w,h),如果点point_x_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤S107.4;
步骤S107.4:根据point_y_next(x,y,w,h),point_x_next(x,y,w,h)计算出point(x,y,w,h)的对角点point_across(x,y,w,h);然后以该4个点为顶点,分别判断是否存在4条边线,即上边线、左边线、下边线及右边线;其中,上边线为point(x,y,w,h)-point_y_next(x,y,w,h),左边线为point(x,y,w,h)-point_x_next(x,y,w,h),下边线为point_x_next(x,y,w,h)-point_across(x,y,w,h),右边线为point_y_next(x,y,w,h)-point_across(x,y,w,h);即point(x,y,w,h)和point_y_next(x,y,w,h)两点组成的线段为上边线,point(x,y,w,h)和point_x_next(x,y,w,h) 两点组成的线段为左边线,point_x_next(x,y,w,h)和point_across(x,y,w,h) 两点组成的线段为下边线,point_y_next(x,y,w,h)和point_across(x,y,w,h)两点组成的线段为右边线;
步骤S107.5:如果上边线或左边线不存在,且list<list<point_y>>遍历未结束则转至步骤S107.1继续执行;如果下边线不存在,则转至步骤S107.3继续执行;如果右边线不存在,则转至步骤S107.2继续执行;如果4条边线都存在,则根据4个顶点的信息,按照4条边线的内边缘位置记录单元格信息rect(x1,y1,x2,y2),其中x1和y1为单元格的左上角坐标,x2和y3为单元格的右下角坐标;
步骤S107.6:遍历完交叉点集合list<list<point_y>>所有元素后,返回单元格集合list<rect(x1,y1,x2,y2)>,代表表格结构。
进一步地,所述步骤S107.4中,判断是否存在4条边线,包括:
如果两个点组成的线段为水平线段,则计算两个点之间x值的差值,如果小于两个点组成的线段内的像素值的和,则认为上边线或下边线存在;
如果两个点组成的线段为垂直线段,则计算两个点之间y值的差值,如果小于两个点组成的线段内的像素值的和,则认为左边线或右边线存在。
具体地,通过计算point(x,y,w,h)和point_y_next(x,y,w,h)之间的x值的差值来判断是否存在上边线、即point(x,y,w,h)-point_y_next(x,y,w,h),如果x值的差值小于两个点组成的线段的像素值的和,则认为point(x,y,w,h)-point_y_next(x,y,w,h)存在;通过计算point_x_next(x,y,w,h)和point_across(x,y,w,h)之间的x值的差值来判断是否存在下边线、即point_x_next(x,y,w,h)-point_across(x,y,w,h),如果x值的差值小于两个点组成的线段的像素值的和,则认为point_x_next(x,y,w,h)-point_across(x,y,w,h)存在;
具体地,通过计算point(x,y,w,h)和point_x_next(x,y,w,h)之间的y值的差值来判断是否存在左边线、即point(x,y,w,h)-point_x_next(x,y,w,h),如果y值的差值小于两个点组成的线段的像素值的和,则认为point(x,y,w,h)-point_x_next(x,y,w,h)存在;通过计算point_y_next(x,y,w,h)和point_across(x,y,w,h)之间的y值的差值来判断是否存在右边线、即point_y_next(x,y,w,h)-point_across(x,y,w,h),如果y值的差值小于两个点组成的线段的像素值的和,则认为point_y_next(x,y,w,h)-point_across(x,y,w,h)存在。
在上述实施例的基础上,如图5所示,本发明还公开一种纸质表格结构自动识别的装置,包括:
第一计算模块201,用于读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;
二值化处理模块202,用于对灰度图像进行二值化处理,生成二值化图像img_bin;
水平处理模块203,用于对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
垂直处理模块204,用于对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
交叉点获取模块205,用于对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
交叉点处理模块206,用于对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
交叉点遍历模块207,用于按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构。
进一步地,还包括:
文字识别模块,用于利用ocr识别单元格中的文字,以json格式返回。
进一步地,所述水平处理模块203包括:
第一水平处理子模块,用于应用大小为(1,2)的卷积核对二值化图像img_bin进行水平腐蚀操作,重复水平腐蚀操作word_width次,过滤掉低于word_width像素的水平线条;
第二水平处理子模块,用于对图像进行翻转处理,再应用大小为(1,2)的卷积核对图像进行水平膨胀操作,重复word_width次水平膨胀操作恢复保留下来的水平线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_horizontal。
进一步地,所述垂直处理模块204包括:
第一垂直处理子模块,用于应用大小为(2,1)的卷积核对二值化图像img_bin进行垂直腐蚀操作,重复垂直腐蚀操作word_width次,过滤掉低于word_width像素的垂直线条;
第二垂直处理子模块,用于对图像进行翻转处理,再应用大小为(2,1)的卷积核对图像进行垂直膨胀操作,重复word_height次垂直膨胀操作恢复保留下来的垂直线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_vertical。
进一步地,所述交叉点处理模块206中,对所有交叉点按行进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照y值进行排序得到list<point_y>;
遍历list<point_y>,计算当前点与前一个点的y轴差值,如果所述y轴差值小于等于2*h,则认为是同一行的点,前后两个点分成一组;如果所述y轴差值大于2*h并且小于word_height,则认为是干扰点丢弃掉当前点,同步在list<point_x>中丢弃掉相同的点;如果所述y轴差值大于word_height,则认为是另外一行的点,将当前点分到一个新组中;最终按照一行为一组的原则生成按行分组的交叉点集合list<list<point_y>>。
进一步地,所述交叉点处理模块206中,对所有交叉点按列进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照x值进行排序得到list<point_x>;
遍历list<point_x>,计算当前点与前一个点的x轴差值,如果所述x轴差值小于等于2*w,则认为是同一列的点,前后两个点分成一组;如果所述x轴差值大于2*w并且小于word_width,则认为是干扰点丢弃掉当前点,同步在list<list<point_y>>中丢弃掉相同的点;如果所述x轴差值大于word_width,则认为是另外一列的点,将当前点分到一个新组中;最终按照一列为一组的原则生成按列分组的交叉点集合list<list<point_x>>。
进一步地,所述交叉点遍历模块207包括:
主循环子模块,用于遍历按行分组的交叉点集合list<list<point_y>>,按顺序取出交叉点point(x,y,w,h),在按列分组的交叉点集合list<list<point_x>>中同步查找同一个点point(x,y,w,h)的位置;
按行查找循环子模块,用于按行获取本行的下一个交叉点point_y_next(x,y,w,h),如果点point_y_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至主循环子模块继续执行;如果存在,则执行判断子模块;
按列查找循环子模块,用于按列获取本列的下一个交叉点point_x_next(x,y,w,h),如果点point_x_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至主循环子模块继续执行;如果存在,则执行判断子模块;
判断子模块,用于根据point_y_next(x,y,w,h),point_x_next(x,y,w,h)计算出point(x,y,w,h)的对角点point_across(x,y,w,h);然后以该4个点为顶点,分别判断是否存在4条边线,即上边线、左边线、下边线及右边线;其中,上边线为point(x,y,w,h)-point_y_next(x,y,w,h),左边线为point(x,y,w,h)-point_x_next(x,y,w,h),下边线为point_x_next(x,y,w,h)-point_across(x,y,w,h),右边线为point_y_next(x,y,w,h)-point_across(x,y,w,h);
跳转执行子模块,用于如果上边线或左边线不存在,且list<list<point_y>>遍历未结束则转至主循环子模块继续执行;如果下边线不存在,则转至按列查找循环子模块继续执行;如果右边线不存在,则转至按行查找循环子模块继续执行;如果4条边线都存在,则根据4个顶点的信息,按照4条边线的内边缘位置记录单元格信息rect(x1,y1,x2,y2),其中x1和y1为单元格的左上角坐标,x2和y3为单元格的右下角坐标;
表格结构得出子模块,用于遍历完交叉点集合list<list<point_y>>所有元素后,返回单元格集合list<rect(x1,y1,x2,y2)>,代表表格结构。
进一步地,所述判断子模块中,判断是否存在4条边线,包括:
如果两个点组成的线段为水平线段,则计算两个点之间x值的差值,如果小于两个点组成的线段内的像素值的和,则认为上边线或下边线存在;
如果两个点组成的线段为垂直线段,则计算两个点之间y值的差值,如果小于两个点组成的线段内的像素值的和,则认为左边线或右边线存在。
综上,本发明针对由于拍照或扫描的设备不同,导致图像的分辨率不同,进而表格线条粗细不同、文字大小不同;图像中的表格线变形或者存在手写字体干扰等,使识别准确率不够,导致表格元素多检或漏检的问题,提出一种纸质表格结构自动识别的方法及装置,可以减少由于表格尺寸放大、表格线条变形或者其他干扰导致到漏检、多检表格元素的问题,减少人工参与,提高表格识别准确率。本发明通过计算获取表格中文字的平均尺寸,作为处理参数,进行后续的处理过程,适应性更强,表格结构识别更准确;运算过程简单、运算量小、识别更高效。
以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (4)
1.一种纸质表格结构自动识别的方法,其特征在于,包括:
步骤1:读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;
步骤2:对灰度图像进行二值化处理,生成二值化图像img_bin;
步骤3:对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
步骤4:对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
步骤5:对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
步骤6:对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
步骤7:按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构;
所述步骤3包括:
步骤3.1:应用大小为(1,2)的卷积核对二值化图像img_bin进行水平腐蚀操作,重复水平腐蚀操作word_width次,过滤掉低于word_width像素的水平线条;
步骤3.2:对图像进行翻转处理,再应用大小为(1,2)的卷积核对图像进行水平膨胀操作,重复word_width次水平膨胀操作恢复保留下来的水平线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_horizontal;
所述步骤4包括:
步骤4.1:应用大小为(2,1)的卷积核对二值化图像img_bin进行垂直腐蚀操作,重复垂直腐蚀操作word_width次,过滤掉低于word_width像素的垂直线条;
步骤4.2:对图像进行翻转处理,再应用大小为(2,1)的卷积核对图像进行垂直膨胀操作,重复word_height次垂直膨胀操作恢复保留下来的垂直线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_vertical;
所述步骤6中,对所有交叉点按行进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照y值进行排序得到list<point_y>;
遍历list<point_y>,计算当前点与前一个点的y轴差值,如果所述y轴差值小于等于2*h,则认为是同一行的点,前后两个点分成一组;如果所述y轴差值大于2*h并且小于word_height,则认为是干扰点丢弃掉当前点,同步在list<point_x>中丢弃掉相同的点;如果所述y轴差值大于word_height,则认为是另外一行的点,将当前点分到一个新组中;最终按照一行为一组的原则生成按行分组的交叉点集合list<list<point_y>>;
所述步骤6中,对所有交叉点按列进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照x值进行排序得到list<point_x>;
遍历list<point_x>,计算当前点与前一个点的x轴差值,如果所述x轴差值小于等于2*w,则认为是同一列的点,前后两个点分成一组;如果所述x轴差值大于2*w并且小于word_width,则认为是干扰点丢弃掉当前点,同步在list<list<point_y>>中丢弃掉相同的点;如果所述x轴差值大于word_width,则认为是另外一列的点,将当前点分到一个新组中;最终按照一列为一组的原则生成按列分组的交叉点集合list<list<point_x>>。
2.根据权利要求1所述的一种纸质表格结构自动识别的方法,其特征在于,所述步骤7包括:
步骤7.1:遍历按行分组的交叉点集合list<list<point_y>>,按顺序取出交叉点point(x,y,w,h),在按列分组的交叉点集合list<list<point_x>>中同步查找同一个点point(x,y,w,h)的位置;
步骤7.2:按行获取本行的下一个交叉点point_y_next(x,y,w,h),如果点point_y_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤7.4;
步骤7.3:按列获取本列的下一个交叉点point_x_next(x,y,w,h),如果点point_x_next(x,y,w,h)不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果存在,则执行步骤7.4;
步骤7.4:根据point_y_next(x,y,w,h),point_x_next(x,y,w,h)计算出point(x,y,w,h)的对角点point_across(x,y,w,h);然后以该4个点为顶点,分别判断是否存在4条边线,即上边线、左边线、下边线及右边线;其中,上边线为point(x,y,w,h)-point_y_next(x,y,w,h),左边线为point(x,y,w,h)-point_x_next(x,y,w,h),下边线为point_x_next(x,y,w,h)-point_across(x,y,w,h),右边线为point_y_next(x,y,w,h)-point_across(x,y,w,h);
步骤7.5:如果上边线或左边线不存在,且list<list<point_y>>遍历未结束则转至步骤7.1继续执行;如果下边线不存在,则转至步骤7.3继续执行;如果右边线不存在,则转至步骤7.2继续执行;如果4条边线都存在,则根据4个顶点的信息,按照4条边线的内边缘位置记录单元格信息rect(x1,y1,x2,y2),其中x1和y1为单元格的左上角坐标,x2和y3为单元格的右下角坐标;
步骤7.6:遍历完交叉点集合list<list<point_y>>所有元素后,返回单元格集合list<rect(x1,y1,x2,y2)>,代表表格结构。
3.根据权利要求2所述的一种纸质表格结构自动识别的方法,其特征在于,所述步骤7.4中,判断是否存在4条边线,包括:
如果两个点组成的线段为水平线段,则计算两个点之间x值的差值,如果小于两个点组成的线段内的像素值的和,则认为上边线或下边线存在;
如果两个点组成的线段为垂直线段,则计算两个点之间y值的差值,如果小于两个点组成的线段内的像素值的和,则认为左边线或右边线存在。
4.一种纸质表格结构自动识别的装置,其特征在于,包括:
第一计算模块,用于读取通过纸质表格转化的图片文件并转成灰度图像,利用mser算法计算单个文字的平均宽度像素值word_width和平均高度像素值word_height;
二值化处理模块,用于对灰度图像进行二值化处理,生成二值化图像img_bin;
水平处理模块,用于对img_bin依次进行水平腐蚀操作、翻转处理、水平膨胀操作、翻转处理,得到处理后的图像img_horizontal;
垂直处理模块,用于对img_bin依次进行垂直腐蚀操作、翻转处理、垂直膨胀操作、翻转处理,得到处理后的图像img_vertical;
交叉点获取模块,用于对img_horizontal和img_vertical进行逻辑与操作,获取水平线和垂直线的所有交叉点list<point>并记录,每个交叉点用(x,y,w,h)记录,x和y分别为x轴和y轴的坐标,w和h分别为交叉点的宽和高;
交叉点处理模块,用于对所有交叉点分别按行、按列进行排序和分组,并过滤掉无效交叉点;
交叉点遍历模块,用于按照从上到下,从左到右的顺序,遍历交叉点,生成单元格集合,代表表格结构;
所述水平处理模块包括:
第一水平处理子模块,用于应用大小为(1,2)的卷积核对二值化图像img_bin进行水平腐蚀操作,重复水平腐蚀操作word_width次,过滤掉低于word_width像素的水平线条;
第二水平处理子模块,用于对图像进行翻转处理,再应用大小为(1,2)的卷积核对图像进行水平膨胀操作,重复word_width次水平膨胀操作恢复保留下来的水平线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_horizontal;
所述垂直处理模块包括:
第一垂直处理子模块,用于应用大小为(2,1)的卷积核对二值化图像img_bin进行垂直腐蚀操作,重复垂直腐蚀操作word_width次,过滤掉低于word_width像素的垂直线条;
第二垂直处理子模块,用于对图像进行翻转处理,再应用大小为(2,1)的卷积核对图像进行垂直膨胀操作,重复word_height次垂直膨胀操作恢复保留下来的垂直线条到原来的尺寸,然后再对图像做翻转处理,得到处理后的图像img_vertical;
所述交叉点处理模块中,对所有交叉点按行进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照y值进行排序得到list<point_y>;
遍历list<point_y>,计算当前点与前一个点的y轴差值,如果所述y轴差值小于等于2*h,则认为是同一行的点,前后两个点分成一组;如果所述y轴差值大于2*h并且小于word_height,则认为是干扰点丢弃掉当前点,同步在list<point_x>中丢弃掉相同的点;如果所述y轴差值大于word_height,则认为是另外一行的点,将当前点分到一个新组中;最终按照一行为一组的原则生成按行分组的交叉点集合list<list<point_y>>;
所述交叉点处理模块中,对所有交叉点按列进行排序和分组,并过滤掉无效交叉点,包括:
将list<point>按照x值进行排序得到list<point_x>;
遍历list<point_x>,计算当前点与前一个点的x轴差值,如果所述x轴差值小于等于2*w,则认为是同一列的点,前后两个点分成一组;如果所述x轴差值大于2*w并且小于word_width,则认为是干扰点丢弃掉当前点,同步在list<list<point_y>>中丢弃掉相同的点;如果所述x轴差值大于word_width,则认为是另外一列的点,将当前点分到一个新组中;最终按照一列为一组的原则生成按列分组的交叉点集合list<list<point_x>>。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010882990.1A CN112036294B (zh) | 2020-08-28 | 2020-08-28 | 一种纸质表格结构自动识别的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010882990.1A CN112036294B (zh) | 2020-08-28 | 2020-08-28 | 一种纸质表格结构自动识别的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112036294A CN112036294A (zh) | 2020-12-04 |
CN112036294B true CN112036294B (zh) | 2023-08-25 |
Family
ID=73587606
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010882990.1A Active CN112036294B (zh) | 2020-08-28 | 2020-08-28 | 一种纸质表格结构自动识别的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112036294B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113486638A (zh) * | 2021-07-29 | 2021-10-08 | 浙江大华技术股份有限公司 | 表格的重构方法和装置、存储介质及电子装置 |
CN114972309A (zh) * | 2022-06-21 | 2022-08-30 | 昆岳互联环境技术(江苏)有限公司 | 一种基于图像的表格检测中表格线断裂连接方法 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763505A (zh) * | 2009-12-29 | 2010-06-30 | 重庆大学 | 基于投影对称性的车牌字符特征提取及分类方法 |
CN106156761A (zh) * | 2016-08-10 | 2016-11-23 | 北京交通大学 | 面向移动终端拍摄的图像表格检测与识别方法 |
CN106846339A (zh) * | 2017-02-13 | 2017-06-13 | 广州视源电子科技股份有限公司 | 一种图像检测方法和装置 |
CN109948440A (zh) * | 2019-02-13 | 2019-06-28 | 平安科技(深圳)有限公司 | 表格图像解析方法、装置、计算机设备及存储介质 |
CN110210409A (zh) * | 2019-06-04 | 2019-09-06 | 南昌市微轲联信息技术有限公司 | 表格单据中表格框线检测方法及系统 |
CN110232355A (zh) * | 2019-06-14 | 2019-09-13 | 广州瀚昇智能科技有限公司 | 一种加油站营收监控方法和系统 |
CN110363095A (zh) * | 2019-06-20 | 2019-10-22 | 华南农业大学 | 一种针对表格字体的识别方法 |
CN110502985A (zh) * | 2019-07-11 | 2019-11-26 | 新华三大数据技术有限公司 | 表格识别方法、装置及表格识别设备 |
CN110647795A (zh) * | 2019-07-30 | 2020-01-03 | 正和智能网络科技(广州)有限公司 | 一种表格识别方法 |
CN110765739A (zh) * | 2019-10-24 | 2020-02-07 | 中国人民大学 | 一种从pdf文档中抽取表格数据和篇章结构的方法 |
CN111259854A (zh) * | 2020-02-04 | 2020-06-09 | 北京爱医生智慧医疗科技有限公司 | 一种文本图像中表格的结构化信息的识别方法及装置 |
CN111353961A (zh) * | 2020-03-12 | 2020-06-30 | 上海合合信息科技发展有限公司 | 一种文档曲面校正方法及装置 |
-
2020
- 2020-08-28 CN CN202010882990.1A patent/CN112036294B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101763505A (zh) * | 2009-12-29 | 2010-06-30 | 重庆大学 | 基于投影对称性的车牌字符特征提取及分类方法 |
CN106156761A (zh) * | 2016-08-10 | 2016-11-23 | 北京交通大学 | 面向移动终端拍摄的图像表格检测与识别方法 |
CN106846339A (zh) * | 2017-02-13 | 2017-06-13 | 广州视源电子科技股份有限公司 | 一种图像检测方法和装置 |
CN109948440A (zh) * | 2019-02-13 | 2019-06-28 | 平安科技(深圳)有限公司 | 表格图像解析方法、装置、计算机设备及存储介质 |
CN110210409A (zh) * | 2019-06-04 | 2019-09-06 | 南昌市微轲联信息技术有限公司 | 表格单据中表格框线检测方法及系统 |
CN110232355A (zh) * | 2019-06-14 | 2019-09-13 | 广州瀚昇智能科技有限公司 | 一种加油站营收监控方法和系统 |
CN110363095A (zh) * | 2019-06-20 | 2019-10-22 | 华南农业大学 | 一种针对表格字体的识别方法 |
CN110502985A (zh) * | 2019-07-11 | 2019-11-26 | 新华三大数据技术有限公司 | 表格识别方法、装置及表格识别设备 |
CN110647795A (zh) * | 2019-07-30 | 2020-01-03 | 正和智能网络科技(广州)有限公司 | 一种表格识别方法 |
CN110765739A (zh) * | 2019-10-24 | 2020-02-07 | 中国人民大学 | 一种从pdf文档中抽取表格数据和篇章结构的方法 |
CN111259854A (zh) * | 2020-02-04 | 2020-06-09 | 北京爱医生智慧医疗科技有限公司 | 一种文本图像中表格的结构化信息的识别方法及装置 |
CN111353961A (zh) * | 2020-03-12 | 2020-06-30 | 上海合合信息科技发展有限公司 | 一种文档曲面校正方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN112036294A (zh) | 2020-12-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111814722B (zh) | 一种图像中的表格识别方法、装置、电子设备及存储介质 | |
CN106407883B (zh) | 一种复杂表格及其内部手写数字识别方法 | |
US5751850A (en) | Method for image segmentation and classification of image elements for documents processing | |
KR101403876B1 (ko) | 차량 번호판 인식 방법과 그 장치 | |
CN107045634B (zh) | 一种基于最大稳定极值区域与笔画宽度的文本定位方法 | |
CN110766017B (zh) | 基于深度学习的移动终端文字识别方法及系统 | |
CN111489337B (zh) | 一种自动光学检测伪缺陷去除方法及系统 | |
CN114529459B (zh) | 一种对图像边缘进行增强处理的方法和系统及介质 | |
CN110598566A (zh) | 图像处理方法、装置、终端和计算机可读存储介质 | |
CN112036294B (zh) | 一种纸质表格结构自动识别的方法及装置 | |
CN112183038A (zh) | 一种表格识别套打方法、计算机设备及计算机可读存储介质 | |
CN113705673B (zh) | 一种文字检测方法、装置、设备及存储介质 | |
CN111737478B (zh) | 文本检测方法、电子设备及计算机可读介质 | |
CN110738030A (zh) | 表格重建方法、装置、电子设备及存储介质 | |
CN112861736B (zh) | 基于图像处理的文献表格内容识别与信息提取方法 | |
CN110619326A (zh) | 一种基于扫描的英语试卷作文检测识别系统及方法 | |
CN111626145A (zh) | 一种简捷有效的残缺表格识别及跨页拼接方法 | |
Shafait et al. | A simple and effective approach for border noise removal from document images | |
JP2001043313A (ja) | 文字切出し方法 | |
CN115457559B (zh) | 一种将文本及证照类图片智能摆正的方法、装置和设备 | |
CN113837119A (zh) | 一种基于灰度图像识别易混淆字符的方法及设备 | |
CN111768384B (zh) | 基于三维扫描成像的细胞计数方法及系统 | |
JP4492258B2 (ja) | 文字・図形の認識方法および検査方法 | |
CN114529922A (zh) | 一种无线框表格图像表格结构识别方法 | |
JP2871590B2 (ja) | 画像抽出方式 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |