图片表格识别、提取和保存:python-opencv-pytesseract-csv
off999 2024-12-01 02:17 27 浏览 0 评论
△ 一、先看看效果:
△ 二、点评:
1 这是一个完整版的教程,从图片处理、文字识别、数据保存和相关软件安装,比较完整,适合练手、学习。
2 文字中“男女”识别不出来,可能与我的调试没有到位,或者原图表格中的文字是粗体有关。
3 虽然有小bug,但是讲解清楚,注释详细,文章较长,适合收藏,慢慢学习。
△ 三、内容:
1 代码分步讲解,图文并茂。
2 完整代码(精简版)。
3 pytesseract软件安装,因为这个软件安装比较特殊,有时候可能会有一些麻烦,故我特别放在此处交代一下。
△ 四、代码分步讲解:
1 原图:abc.png
2 第一步:导入模块
import re
import cv2
import numpy as np
import pytesseract3 第二步:图片处理
# 2-1 读取识别图片的表格原图
src='/home/xgj/Desktop/png-table-word/120/img/abc.png'
raw = cv2.imread(src, 1)# 2-2 初步处理
# 灰度图片
gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)
# 二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
#cv2.imshow("1", binary) #展示图片
#cv2.waitKey(0)横线识别,很重要,scale = 18需要自己调节。
rows,cols=binary.shape
# 需要自己调节-1
scale = 18 # 越大越容易识别文字横线,引起误差,22误差就大。
#识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(cols//scale,1))
eroded = cv2.erode(binary,kernel,iterations = 1)
#cv2.imshow("2",eroded)
dilatedcol = cv2.dilate(eroded,kernel,iterations = 10)
#cv2.imshow("3",dilatedcol)
#cv2.waitKey(0)竖线识别,也是一样的。
# 2-4 识别竖线
# 需要自己调节-2
scale = 10 # 调成10,如果20太敏感了
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,rows//scale))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedrow = cv2.dilate(eroded,kernel,iterations = 10)
#cv2.imshow("4",dilatedrow)
#cv2.waitKey(0)交点显示,很重要,容易遗漏。
# 2-5 标识交点,关键处,后面需要提取,用来截取小单元格
bitwiseAnd = cv2.bitwise_and(dilatedcol,dilatedrow)
cv2.imshow("5",bitwiseAnd)
cv2.waitKey(0)# 2-6 标识表格
merge = cv2.add(dilatedcol,dilatedrow)
cv2.imshow("6",merge)
cv2.waitKey(0)
# 查看效果,用于提取后的文字识别,很重要
# 2-7 两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary,merge)
cv2.imshow("7",merge2)
cv2.waitKey(0)第三步:获取左上角的交点,并截取每一个小单元格
# 3-1 识别黑白图中的白色交叉点,将横纵坐标取出
ys,xs = np.where(bitwiseAnd>0)
mylisty=[] #纵坐标
mylistx=[] #横坐标
#通过排序,获取跳变的x和y的值,说明是交点
i = 0
myxs=np.sort(xs)
#print(myxs)
for i in range(len(myxs)-1):
# 需要自己调节-3
if(myxs[i+1]-myxs[i]>5): # 自定义:5
mylistx.append(myxs[i])
i=i+1
mylistx.append(myxs[i])
i = 0
myys=np.sort(ys)
#print(myys)
for i in range(len(myys)-1):
# 需要自己调节-3
if(myys[i+1]-myys[i]>5): #5
mylisty.append(myys[i])
i=i+1
mylisty.append(myys[i])
#print(mylisty)
#print('mylisty',mylisty)
#print('mylistx',mylistx)
# 3-2 截取小单元格
# 定义一个空格数据列表
data = [[] for i in range(len(mylisty)-1)]
#print(data)
#循环y坐标,x坐标分割表格
for i in range(len(mylisty)-1):
for j in range(len(mylistx)-1):
#在分割时,第一个参数为y坐标,第二个参数为x坐标
ROI = merge2[mylisty[i]:mylisty[i+1],mylistx[j]:mylistx[j+1]]
#ROI = raw[mylisty[i]:mylisty[i+1],mylistx[j]:mylistx[j+1]] # 原图识别率不高
cv2.imshow("sub_pic" + str(i) + str(j), ROI)
#cv2.waitKey(0)
# 识别
#text1 = pytesseract.image_to_string(ROI) #读取文字,此为默认英文
text1 = pytesseract.image_to_string(ROI, lang='chi_sim+eng') #读取文字,此为默认英文
# 去除特殊字符
text1 = re.findall(r'[^\*"/:?\\|<>″′‖〈\n]', text1, re.S)
text1 = "".join(text1)
print('单元格图?信息:' + text1)
data[i].append(text1)
j=j+1
i=i+1
# 查看识别效果
print(data)
#[['姓名', '性别', '编号'], ['张三', '', 'N01'], ['李四', '', 'N02'], ['小明', '', 'No3']]
cv2.waitKey(0)第四步:存入文件中
# 第四步:存入csv中
import csv
path='/home/xgj/Desktop/png-table-word/120/data.csv'
with open(path, "w", newline='') as csv_file:
writer = csv.writer(csv_file, dialect='excel')
for index, item in enumerate(data):
writer.writerows([[item[0], item[1], item[2]]]) # 有三列,可以自己根据原表格定义△ 五、完整代码:精简版
# -*- coding: utf-8 -*-
# 第一步:导入模块
import re
import cv2
import csv
import numpy as np
import pytesseract
# 第二步:图片处理
# 2-1 读取识别图片的表格原图
src='/home/xgj/Desktop/png-table-word/120/img/abc.png'
raw = cv2.imread(src, 1)
# 2-2 初步处理
# 灰度图片
gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)
# 二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
# 2-3 识别横线
rows,cols=binary.shape
scale = 18 # 越大越容易识别文字横线,引起误差,22误差就大。
#识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(cols//scale,1))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedcol = cv2.dilate(eroded,kernel,iterations = 10)
# 2-4 识别竖线
scale = 10 # 调成10,如果20太敏感了
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,rows//scale))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedrow = cv2.dilate(eroded,kernel,iterations = 10)
# 2-5 标识交点,关键处,后面需要提取,用来截取小单元格
bitwiseAnd = cv2.bitwise_and(dilatedcol,dilatedrow)
cv2.imshow("5",bitwiseAnd)
cv2.waitKey(0)
# 2-6 标识表格
merge = cv2.add(dilatedcol,dilatedrow)
cv2.imshow("6",merge)
cv2.waitKey(0)
# 查看效果,用于提取后的文字识别,很重要
# 2-7 两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary,merge)
cv2.imshow("7",merge2)
cv2.waitKey(0)
# 第三步:获取左上角的交点,并截取每一个小单元格
# 3-1 识别黑白图中的白色交叉点,将横纵坐标取出
ys,xs = np.where(bitwiseAnd>0)
mylisty=[] #纵坐标
mylistx=[] #横坐标
i = 0
myxs=np.sort(xs)
for i in range(len(myxs)-1):
if(myxs[i+1]-myxs[i]>5): # 自定义:5
mylistx.append(myxs[i])
i=i+1
mylistx.append(myxs[i])
i = 0
myys=np.sort(ys)
for i in range(len(myys)-1):
if(myys[i+1]-myys[i]>5): #5
mylisty.append(myys[i])
i=i+1
mylisty.append(myys[i])
# 3-2 截取小单元格
# 定义一个空格数据列表
data = [[] for i in range(len(mylisty)-1)]
#循环y坐标,x坐标分割表格
for i in range(len(mylisty)-1):
for j in range(len(mylistx)-1):
#在分割时,第一个参数为y坐标,第二个参数为x坐标
ROI = merge2[mylisty[i]:mylisty[i+1],mylistx[j]:mylistx[j+1]]
cv2.imshow("sub_pic" + str(i) + str(j), ROI)
# 识别
text1 = pytesseract.image_to_string(ROI, lang='chi_sim+eng') #读取文字,此为默认英文
# 去除特殊字符
text1 = re.findall(r'[^\*"/:?\\|<>″′‖〈\n]', text1, re.S)
text1 = "".join(text1)
print('单元格图?信息:' + text1)
data[i].append(text1)
j=j+1
i=i+1
cv2.waitKey(0)
# 第四步:存入csv中
# 自定义存入文件地址和文件名
path='/home/xgj/Desktop/png-table-word/120/data.csv'
# 写入
with open(path, "w", newline='') as csv_file:
writer = csv.writer(csv_file, dialect='excel')
for index, item in enumerate(data):
writer.writerows([[item[0], item[1], item[2]]]) # 有三列,可以自己根据原表格定义△ 六、pytesseract安装:
1、先安装tesseract-ocr:
sudo apt-get install tesseract-ocr # 本机是deepin-linux操作系统2、测试:
tesseract -v3、安装pytesseract:
sudo pip3.8 install pytesseract # 本机是python3.84、查看语言包tesseract:
tesseract --list-langs初始安装,查看效果如下:
tesseract --list-langs
osd
eng
equ
Note: These two data files are compatible with older versions of Tesseract.
osd is compatible with version 3.01 and up,
and equ is compatible with version 3.02 and up.
没有安装中文简体包。
5、安装中文简体包:
https://github.com/tesseract-ocr/tessdata # 下载地址下载,解压,本机是将chi_sim.traineddata复制到下面文件夹下,注意sudo
/usr/share/tesseract-ocr/tessdata
在查看。
△ 小结:
自己实测和操作过,细节也注释了。
赋诗一首,更显原创。
===========
缝隙爱好学习,
实测代码详细,
图文并茂有心,
快乐分享搭梯。
===========
相关推荐
-
- 下载设置到手机上(手机设置下载到桌面上)
-
1.打开手机的“设置”图标。2.进入设置页面,滑动手机屏幕,找到“桌面、锁屏与息屏”选项并点击。3.进入新页面,滑动手机屏幕找到“添加应用到主屏幕”选项,此时该选项右侧的按钮为关闭状态。4.点击一下“添加应用到主屏幕”选项右侧的按钮,按钮点...
-
2026-01-12 03:03 off999
- 如何连接打印机网络共享(打印机如何通过网络共享)
-
打印机设置共享打印的操作步骤一、在连接打印机的电脑上依次点击“开始“菜单-”设置“-”打印机“,打开打印机界面后右键单击“打印机”图标点击到“共享”选项界面接着点击“共享这台打印机”,最后点击“确定”...
- win10自带风扇控制软件(w10风扇管理在哪里)
-
在Windows10系统中,风扇的设置通常是由计算机硬件和BIOS控制的。但是,您也可以使用一些软件工具来调整风扇的设置。以下是一些常用的方法:1.使用BIOS设置:在计算机启动时按下相应的按键(...
- 系统类小说女主文(系统文推荐女主)
-
1、《团宠郡主有系统》2、《绑定才女系统后文躺赢了》 3、《炮灰女配苟成了女主》 4、《在暴君身边卑微求生》 5、《师徒恋文里的反派非要和我HE》6、《穿成反派男主极品娘...
- 视频下载网站免费(视频下载网站免费mp3)
-
1.ITunesMovieTrailers苹果的预告片库,库中影片的画质都很不错,基本上覆盖了当前的主流电影,以美国电影居多,国内的片子比较少,如果需要从中下载,那么下载时需要配合浏览器的资源嗅探...
-
- 电脑下划线符号怎么打(电脑上那个下划线怎么打)
-
1、下划线的输入方法为英文输入法状态下,Shift+“-”输入。2、上划线需要借助特殊的输入法或是直接使用Word插入符号,这里介绍Word方法,首先打开Word,然后点击“插入”。3、在插入栏内点击“符号”,弹出的菜单中点击“其它符号”。...
-
2026-01-12 00:03 off999
- win+f是什么快捷键(快捷键win+l是那个键)
-
Win+E:打开我的电脑Win+F:搜索文件Win+D:显示桌面Win+M:最小化所有窗口Win+Pause:显示系统属性对话框Win+L:锁定您的计算机或切换用户Win+R:打开运行对话...
- 搜狗浏览器app下载(搜狗浏览器app下载安卓版)
-
试试在地址栏右边切换浏览模式,改成兼容。ACTIVX插件是IE的专利,搜狗兼容模式是调用IE,高速模式是CHROME核心。在搜狗浏览器右上角菜单-工具-选项-查看下主页设置是否是你想要的。导航类以ht...
- 手机p图修改替换数字(手机截图怎么修改数字)
-
首先打开手机屏幕,在手机界面找到【美图秀秀】软件,点击打开进入,进入美图秀秀后,选择【图片美化】,在弹出的手机相册中,选择并打开所需截图;在下方选项中找到【消除笔】,放大截图,消除需要更改的数字,消...
- 无internet访问权限怎么解决win7
-
1、按【Win】键,或点击左下角的【开始菜单】,在打开的菜单项中,选择【控制面板(control)】。2、网卡驱动状态如果出现问题,会显示感叹号,如果没有出现问题,就不会有任何提示。右键点击【网卡驱动...
- 硬盘序列号格式(硬盘序列号格式例子)
-
1、TXT格式:txt是微软在操作系统上附带的一种文本格式,是最常见的一种文件格式,早在DOS时代应用就很多,主要存文本信息,即为文字信息,现在的操作系统大多使用记事本等程序保存,大多数软件可以查看...
- 小米平板1(小米平板1刷安卓10稳定版)
-
小米平板1有开发版。具体来说,小米平板1最初发布时,已经提供了一套完整的ROM(即”MIUI“系统)供用户使用,这套系统包含了越来越多的功能,以满足用户的需求。同时,小米也会发布一些针对开发人员的版本...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
