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中atexit模块的基本使用示例
Jul 08 Python
基于Python对象引用、可变性和垃圾回收详解
Aug 21 Python
利用python求解物理学中的双弹簧质能系统详解
Sep 29 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
一道python走迷宫算法题
Jan 22 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
Django之全局使用request.user.username的实例详解
May 14 Python
解决pip install psycopg2出错问题
Jul 09 Python
提高python代码运行效率的一些建议
Sep 29 Python
Anaconda详细安装步骤图文教程
Nov 12 Python
如何理解及使用Python闭包
Jun 01 Python
Python字符串的转义字符
Apr 07 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 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
javascript中的继承实例代码
2011/04/27 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
jQuery封装的屏幕居中提示信息代码
2016/06/08 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解vue开发中调用微信jssdk的问题
2019/04/16 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
Django中template for如何使用方法
2021/01/31 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
德国香水、化妆品和护理产品网上商店:Parfumdreams
2018/09/26 全球购物
数据保密承诺书
2014/06/03 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
个人委托书如何写
2014/09/25 职场文书
校车安全管理责任书
2015/05/11 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers