在数学建模中会遇到对图片中的文字进行识别提取,保存到excel中,以下进行操作:
1、在腾讯云中开通业务,每个月有免费额度,虽然识别也会不准,但还算亲民,具体操作可参考官方文档文字识别 一分钟接入服务端 API-快速入门-文档中心-腾讯云
2、代码接入腾讯云API,进行图片识别
3、将识别后的文字进行保存。
在识别后的结果千奇百怪,有元素个数不统一,有识别错误等情况如下图:
为了实现不同信息的正确提取,使用了.join()元素合并,以解决识别后元素个数不统一的情况。.split()以标志点分割文字,以解决识别出现错误的情况(在这里使用识别率最高的“#”作为标志)具体过程在代码中的备注均有说明,请大家放心食用。缺少库可自行下载。
import os
import pandas as pd
#以下代码是将【本地图片】进行文字识别
# Ningmou
#接入腾讯云文字识别(高精度版)作为端口接入
#pip install tencentcloud-sdk-python
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
import base64
import json
import jsonpath
def get_json(img_path) :
try:
cred = credential.Credential("", "") #输入密钥
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = ocr_client.OcrClient(cred, "", clientProfile) #服务器地址
req = models.GeneralAccurateOCRRequest()
#对本地图片进行base64转码【本地图片解析需要先转成base64编码】
with open(img_path, 'rb') as f:
base64_data = base64.b64encode(f.read())
s = base64_data.decode()
ImageBase64_value = 'data:image/jpeg;base64,%s'%s
#params是字符串,以下进行拼接
params = '{"ImageBase64":"' + ImageBase64_value + '"}' #以图片Base64编码发送请求
req.from_json_string(params)
resp = client.GeneralAccurateOCR(req)
resp = resp.to_json_string() #不知道为何,此步无法完成数据提取,于是在下面又写了一个解析的方法
return resp
except TencentCloudSDKException as err:
print(err)
def parse_json(resp): #解析
with open('text.txt','w',encoding='utf-8') as f: #先写入txt中
f.write(resp)
with open('text.txt','r',encoding='utf-8') as f: #然后再读
str = f.read()
str = json.loads(str) #json.loads:将JSON字符串解码为 Python 对象;json.dumps:将 Python 对象编码成 JSON 字符串
DetectedText = jsonpath.jsonpath(str, "$..DetectedText") #解析:通过找到DetectedText获得对应的值
return DetectedText
#print(len(DetectedText))
#指明图片所在文件夹
images = r'E:\mycode\tupian'
#遍历所有图片并识别文字,切片提取有效信息
data1 = [] #设置空列表,储存数据
str = '' #用于合并元素
for img_path in os.listdir(images): #os用于连接系统上的文件
# DetectedText 是识别后得到的结果
resp = "".join(get_json(f'{images}/{img_path}'))
DetectedText1 = parse_json(resp) #腾讯云识别的文字拆分成几个元素
DetectedText = str.join(DetectedText1) #将每个元素合并成一个元素
shijian = DetectedText[0:5] #将每个元素的前5个字符提取作为时间
wendu = DetectedText.split('#', 2) #以元素中“#”作为标志切开,形成3个元素
yisi = wendu[1][:-1] #提取1#温度
ersi = wendu[-1][-5:] #提取2#温度
data1.append([shijian, yisi, ersi]) #将提取的数据放入data1中
# 输出结果
print(wendu)
##保存数据
#新建文件夹保存
df = pd.DataFrame(data1)
print(f"识别结果如下:")
print(df)
df.to_excel("附件2.xlsx", index=False)