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中的多重继承实例讲解
Sep 28 Python
探究Python的Tornado框架对子域名和泛域名的支持
May 02 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
python中字符串的操作方法大全
Jun 03 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
Python爬虫常用小技巧之设置代理IP
Sep 13 Python
django框架之cookie/session的使用示例(小结)
Oct 15 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
使用pyqt 实现重复打开多个相同界面
Dec 13 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 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判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
JS实现图文并茂的tab选项卡效果示例【附demo源码下载】
2016/09/21 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
pandas 对group进行聚合的例子
2019/12/27 Python
简单了解Java Netty Reactor三种线程模型
2020/04/26 Python
Python3如何使用tabulate打印数据
2020/09/25 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
教育课题研究自我鉴定范文
2013/12/28 职场文书
安全生产计划书
2014/05/04 职场文书
新书发布会策划方案
2014/06/09 职场文书
医院搬迁方案
2014/06/14 职场文书
在校实习生求职信
2014/06/18 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
退休欢送会主持词
2015/07/01 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
基于Python实现西西成语接龙小助手
2022/08/05 Golang