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 EOL while scanning string literal问题解决方法
Sep 18 Python
python 爬取微信文章
Jan 30 Python
python中函数默认值使用注意点详解
Jun 01 Python
对python条件表达式的四种实现方法小结
Jan 30 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
Python读取yaml文件的详细教程
Jul 21 Python
如何在windows下安装配置python工具Ulipad
Oct 27 Python
举例讲解Python装饰器
Dec 24 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 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
php 显示指定路径下的图片
2009/10/29 PHP
php中unserialize返回false的解决方法
2014/09/22 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
33道php常见面试题及答案
2015/07/06 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
JavaScript实现多维数组的方法
2013/11/20 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
jquery图形密码实现方法
2015/03/11 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
jQuery内容过滤选择器用法示例
2016/09/09 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
python实现按任意键继续执行程序
2016/12/30 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
django-rest-framework 自定义swagger过程详解
2019/07/18 Python
浅谈Python 敏感词过滤的实现
2019/08/15 Python
python区分不同数据类型的方法
2019/10/14 Python
Django choices下拉列表绑定实例
2020/03/13 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
美国温暖商店:The Warming Store
2018/12/15 全球购物
《大禹治水》教学反思
2014/04/27 职场文书
安全生产标语大全
2014/10/06 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
人事局接收函
2015/01/30 职场文书
成本会计岗位职责
2015/02/03 职场文书
质检员岗位职责
2015/02/03 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python