github上的python图片转excel,pytesseract安装相关问题

问题1:明明都pip install pytesseract,但是就是安装不上

pytesseract 未安装

链接: https://pan.baidu.com/s/1I4HzCgO4mITWTcZFkdil6g?pwd=afes 提取码: afes

安装后一路next,然后配置环境变量

C:\Program Files\Tesseract-OCR

在这里插入图片描述

新建一个系统变量
在这里插入图片描述

问题2:程序如果报错信息:

 Error opening data file D:\\Tesseract-OCR/tessdata/chi_sim.traineddata

通过如下路径下载模型:https://github.com/tesseract-ocr/tessdata/blob/main/chi_sim.traineddata

存储到tessdata目录下,再次运行,程序成功执行。

python图片转excel

在这里插入图片描述
在这里插入图片描述
我的运行效果不是太好,好像说要训练什么的,我在代码中加了一行避免报错

    if len(item) >= 6:
脚本思路大致是:

使用OpenCV (cv2)读取图像文件。
将图像转换为灰度图,并应用自适应阈值处理,生成二值图像。
使用形态学运算识别表格的水平和垂直线。
检测线的交点,定位表格的单元格。
使用Tesseract OCR (pytesseract)从每个单元格提取文本。
清理提取的文本,去除特殊字符。
将提取的数据写入CSV文件。

import os

import cv2
import numpy as np
import pytesseract
from PIL import Image
import csv
import re
import json


def parse_pic_to_excel_data(src):
    raw = cv2.imread(src, 1)
    # 灰度图片
    gray = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)
    # 二值化
    binary = cv2.adaptiveThreshold(~gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 35, -5)
    cv2.imshow("binary_picture", binary)  # 展示图片
    rows, cols = binary.shape
    scale = 40
    # 自适应获取核值 识别横线
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (cols // scale, 1))
    eroded = cv2.erode(binary, kernel, iterations=1)

    dilated_col = cv2.dilate(eroded, kernel, iterations=1)
    cv2.imshow("excel_horizontal_line", dilated_col)
    # cv2.waitKey(0)
    # 识别竖线
    scale = 20
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, rows // scale))
    eroded = cv2.erode(binary, kernel, iterations=1)
    dilated_row = cv2.dilate(eroded, kernel, iterations=1)
    cv2.imshow("excel_vertical_line", dilated_row)
    # cv2.waitKey(0)
    # 标识交点
    bitwise_and = cv2.bitwise_and(dilated_col, dilated_row)
    cv2.imshow("excel_bitwise_and", bitwise_and)
    # cv2.waitKey(0)
    # 标识表格
    merge = cv2.add(dilated_col, dilated_row)
    cv2.imshow("entire_excel_contour", merge)
    # cv2.waitKey(0)
    # 两张图片进行减法运算,去掉表格框线
    merge2 = cv2.subtract(binary, merge)
    cv2.imshow("binary_sub_excel_rect", merge2)

    new_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
    erode_image = cv2.morphologyEx(merge2, cv2.MORPH_OPEN, new_kernel)
    cv2.imshow('erode_image2', erode_image)
    merge3 = cv2.add(erode_image, bitwise_and)
    cv2.imshow('merge3', merge3)
    # cv2.waitKey(0)
    # 识别黑白图中的白色交叉点,将横纵坐标取出
    ys, xs = np.where(bitwise_and > 0)
    # 纵坐标
    y_point_arr = []
    # 横坐标
    x_point_arr = []
    # 通过排序,获取跳变的x和y的值,说明是交点,否则交点会有好多像素值值相近,我只取相近值的最后一点
    # 这个10的跳变不是固定的,根据不同的图片会有微调,基本上为单元格表格的高度(y坐标跳变)和长度(x坐标跳变)
    i = 0
    sort_x_point = np.sort(xs)
    for i in range(len(sort_x_point) - 1):
        if sort_x_point[i + 1] - sort_x_point[i] > 10:
            x_point_arr.append(sort_x_point[i])
        i = i + 1
    x_point_arr.append(sort_x_point[i])  # 要将最后一个点加入

    i = 0
    sort_y_point = np.sort(ys)
    # print(np.sort(ys))
    for i in range(len(sort_y_point) - 1):
        if (sort_y_point[i + 1] - sort_y_point[i] > 10):
            y_point_arr.append(sort_y_point[i])
        i = i + 1
    # 要将最后一个点加入
    y_point_arr.append(sort_y_point[i])
    print('y_point_arr', y_point_arr)
    print('x_point_arr', x_point_arr)
    # 循环y坐标,x坐标分割表格
    data = [[] for i in range(len(y_point_arr))]
    for i in range(len(y_point_arr) - 1):
        for j in range(len(x_point_arr) - 1):
            # 在分割时,第一个参数为y坐标,第二个参数为x坐标
            cell = raw[y_point_arr[i]:y_point_arr[i + 1], x_point_arr[j]:x_point_arr[j + 1]]
            cv2.imshow("sub_pic" + str(i) + str(j), cell)

            # 读取文字,此为默认英文
            # pytesseract.pytesseract.tesseract_cmd = 'E:/Tesseract-OCR/tesseract.exe'
            text1 = pytesseract.image_to_string(cell, lang="chi_sim")

            # 去除特殊字符
            text1 = re.findall(r'[^\*"/:?\\|<>″′‖ 〈\n]', text1, re.S)
            text1 = "".join(text1)
            print('单元格图片信息:' + text1)
            data[i].append(text1)
            j = j + 1
        i = i + 1
    # cv2.waitKey(0)
    return data


def write_csv(path, data):
    with open(path, "w", newline='') as csv_file:
        writer = csv.writer(csv_file, dialect='excel')
        for item in data:
            # Check if the item list has at least 6 elements before accessing them
            if len(item) >= 6:
                writer.writerow([item[0], item[1], item[2], item[3], item[4], item[5]])



if __name__ == '__main__':
    file = "classTable.png"
    # 解析数据
    data = parse_pic_to_excel_data(file)
    # 写入excel
    write_csv(file.replace(".png", ".csv"), data)

下面是原作者写的博客

https://blog.csdn.net/sc9018181134/article/details/104577247

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/315339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

修改vscode内置Vue VSCode Snippets(代码片段)

打开插件文件夹 文件夹名是 "作者名.vscode-插件名-版本号"组成的. C:\Users\Administrator\.vscode\extensions\sdras.vue-vscode-snippets-3.1.1\snippets 打开vue.json "prefix": "vbase" 就是代码块的关键词,输入vbase就会提示代码块 …

9个自媒体音频创作平台(附链接通道)

​划到最后“阅读原文” ——进入官网 Hi&#xff0c;我是胡猛夫&#xff0c;每天分享实用运营工具&#xff01; 更多资源&#xff0c;更多内容&#xff0c;欢迎交流&#xff01;公 号 | 微视角文化 》》精彩推荐 >>微视角文化知识库&#xff1a;移动的自媒体运营百科全…

【Linux】宝塔端口不通

1.问题描述&#xff1a;端口不通 以端口16588为例&#xff1a; 服务器16588端口是关闭的&#xff0c;防火墙规则是放通的&#xff0c;是由于服务器内的对应程序没有监听到 对应 的公网上 图1&#xff1a;端口检测 图2&#xff1a; 端口已放行 此时访问仍然不通&#xff0c;但…

windows搭建银河麒麟v10虚拟机

需要用到&#xff1a; 已将安装包放置云盘 自取 VMware Workstation Pro16 https://cloud.189.cn/t/vYZNjqbQ7zUr (访问码:a2pd) 银河麒麟v10镜像 https://cloud.189.cn/t/j6ZNfmnYfYRr (访问码:1icf) 也可以去官网下载&#xff1a;https://www.kylinos.cn 1.安装VM 无…

Jenkins使用随笔

1、如果要部署的springboot程序和jenkins在同一台linux上&#xff0c;需要增加一条 export BUILD_IDtomcat_mobile_build_id 如下图&#xff1a; 原因是&#xff1a;jenkins在执行sh脚本的时候&#xff0c;如果脚本中有启动后台进程的情况&#xff0c;例如tomcat的关闭和启动…

Oracle DBCA工具图形化方式检测不到ASM磁盘组(解决各种报错)

本例环境&#xff1a; 操作系统OEL 6.5数据库版本:11.2.0.4 问题&#xff1a;DBCA建库的时候&#xff0c;检测不到ASM磁盘组 因素一&#xff1a; 可能是在授权的时候执行了 chown –R 775 /u01/app等修改权限。 分析&#xff1a;数据库无法连接ASM&#xff0c;这应该是权限…

电子学会C/C++编程等级考试2020年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:完美立方 形如 a^3= b^3 + c^3 + d^3的等式被称为完美立方等式。例如 12^3= 6^3 + 8^3 + 10^3 。 编写一个程序,对任给的正整数 N (N≤100),寻找所有的四元组 (a, b, c, d),使得 a^3= b^3 + c^3 + d^3 ,其中 a,b,c,d均大于 11, …

Chrome DevTools 常用面板攻略

文章目录 前言一、概述1.1 简介1.2 DevTools 初步了解 二、设备模式&#xff08;Device Mode&#xff09;2.1 面板概述2.2 设备切换 三、元素面板&#xff08;Elements&#xff09;3.1 面板概述3.2 编辑样式3.2.1 添加、启用和停用 CSS 类3.2.2 添加或移除动态样式3.2.3 快速向…

UE5 通过接口实现角色描边效果

接口不能够被实例化&#xff0c;不能够在内部书写函数的逻辑和设置属性&#xff0c;只能够被继承使用。它能够让不同的类实现有相同的函数&#xff0c;继承接口的类必须实现接口的函数。 并且&#xff0c;我们可以在不同的类里面的函数实现也不同&#xff0c;比如A类描边是红色…

洗护工厂上门取送小程序具备哪些优势

上门洗衣洗鞋小程序&#xff0c;让洗衣洗鞋更简单&#xff01; 在繁忙的生活中&#xff0c;我们常常因为时间紧张而无法清洗鞋子或衣物。这时&#xff0c;一个方便快捷的上门洗衣洗鞋小程序就能够派上大用场。 这种小程序利用现代科技&#xff0c;将洗衣洗鞋服务与移动互联网相…

C# 接口(Interface)和抽象类(Abstract Class)区别和详细使用案例

文章目录 区别&#xff1a;1. **定义**&#xff1a;2. **继承与实现**&#xff1a;3. **成员**&#xff1a;4. **目的**&#xff1a; 使用示例&#xff1a;- **接口使用场景**&#xff1a;- **抽象类使用场景**&#xff1a; 在C#中&#xff0c;接口&#xff08;Interface&#…

php通用后台开发框架源码

php通用后台开发框架源码 基于ThinkPHPBootstrap的快速后台开发框架。 基于Auth验证的权限管理系统&#xff0c;支持无限级父子级权限继承&#xff0c;父级的管理员可任意 增删改子级管理员及权限设置&#xff0c;支持单管理员多角色&#xff0c;支持管理子级数据或个人数据。 …

EL表达式(上)

EL表达式 1. EL表达式是干什么的&#xff1f; - Expression Language&#xff08;表达式语言&#xff09; - EL表达式可以代替JSP中的java代码&#xff0c;让JSP文件中的程序看起来更加整洁美观 - JSP中夹杂着各种java代码&#xff0c;例如<% java代码%>等&#xff0c;导…

c#让三个线程按照顺序执行

现实的例子 三个线程都是while&#xff08;true&#xff09;的循环体 A线程&#xff1a;采集数据 B线程&#xff1a;画曲线 C线程&#xff1a;存数据库 AutoResetEvent类 AutoResetEvent 是一个线程同步的类&#xff0c;它提供了一种机制&#xff0c;允许一个或多个线程等待直…

Android 12.0 通知--PendingIntent源码分析

结论: PendingIntent 是延迟触发的一种 Intent , 通过上图的过程看,PendingIntent 的执行,是一种跨进程通信.首先创建PendingIntent对象时,就把该对象定义到 ActivityManagerService, 到执行 PengdingIntent 动作时, 也是在 ActivityManagerService 找到 目标PengdingIntent, 从…

科研绘图(三)百分比堆叠线条图

百分比堆叠线条图是一种数据可视化工具&#xff0c;它结合了堆叠面积图和线条图的特点。在这种图表中&#xff0c;时间序列数据被分成几个部分&#xff0c;每个部分代表一个类别&#xff0c;所有类别的值加起来总和为100%。这种图的每个点的堆叠区域代表不同类别在特定时间点的…

TypeScript学习笔记、鸿蒙开发学习笔记

变量定义方式 # 变量声明 let msg: string douzi console.log(msg) let num: number 20 console.log(num) let end: boolean true console.log("end" end) let a: any 10 a douzi console.log(a) let p {name:"douzi",age:20} console.log(p.name)…

神经网络|张量tensor(待完善)

文章目录 tensor/张量什么是tensor&#xff1f;如何用代码实现tensortensor在神经网络中的应用 其他 tensor/张量 什么是tensor&#xff1f; 张量是用来探究一个点在各个切面&#xff08;一共三个切面&#xff09;和各个方向&#xff08;x&#xff0c;y&#xff0c;z三个方向&…

AI语音机器人的发展

第一代AI语音机器人具体投入研发的开始时间不太清楚&#xff0c;只记得2017年的下半年就已经开始接触到成型的AI语音机器人&#xff0c;并且正式商用。语音识别效果还不多&#xff0c;大多都是接入的科大讯飞或者百度的ASR。 2018年算是AI语音机器人的“青春期”吧&#xff0c;…

LVS 负载均衡群集

本章展示&#xff1a; 了解群集的结构与工作模式 了解 LVS 负载均衡群集原理 学会配置 NFS 共享服务 学会构建 LVS-NAT 负载均衡群集 1.1 LVS 群集应用基础 群集的称呼来自于英文单词“Cluster”&#xff0c;表示一群、一串的意思&#xff0c;用在服务器领域则表 示大量服务…