一键识别图片中的表格数据,并转为Excel

背景

有时候我们需要将图片中的表格数据提取出来进行再次编辑,但一个字一个字的敲出来是件非常麻烦的事。

有没有更好的办法,一键提取图片中的表格数据,并转成Excel。

这时候,就需要用到OCR 技术了。

OCR

传统OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。

随着深度学习在OCR领域的成功应用,检测图像中的文字区域以及识别文字内容已经变得越来越成熟。

图片表格转Excel,先上效果图

待转换图片:

一键识别图片中的表格数据,并转为Excel_第1张图片

转换后的Excel:

一键识别图片中的表格数据,并转为Excel_第2张图片

TableOCR

本文使用腾讯的“文字识别OCR”,每月免费1千次,可以满足大部分普通用户的需求。

使用准备:

  1. 申请腾讯云账户secretId,secretKey
  2. 下载SDK,本文使用的是Python,可通过pip进行安装:pip install tencentcloud-sdk-python

代码分享:

import base64
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.ocr.v20181119 import ocr_client, models


class OCR(object):

    def img_to_excel(self, 
            image_path, 
            secret_id, 
            secret_key):

        # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
        cred = credential.Credential(
            secret_id, 
            secret_key
            )

        # 实例化client对象
        httpProfile = HttpProfile()
        httpProfile.endpoint = "ocr.tencentcloudapi.com"
        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        clientProfile.signMethod = "TC3-HMAC-SHA256"
        client = ocr_client.OcrClient(cred, "ap-guangzhou", clientProfile)

        # 实例化一个请求对象
        req = models.GeneralFastOCRRequest()
        
        # 读取图片数据,使用Base64编码
        with open(image_path, 'rb') as f:
            image = f.read()
            image_base64 = str(base64.b64encode(image), encoding='utf-8')
        req.ImageBase64 = image_base64

        # 通过client对象调用访问接口,传入请求对象
        resp = client.TableOCR(req)

        # 获取返回数据(Data为Base64编码后的Excel数据)
        data = resp.Data

        # 转换为Excel
        path_excel = image_path + ".xlsx"
        with open(path_excel, 'wb') as f:
            f.write(base64.b64decode(data))
        return path_excel

tkGo封装

import os
from menu.menu import EMenu
from utils.img.ocr import OCR
from utils.clipboard.clipboard import Clipboard


class MenuImg(EMenu):

    LABEL_NAME = "Img"
    LABEL_IMG_TO_EXCEL = "IMG to Excel"
    
    def __init__(self, master=None, cnf={}, **kw):
        super().__init__(master=master, cnf=cnf, **kw)
        # 添加主菜单
        master.add_cascade(label=self.LABEL_NAME, menu=self)
        # 添加子菜单-图片表格数据转Excel
        self.add_command(  
            label=self.LABEL_IMG_TO_EXCEL, 
            command=self.img_to_excel
            )
    
    @EMenu.thread_run(LABEL_IMG_TO_EXCEL)
    def img_to_excel(self):
        # 获取图片文件路径
        data_type, data_content = Clipboard.get_data()
        if data_type != Clipboard.DATA_TYPE_FILE:
            self.msg_box_err("请先复制图片文件", title="错误")
            return

        # 使用ocr进行转换
        ocr = OCR()
        for file in data_content:
            path_excel = ocr.img_to_excel(
                image_path=file,
                secret_id=self.conf.api.TC_OCR_SECRET_ID,
                secret_key=self.conf.api.TC_OCR_SECRET_KEY
                )
            self.msg_box_info("转换成功:\n" + path_excel)

使用说明

步骤1:复制图片文件

步骤2:选择Img菜单下的IMG to Excel子菜单

一键识别图片中的表格数据,并转为Excel_第3张图片

步骤3:转换成功

一键识别图片中的表格数据,并转为Excel_第4张图片

完整代码

GitHub上搜索TheUncleWhoGrowsBeans

 

你可能感兴趣的:(#,tkGo,python)