雷寰宇
(桂林电子科技大学信息科技学院,广西 桂林 541004)
传统的企业、事业单位收集数据、保存数据一般采用纸质文档表格进行。纸质文档表格虽然能够比较方便地进行数据的收集工作,但是纸质文档表格在处理数据方面,需要将纸质表格数据先通过手工录入电脑中,形成电子表格再进行处理。其过程极其烦琐,需要花费大量的人力物力进行录入操作,并且录入错误率和速度都容易受人为因素影响。不仅如此,纸质文档表格在后续的存档和查阅工作方面都存在较大的难题。为了减轻人工的负担,提高纸质文档表格的处理速度,本文研究了一种基于图像的表格识别应用,通过本应用,可以将固定版面的纸质文档表格图像进行灰度化处理,二值化处理等,使计算机更容易处理图像,再通过图像矫正,横竖线识别和轮廓提取等技术得到表格框架,然后对表格框架进行单元格分割,最后利用光学符号识别技术识别单元格中的英文,数字和中文。本应用的研究,将极大地节约人力物力,提高处理纸质表格的工作速度。
通过手机等移动设备采集的图像容易受拍照环境的影响,容易产生图像过曝,失真等情况。而在图像分析中,图像质量的好坏将直接影响识别应用效果的精度和速度,所以在图像处理前,需要对图像进行预处理,以便消除图像中的无关信息,恢复有用的信息,增强有关信息的可检测性,最大限度简化图像数据。
在灰度图中,RGB色彩分量全部相等。现在大部分的彩色图像包含三种颜色(红色、绿色和蓝色)通道,可以将灰度化看作是将三维通道信息转换为一维灰度数据的过程[1]。因此,为了提高处理速度,需要减少所需处理的数据量。本应用使用Opencv中的cvtColor()函数对图像进行颜色空间转化处理,将彩色图像转化成只有灰度颜色通道且灰度范围在0~255之间的灰度图,大大减少了图像中的无用信息,如图1所示。
图1 灰度化图像
二值化是选取适当的阈值Tn与每一个像素点的灰度值进行比较,将所有大于或等于阈值的像素点的灰度值设置为255,所有小于阈值的像素点的灰度值设置为0,从而将灰度图像中每个像素点的灰度值设为0或255,使整副图像呈现出明显的黑白效果[2]。为了减少不必要的图像信息,保留有用的图像轮廓信息,本应用使用Opencv中的adaptiveThreshold()自适应阈值化函数实现对图像的二值化处理,通过像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。
由于拍摄的图像会很容易受到许多环境因素的影响,容易出现图像失真,较多噪点等问题,为了消除图像中的噪点,本应用使用Opencv中的GaussianBlur()函数对图像进行高斯模糊处理。
由于图像处理后期可能需要不含内容的表格框架图像,本应用使用Opencv中getStructuringElement()函数,得到指定形状和尺寸的结构元素,并通过腐蚀和膨胀操作将横竖线识别出来,其次再将识别出来的横竖线结合起来,形成表格框线图,如图2所示。
图2 表格框线提取图像
通过手机采集拍摄的图像往往存在表格图像倾斜问题,如图3所示。为了解决此问题,本应用通过图像边缘检测,图像轮廓检测,寻找最大轮廓和轮廓多边形拟合等操作获取表格四个顶点坐标,并通过透视变换操作将倾斜的图像矫正,得如图4所示结果。
图3 变换前的图像
图4 透视变换后的图像
为了后一步的透视变换矫正图像操作,必须获得倾斜后的图像中表格的四个顶点坐标。
2.1.1 获得预处理图像
为了去除无用信息,保存需要的图像信息,本应用通过对获取到的图像使用高斯模糊操作,灰度化,二值化和表格横竖线识别操作得到只含有表格框线的二值化图像。
2.1.2 获取表格轮廓数据
为了提取出图像中的表格,本应用在已经预处理好的图像上首先使用opencv中的Canny()函数进行边缘检测操作,通过表格框线与其两侧像素点数值相差较大,变化较快的特性,将表格框线提取出来。再利用已经提取出来的表格框线进行图像轮廓检测操作。由于表格存在多个单元格,每个单元格都可以被检测出轮廓,为了消除表格内存在一个轮廓包含多个轮廓的问题,本算法将轮廓检索模式设置cv2.RETR_EXTERNAL只检测最外层轮廓,轮廓逼近方法为cv2.CHAIN_APPROX_SIMPLE压缩水平方向、垂直方向和对角线方向的元素,保留该方向的终点坐标。
2.1.3 获取最外层表格轮廓的四个顶点
预处理图像进行轮廓提取处理后产生了图像的轮廓数据,将轮廓数据存储在一个数据列表中,使用轮廓所构成的面积大小作为排序依据,对轮廓数据列表进行从大到小排序,其次对列表中每个轮廓数据进行遍历,对每一个轮廓数据进行计算轮廓周长,然后利用计算出的轮廓边长作为参数,进行轮廓多边形拟合处理,如果拟合处理的结果为四个顶点的,表示找到该表格的最大外边框,并同时得到最大外边框的四顶点坐标。
对于发生了透视畸变的图像,透视变换解决了一般仿射变换不能改变图像内部点相对位置的缺陷[3]。本应用将源图像的四顶点坐标与目标图像的四顶点坐标统一按照左上,右上,左下,右下的顺序排序,使用Opencv中的getPerspectiveTransform()函数得到由源图像中矩形到目标图像矩形的变换矩阵。然后使用Opencv中的warpPerspective()函数来得到变换好的正视图。
在识别出横竖线后,分别将识别出来横线图和竖线图结合形成交点图,得到了每个横竖线的交点坐标,将其保存到两个数据列表中。其次在这两个数据列表中进行排序,删除掉相邻两个像素点的像素值差值小于该表格最小单元格长度的后一个像素点。最后嵌套循环两个数据列表对表格进行图像分割剪裁,取出单元格。
本应用利用PaddlePaddle生态下的预训练模型chinese_ocr_db_crnn_mobile(版本为1.1.1),使用预测API进行单元格图片文字识别。其基于chinese_text_detection_db_mobile检测得到文本框,识别文本框中的中文文字,之后对检测文本框进行角度分类。最终识别文字算法采用CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络。
本次实验采用的实验平台为Python3.7+Pycharm2020.1.3+opencv-python4.1.2.30。图5为一张表格图像倾斜的测试样图。
图5 测试原图
通过对测试样图进行图片矫正和表格框线提取,单元格分割操作并保存每张分割后的单元格图像后,得到图6的结果。通过本次实验可以看出,单元格内容识别率并不是很高。
图6 csv结果图
本文提出了一种基于图像的表格提取应用,通过对源图像进行图像预处理,图像矫正等处理,消除图像因环境和拍摄产生的干扰,再通过横竖线识别,提取出表格框线,并通过表格框线的交点坐标进行表格图像的单元格分割,再经过光学符号识别得到单元格中的内容并写入csv文件。