最近学习了一下opencv,做了个简单的小东西,就是识别图片中的表格,识别完成后再把数据写入到csv中保存起来。

环境准备:

下面先说下我们应该要准备下啥环境:

1.python安装完成(笔者python3.7)

2.tesseract(google的开源cr框架)

3.pytesseract(python对tesseract的封装,调用时是通过pytesseract去调用tesseract)

4.python的一些类库,numpy,matplotlib

5.特别提一下要导入opencv的包,安装的时候名称是opencv-python,使用的时候名称是cv2,cv2不是说是opencv的版本二哦,意思是在cv的基础上做了提升和优化的意思,跟版本没关系。

这里还有一点要注意的,使用cv2报错的话,可能还要安装一下opencv-python-headless。

识别步骤:

我们先来简单说一下原理,是怎么识别表格的呢?是这样的,如果直接咱们把一张图片用tesseract去识别成中文,它会把表格的横竖线都算进去,

很多汉字都识别不出来,效果也很难看。所以我们要做的前置步骤就是识别出excel图片的一个个单元格,把每个单元格中的信息给识别出来,然后拼接

成一个csv,在最后转为excel只需要通过excel导入csv的数据就可以了。

注意事项:本人水平有限,目前还只能处理比较简单的方方正正的表格,下面的程序是可直接跑的。但是如果有一些图片的表格是拍出来斜着的,或有干扰物

比如有支笔在图片中,或有很复杂的水印,这种目前还处理不了,还在继续研究当中。有兴趣的小伙伴可以一起玩啊,加个微信一起讨论交流。

不过咱们也对这些情况有一些方案,还在处理当中:

1.如果表格是倾斜的咱们可以使用透射变换先将表格处理成正常的矩形;

2.简单的水印,可以通过灰度之后,选个合理的阈值,将图片二值化后,白黑图可以去掉水印。

这里咱们安利一个很好的python-opencv的入门教程:ex2tron/OpenCV-Python-Tutorial

好了废话说完了,开始教程:

原图:

1.读入图片灰度化:

可以理解为把彩色图片变为灰色图片

raw = cv2.imread(src, 1)
# 灰度图片
gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)

2.图片二值化:

可以理解为把图片变成只有黑白两种颜色,这样更方便处理,再说咱们处理表格也不需要颜色

binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
# 展示图片
cv2.imshow("binary_picture", binary)

二值化的图片:

3.识别出横线,竖线:

在此之后,如果图像不够清晰或者有小像素点,可以使用腐蚀,膨胀等操作让图片更清晰一点

rows, cols = binary.shape
scale = 40
# 自适应获取核值
# 识别横线:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated_col = cv2.dilate(eroded, kernel, iterations=1)
cv2.imshow("excel_horizontal_line", dilated_col)# 识别竖线:
scale = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows // scale))
eroded = cv2.erode(binary, kernel, iterations=1)
dilated_row = cv2.dilate(eroded, kernel, iterations=1)
cv2.imshow("excel_vertical_line:", dilated_row)

横线竖线的图:

4.计算出横竖线的焦点,就得到了每个单元格的坐标

# 将识别出来的横竖线合起来
bitwise_and = cv2.bitwise_and(dilated_col, dilated_row)
cv2.imshow("excel_bitwise_and", bitwise_and)# 标识表格轮廓
merge = cv2.add(dilated_col, dilated_row)
cv2.imshow("entire_excel_contour:", merge)# 两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary, merge)
cv2.imshow("binary_sub_excel_rect", merge2)new_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
erode_image = cv2.morphologyEx(merge2, cv2.MORPH_OPEN, new_kernel)
cv2.imshow('erode_image2', erode_image)
merge3 = cv2.add(erode_image, bitwise_and)
cv2.imshow('merge3', merge3)# 将焦点标识取出来
ys, xs = np.where(bitwise_and > 0)

焦点图:

5.将坐标筛选下,临近的几个算一个:

这里说一下图片的数组中是(y,x)这样的,y在前面

# 横纵坐标数组

6.通过坐标把每个单元格图像取出来,然后使用pytesseract识别文字 :去除特殊符号后,data就是处理好的值

# 循环y坐标,x坐标分割表格
data = [[] for i in range(len(y_point_arr))]
for i in range(len(y_point_arr) - 1):for j in range(len(x_point_arr) - 1):# 在分割时,第一个参数为y坐标,第二个参数为x坐标cell = src[y_point_arr[i]:y_point_arr[i + 1], x_point_arr[j]:x_point_arr[j + 1]]cv2.imshow("sub_pic" + str(i) + str(j), cell)# 读取文字,此为默认英文# pytesseract.pytesseract.tesseract_cmd = 'E:/Tesseract-OCR/tesseract.exe'text1 = pytesseract.image_to_string(cell, lang="chi_sim+eng")# 去除特殊字符text1 = re.findall(r'[^*"/:?|<>″′‖ 〈n]', text1, re.S)text1 = "".join(text1)print('单元格图片信息:' + text1)data[i].append(text1)j = j + 1i = i + 1

6.最后把所有的信息写入csv

path是要写入的文件路径,data是数据

with open(path, "w", newline='') as csv_file:writer = csv.writer(file, dialect='excel')for index, item in enumerate(data):if index != 0 and index != len(data) - 1:writer.writerows([[item[0], item[1], item[2], item[3], item[4], item[5]]])

写入表格数据:

总结:

1.完成之后就大致知道了表格识别的原理,并且对opencv的api有了一定的了解和熟悉,这里放上github的地址:wxwwt/opencv-picture-to-excel,觉得还可以点点star,fork啥的哈。

2.不过这个介绍是说完了大致流程,其实过程中还有遇到很多坑,直接运行github的项目有可能跑出的结果和我不一样,

那是因为一个是要下载tesseract的中文数据集,第二是这个里面数学和几个文字竟然识别不出来,需要手动给tesseract增加

一些训练集。这个增加训练数据集应该后面会再出一篇文章。

3.弄完这个表格识别,准备在看下图片矫正和去除水印,复杂的表格识别也会使用到的。

参考资料:

1.tesseract-ocr/tesseract

2.pytesseract

3.CSDN-专业IT技术社区-登录

4.基于图像识别的表格数据提取系统 - 秋沐霖 - 博客园

c++在csv写入汉字_python-opencv表格识别转csv相关推荐

  1. python csv写入中文_python写入csv中文乱码问题,encoding='utf-8'无效还是乱码——吕江民·日常随笔...

    今天在处理python写入csv中文乱码问题,尝试各种办法,百思不得其解,网上找到的最常用的办法就是 1. encoding='utf-8':无效 with open('data4.csv', 'a' ...

  2. python读写csv确定编码格式_Python使用utf8编码读写csv文件

    我试着读一个csv文件,它的头包含外来字符,我有很多问题.在 首先,我用一个简单的csv.reader在filename = 'C:\\Users\\yuval\\Desktop\\בית ספר\\ ...

  3. html表格转换为csv,python实现将html表格转换成CSV文件的方法

    python实现将html表格转换成CSV文件的方法 发布于 2015-11-18 16:53:39 | 155 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种 ...

  4. python 删除csv第一行_python 标准库学习之 csv

    本文由作者 凭海临风 授权刊登.原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/ 文档路径 官方文档:htt ...

  5. python人脸照片分类_Python OpenCV 人脸识别(一)

    前面介绍了Numpy模块,下面再介绍一个OpenCV模块,就基于这两个库看一下当下很火的人工智能是如何实现的,我们介绍几个:人脸识别(当下非常火的).音视频操作等等.今天先介绍一下静态图片的人脸识别, ...

  6. python csv写入字典_python csv与字典操作

    # encoding: utf-8 import csv d1 = {'banana':3,'apple':4,'pear':1,'orange':2} d2 = {'banana':3,'orang ...

  7. python读取大文件csv内存溢出_Python,内存错误,csv文件太大

    我有一个python模块的问题,它不能处理导入大数据文件(文件目标.csv重量接近1 Gb) 加载此行时出现错误:targets = [(name, float(X), float(Y), float ...

  8. python读取csv最后一行_python – 尝试使用seek()获取csv文件的最后一行时的AttributeError...

    我试图从csv文件返回最后一行.我正在修改我之前写的另一个函数,它返回文本文件的最后一行.它似乎首先按预期工作,但现在当我调用该函数时它会抛出一个错误. reader.seek(0, os.SEEK_ ...

  9. python图片识别是否p过_Python+Opencv进行识别相似图片

    标签:在网上看到python做图像识别的相关文章后,真心感觉python的功能实在太强大,因此将这些文章总结一下,建立一下自己的知识体系. 当然了,图像识别这个话题作为计算机科学的一个分支,不可能就在 ...

最新文章

  1. nyoj——297(期望)
  2. An Introduction To The SQLite C/C++ Interface
  3. 【并查集】封锁阳光大学(P1330)
  4. ASP.NET中的Eval()和DataBinder.Eval()方法
  5. 2014-10-30NOIP复习题1
  6. 人月神话贯彻执行_《人月神话》读后感与读书笔记
  7. ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
  8. 路由器温度测试软件,教你增强小米路由WEB管理(一)——添加CPU温度显示
  9. 模拟信号采样与AD转换
  10. Android各版本号及其英文别名
  11. matlab怎样批量裁剪图片大小,wps 批量调整图片大小 宏
  12. SQL中模式的定义和删除
  13. 红帽linux5.4安装教程,红帽企业Linux5.4下ORACLE安装步骤(推荐).pdf
  14. 排序算法大比拼(2.1)——时间O(n log2n)篇之归并排序
  15. mysql中生成字符串对应的英文字母(拼音首字母)
  16. 中国钢丝绳行业竞争现状及需求前景预测报告(新版)2022-2027年
  17. 如何开发ABAP报表程序(具体例子)
  18. pands 画图 调整大小_胜负盘和大小盘盘赔组合中的大球模式
  19. WordPress网站如何开启Gzip压缩快速传输
  20. [游戏]求生之路新地图安装说明

热门文章

  1. 阿里800k大数据工程师讲述:什么是大数据未来大数据的就业前景?
  2. ios平台Ahorro记账APP换新机无法下载问题
  3. 解决win10 win11登陆微软提示“哎哟出错了”登陆不了问题
  4. domino mysql_IBM domino数据库操作,数据迁移
  5. matlab 图片RGB颜色提取0-255版
  6. Kafka3.2.0 + kraft集群安装部署说明
  7. 集线器、路由器、网桥(桥接器)、网关、网线、交换机、中继器(转发器)、网卡工作在哪一层
  8. 求两个字符串的最大连续公共字串
  9. 华纬科技冲刺深交所:拟募资4亿 二代接班金雷,控制65%股权
  10. vue日历排班组件_vue之手把手教你写日历组件