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调度框架APScheduler使用
Mar 28 Python
Anaconda多环境多版本python配置操作方法
Sep 12 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python 检查是否为中文字符串的方法
Dec 28 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
pyqt5移动鼠标显示坐标的方法
Jun 21 Python
int在python中的含义以及用法
Jun 27 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
django实现类似触发器的功能
Nov 15 Python
Python API len函数操作过程解析
Mar 05 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 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
晶体管来复再生式二管收音机
2021/03/02 无线电
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
javascript textContent与innerText的异同分析
2010/10/22 Javascript
javascript 冒泡排序 正序和倒序实现代码
2010/12/14 Javascript
关于js datetime的那点事
2011/11/15 Javascript
jquery ajax提交整个表单元素的快捷办法
2013/03/27 Javascript
JS的千分位算法实现思路
2013/07/31 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
nodejs微信开发之自动回复的实现
2019/03/17 NodeJs
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
vue 移动端记录页面浏览位置的方法
2020/03/11 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
Python open读写文件实现脚本
2008/09/06 Python
Python实现Logger打印功能的方法详解
2017/09/01 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
python3 读写文件换行符的方法
2018/04/09 Python
Python设置在shell脚本中自动补全功能的方法
2018/06/25 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
python中的django是做什么的
2020/07/31 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
详解java调用python的几种用法(看这篇就够了)
2020/12/10 Python
捷科时代的软件测试笔试题
2015/11/09 面试题
业务助理岗位职责
2013/11/18 职场文书
工商管理实习生自我鉴定范文
2013/12/18 职场文书
物理研修随笔感言
2014/02/14 职场文书
勤俭节约倡议书
2014/04/14 职场文书
2016年三八红旗手先进事迹材料
2016/02/26 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript