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 相关文章推荐
linux 下实现python多版本安装实践
Nov 18 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
回调函数的意义以及python实现实例
Jun 20 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Python 互换字典的键值对实例
Feb 12 Python
python实现月食效果实例代码
Jun 18 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
Python常用库大全及简要说明
Jan 17 Python
Django 设置多环境配置文件载入问题
Feb 25 Python
python selenium操作cookie的实现
Mar 18 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
Mar 22 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
Body是什么,该怎么喝出咖啡里的口感
2021/03/03 咖啡文化
PHP file_exists问题杂谈
2012/05/07 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
php批量删除数据库下指定前缀的表以prefix_为例
2014/08/24 PHP
phplot生成图片类用法详解
2015/01/06 PHP
jquery之empty()与remove()区别说明
2010/09/10 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
微信小程序实现上传图片功能
2018/05/28 Javascript
简述JS控制台的使用
2018/07/15 Javascript
解决vue keep-alive 数据更新的问题
2018/09/21 Javascript
JS学习笔记之闭包小案例分析
2019/05/29 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python协程的用法和例子详解
2017/09/09 Python
使用memory_profiler监测python代码运行时内存消耗方法
2018/12/03 Python
python Tkinter版学生管理系统
2019/02/20 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
作文批改评语大全
2014/04/23 职场文书
节水倡议书
2015/01/19 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
Python requests用法和django后台处理详解
2022/03/19 Python