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 相关文章推荐
Django中的“惰性翻译”方法的相关使用
Jul 27 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
Python将DataFrame的某一列作为index的方法
Apr 08 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
pywinauto自动化操作记事本
Aug 26 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
django日志默认打印request请求信息的方法示例
May 17 Python
python判断正负数方式
Jun 03 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python中 .npy文件的读写操作实例
Apr 14 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多层数组与对象的转换实例代码
2013/08/05 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python闭包与引用以及需要注意的陷阱
2020/09/18 Python
详解CSS3 rem(设置字体大小) 教程
2017/11/21 HTML / CSS
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
教师推荐信范文
2013/11/24 职场文书
公司财务总监岗位职责
2013/12/14 职场文书
应届生如何写自荐信
2014/01/05 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
小学音乐教学反思
2014/02/05 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
我爱我家教学反思
2014/05/01 职场文书
元旦主持词开场白
2015/05/29 职场文书
童年读书笔记
2015/06/26 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
使用Redis做预定库存缓存功能
2022/04/02 Redis
nginx 配置指令之location使用详解
2022/05/25 Servers
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang