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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
Python中字典创建、遍历、添加等实用操作技巧合集
Jun 02 Python
python写日志封装类实例
Jun 28 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python多继承顺序实例分析
May 26 Python
一篇文章搞定Python操作文件与目录
Aug 13 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
keras打印loss对权重的导数方式
Jun 10 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 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的变量类型和作用域详解
2014/03/12 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
2014/05/04 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
CodeIgniter删除和设置Cookie的方法
2015/04/07 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
Laravel框架实现超简单的分页效果示例
2019/02/08 PHP
自动更新作用
2006/10/08 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
NodeJs基本语法和类型
2015/02/13 NodeJs
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
selenium+python 对输入框的输入处理方法
2018/10/11 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
简单的Python调度器Schedule详解
2019/08/30 Python
python类中super() 的使用解析
2019/12/19 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
人力资源专业推荐信
2013/11/29 职场文书
致跳高运动员广播稿
2014/01/13 职场文书
优秀求职信
2014/05/29 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
2015年外贸业务员工作总结范文
2015/05/23 职场文书
如何写好竞聘报告
2019/04/03 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
React四级菜单的实现
2022/04/08 Javascript