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最基本的操作字典的方法
Apr 24 Python
python操作mysql数据库
Mar 05 Python
Python 常用的安装Module方式汇总
May 06 Python
Python实现针对中文排序的方法
May 09 Python
python实现单线程多任务非阻塞TCP服务端
Jun 13 Python
Python编写一个优美的下载器
Apr 15 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
Python3中exp()函数用法分析
Feb 19 Python
python语言元素知识点详解
May 15 Python
用python做游戏的细节详解
Jun 25 Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 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
Mysql中limit的用法方法详解与注意事项
2008/04/19 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
Python下载懒人图库JavaScript特效
2015/05/28 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
Python中bisect的用法及示例详解
2020/07/20 Python
css3 给背景设置渐变色的方法
2019/09/12 HTML / CSS
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
W Hamond官网:始于1979年的钻石专家
2020/07/20 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
Java如何读取CLOB字段
2013/10/10 面试题
班主任工作年限证明
2014/01/12 职场文书
文字自荐书范文
2014/02/10 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
商业用房租赁协议书
2014/10/13 职场文书
大学生助学金感谢信
2015/01/21 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
我们认为中短波广播场强仪的最佳组合
2022/04/05 无线电
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
Windows server 2012搭建FTP服务器
2022/04/29 Servers