背景
有时候我们需要将图片中的表格数据提取出来进行再次编辑,但一个字一个字的敲出来是件非常麻烦的事。
有没有更好的办法,一键提取图片中的表格数据,并转成Excel。
这时候,就需要用到OCR 技术了。
OCR
传统OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;即,针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,并通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术。
随着深度学习在OCR领域的成功应用,检测图像中的文字区域以及识别文字内容已经变得越来越成熟。
图片表格转Excel,先上效果图
待转换图片
转换后的Excel
TableOCR
本文使用腾讯的“文字识别OCR”,每月免费1千次,可以满足大部分普通用户的需求。
使用准备:
- 申请腾讯云账户secretId,secretKey
- 下载SDK,本文使用的是Python,可通过pip进行安装:pip install tencentcloud-sdk-python
代码分享:
import base64from tencentcloud.common import credentialfrom tencentcloud.common.profile.client_profile import ClientProfilefrom tencentcloud.common.profile.http_profile import HttpProfilefrom tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKExceptionfrom tencentcloud.ocr.v20181119 import ocr_client, modelsclass 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 osfrom menu.menu import EMenufrom utils.img.ocr import OCRfrom utils.clipboard.clipboard import Clipboardclass 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("请先复制图片文件", ) 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("转换成功:" + path_excel)
使用说明
步骤1:复制图片文件
步骤2:选择Img菜单下的IMG to Excel子菜单
步骤3:转换成功
完整代码
GitHub上搜索TheUncleWhoGrowsBeans