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操作xml文件示例
Apr 07 Python
python 计算文件的md5值实例
Jan 13 Python
遗传算法之Python实现代码
Oct 10 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python将一组数分成每3个一组的实例
Nov 14 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
python中for循环把字符串或者字典添加到列表的方法
Jul 20 Python
Python进程间通信 multiProcessing Queue队列实现详解
Sep 23 Python
Python实现把类当做字典来访问
Dec 16 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
利用python实现平稳时间序列的建模方式
Jun 03 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
关于php fread()使用技巧
2010/01/22 PHP
laravel学习教程之存取器
2016/07/30 PHP
php自定义时间转换函数示例
2016/12/07 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
JavaScript编程中实现对象封装特性的实例讲解
2016/06/24 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
2017/02/09 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
React学习笔记之列表渲染示例详解
2017/08/22 Javascript
微信小程序实现YDUI的ScrollNav组件
2018/02/02 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
python显示天气预报
2014/03/02 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
使用python判断jpeg图片的完整性实例
2019/06/10 Python
pymysql模块的操作实例
2019/12/17 Python
python__new__内置静态方法使用解析
2020/01/07 Python
详解pytorch tensor和ndarray转换相关总结
2020/09/03 Python
关于Python错误重试方法总结
2021/01/03 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
为数据库创建索引都需要注意些什么
2012/07/17 面试题
现金会计岗位职责
2013/12/05 职场文书
课程设计心得体会
2013/12/28 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
投资申请报告
2015/05/19 职场文书
民事纠纷协议书
2016/03/23 职场文书
求职信:求职应该注意的问题
2019/04/24 职场文书
详解Python类和对象内容
2021/06/22 Python
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL