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高手之路python处理excel文件(方法汇总)
Jan 07 Python
深入了解Python数据类型之列表
Jun 24 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
python 设置文件编码格式的实现方法
Dec 21 Python
python Opencv将图片转为字符画
Feb 19 Python
PyQt5每天必学之单行文本框
Apr 19 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
Python小白不正确的使用类变量实例
May 29 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
Python实战之实现简易的学生选课系统
May 25 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
PHP设置图片文件上传大小的具体实现方法
2013/10/11 PHP
PHP实现自动登入google play下载app report的方法
2014/09/23 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP基于socket实现客户端和服务端通讯功能
2017/07/13 PHP
基于Laravel-admin 后台的自定义页面用法详解
2019/09/30 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
php如何获取Http请求
2020/04/30 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
编辑浪子版表单验证类
2007/05/12 Javascript
js三种排序算法分享
2012/08/16 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
本地文件上传到七牛云服务器示例(七牛云存储)
2014/01/11 Python
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python基础梳理(一)(推荐)
2019/04/06 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
如何查看python关键字
2021/01/17 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
小学数学课后反思
2014/04/23 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
python使用pygame创建精灵Sprite
2021/04/06 Python
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android