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下载FTP上的文件夹的实现代码
Feb 10 Python
Python文件的读写和异常代码示例
Oct 31 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
python zip()函数使用方法解析
Oct 31 Python
python之array赋值技巧分享
Nov 28 Python
python如何求圆的面积
Jul 01 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
python 线程的五个状态
Sep 22 Python
MATLAB 全景图切割及盒图显示的实现步骤
May 14 Python
Python基本数据类型之字符串str
Jul 21 Python
总结三种用 Python 作为小程序后端的方式
May 02 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
中东人咖啡哲学
2021/03/03 咖啡文化
php 代码优化的42条建议 推荐
2009/09/25 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
js DOM的学习笔记
2011/12/22 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
深入学习JavaScript中的原型prototype
2015/08/13 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
python调用API实现智能回复机器人
2018/04/10 Python
200行python代码实现2048游戏
2019/07/17 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
pandas 空数据处理方法详解
2019/11/02 Python
美国最便宜的旅游网站:CheapTickets
2017/07/09 全球购物
汽车技术服务与营销专业推荐信
2013/11/29 职场文书
简历自我评价怎么写好呢?
2014/01/04 职场文书
生育关怀行动实施方案
2014/03/26 职场文书
教师考核材料
2014/05/21 职场文书
机械工程学院大学生求职信
2014/05/25 职场文书
电子商务专业应届毕业生求职信
2014/06/21 职场文书
合作协议书模板
2014/10/10 职场文书
安装工程师岗位职责
2015/02/13 职场文书
2015年乡镇环保工作总结
2015/04/22 职场文书
贷款担保书范本
2015/09/22 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS