python opencv将表格图片按照表格框线分割和识别


Posted in Python onOctober 30, 2019

如下小程序为使用python+opencv将表格图片,按照表格进行分割,并识别分割后的子图片中的文字,希望对需要的小伙伴有一些些帮助。具体的实现见如下代码。

# -*- coding: utf-8 -*-
"""
Created on Tue May 28 19:23:19 2019
将图片按照表格框线交叉点分割成子图片(传入图片路径)
@author: hx
"""
 
import cv2
import numpy as np
import pytesseract
 
image = cv2.imread('C:/Users/Administrator/Desktop/7.jpg', 1)
#灰度图片
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#二值化
binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
#ret,binary = cv2.threshold(~gray, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("二值化图片:", binary) #展示图片
cv2.waitKey(0)
 
rows,cols=binary.shape
scale = 40
#识别横线
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(cols//scale,1))
eroded = cv2.erode(binary,kernel,iterations = 1)
#cv2.imshow("Eroded Image",eroded)
dilatedcol = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("表格横线展示:",dilatedcol)
cv2.waitKey(0)
 
#识别竖线
scale = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(1,rows//scale))
eroded = cv2.erode(binary,kernel,iterations = 1)
dilatedrow = cv2.dilate(eroded,kernel,iterations = 1)
cv2.imshow("表格竖线展示:",dilatedrow)
cv2.waitKey(0)
 
#标识交点
bitwiseAnd = cv2.bitwise_and(dilatedcol,dilatedrow)
cv2.imshow("表格交点展示:",bitwiseAnd)
cv2.waitKey(0)
# cv2.imwrite("my.png",bitwiseAnd) #将二值像素点生成图片保存
 
#标识表格
merge = cv2.add(dilatedcol,dilatedrow)
cv2.imshow("表格整体展示:",merge)
cv2.waitKey(0)
 
 
#两张图片进行减法运算,去掉表格框线
merge2 = cv2.subtract(binary,merge)
cv2.imshow("图片去掉表格框线展示:",merge2)
cv2.waitKey(0)
 
#识别黑白图中的白色交叉点,将横纵坐标取出
ys,xs = np.where(bitwiseAnd>0)
 
mylisty=[] #纵坐标
mylistx=[] #横坐标
 
#通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
#这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
i = 0
myxs=np.sort(xs)
for i in range(len(myxs)-1):
  if(myxs[i+1]-myxs[i]>10):
    mylistx.append(myxs[i])
  i=i+1
mylistx.append(myxs[i]) #要将最后一个点加入
 
 
i = 0
myys=np.sort(ys)
#print(np.sort(ys))
for i in range(len(myys)-1):
  if(myys[i+1]-myys[i]>10):
    mylisty.append(myys[i])
  i=i+1
mylisty.append(myys[i]) #要将最后一个点加入
 
print('mylisty',mylisty)
print('mylistx',mylistx)
 
 
#循环y坐标,x坐标分割表格
for i in range(len(mylisty)-1):
  for j in range(len(mylistx)-1):
    #在分割时,第一个参数为y坐标,第二个参数为x坐标
    ROI = image[mylisty[i]+3:mylisty[i+1]-3,mylistx[j]:mylistx[j+1]-3] #减去3的原因是由于我缩小ROI范围
    cv2.imshow("分割后子图片展示:",ROI)
    cv2.waitKey(0)
 
    #special_char_list = '`~!@#$%^&*()-_=+[]{}|\\;:‘',。《》/?ˇ'
    pytesseract.pytesseract.tesseract_cmd = 'E:/Tesseract-OCR/tesseract.exe'
    text1 = pytesseract.image_to_string(ROI) #读取文字,此为默认英文
    #text2 = ''.join([char for char in text2 if char not in special_char_list])
    print('识别分割子图片信息为:'+text1)
    j=j+1
  i=i+1

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查看多台服务器进程的脚本分享
Jun 11 Python
六个窍门助你提高Python运行效率
Jun 09 Python
Python脚本获取操作系统版本信息
Dec 17 Python
详解Python实现多进程异步事件驱动引擎
Aug 25 Python
python之线程通过信号pyqtSignal刷新ui的方法
Jan 11 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
Aug 09 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
Python能做什么
Jun 02 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
Python max函数中key的用法及原理解析
Jun 26 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 #Python
python常见字符串处理函数与用法汇总
Oct 30 #Python
pygame库实现俄罗斯方块小游戏
Oct 29 #Python
pygame实现俄罗斯方块游戏(对战篇1)
Oct 29 #Python
Numpy中对向量、矩阵的使用详解
Oct 29 #Python
pygame实现俄罗斯方块游戏(AI篇2)
Oct 29 #Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 #Python
You might like
检查url链接是否已经有参数的php代码 添加 ? 或 &
2010/02/09 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
javascript编程起步(第三课)
2007/02/27 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
利用jquery操作Radio方法小结
2014/10/20 Javascript
js选择器全面解析
2016/06/27 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
理解javascript async的用法
2017/08/22 Javascript
node跨域请求方法小结
2017/08/25 Javascript
微信小程序实现手势图案锁屏功能
2018/01/30 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
2018/10/29 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
python控制台中实现进度条功能
2015/11/10 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
Django 限制访问频率的思路详解
2019/12/24 Python
如何通过python实现全排列
2020/02/11 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
写clone()方法时,通常都有一行代码,是什么?
2012/10/31 面试题
营销与策划专业毕业生求职信
2013/11/01 职场文书
骨干教师事迹材料
2014/12/17 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
在Django中使用MQTT的方法
2021/05/10 Python
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers