百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

图片表格识别、提取和保存: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 pytesseract

3 第二步:图片处理

# 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 -v

3、安装pytesseract:

sudo pip3.8 install pytesseract  # 本机是python3.8

4、查看语言包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时代应用就很多,主要存文本信息,即为文字信息,现在的操作系统大多使用记事本等程序保存,大多数软件可以查看...

u盘被写保护怎么消除(u盘被写保护了咋办)
  • u盘被写保护怎么消除(u盘被写保护了咋办)
  • u盘被写保护怎么消除(u盘被写保护了咋办)
  • u盘被写保护怎么消除(u盘被写保护了咋办)
  • u盘被写保护怎么消除(u盘被写保护了咋办)
小米平板1(小米平板1刷安卓10稳定版)

小米平板1有开发版。具体来说,小米平板1最初发布时,已经提供了一套完整的ROM(即”MIUI“系统)供用户使用,这套系统包含了越来越多的功能,以满足用户的需求。同时,小米也会发布一些针对开发人员的版本...

取消回复欢迎 发表评论: