如何进行图片文字识别

  • A+
所属分类:安全闲碎
如何进行图片文字识别

点击上方蓝字关注

    前段时间在进行内部训练题库搭建时遇到一个棘手的问题,搭建题库的原始素材并不是WORD或EXCEL形式记录的内容,而是一张又一张的截图。

如何进行图片文字识别

    当看到这些截图的时候,内心是无比的崩溃。录入题库系统,需要将图片转换文字再录入进去,这个工作估计的手工敲进去了,想想这个工作量怕是要干到猴年马月了!

    在无比奔溃的边缘时,突然想起了OCR技术。OCR的概念是在1929年由德国科学家Tausheck最先提出来的,后来美国科学家Handel也提出了利用技术对文字进行识别的想法。在网络上有大量提供OCR技术的企业,或许可以通过OCR技术来对图片中的文字进行提取,这样的话我的工作就剩下复制粘贴了!

    至于选择谁提供的OCR接口(API),这个其实都无所谓,原本我的需求简单并不复杂。由于在百度搜索OCR排名显示第一的为“百度智能云”,那就暂时选百度吧,毕竟就人家后面有个“名企”标识。

如何进行图片文字识别

    百度智能云提供的文字识别技术,可以多场景、多语种、高精度的文字检测与识别服务,多项ICDAR指标居世界第一;广泛适用于远程身份认证、财税报销、文档电子化等场景,为企业降本增效;提供稳定易用的在线API、离线SDK、软件部署包多种服务形式。

    对于当前我的需求,可以通过Python来调用“百度智能云”提供的在线API来实现,为了提高对图片中文字识别的精确度,采用“通用文字识别(高精度版)”。如何通过Python实现,下发直接给大家提供源代码,对于源代码中修改的部分进行重点注释。

import base64import requests
API_KEY = 'key' # 自行获取补充SECRET_KEY = 'key'  # 自行获取补充OCR_URL = "URL"  # OCR接口,请求URL参数,根据官方API文档修改补充。TOKEN_URL = 'https://aip.baidubce.com/oauth/2.0/token' # access_token获取接口,授权服务地址。
def fetch_token(): # 获取token params = {'grant_type': 'client_credentials', 'client_id': API_KEY, 'client_secret': SECRET_KEY} try: f = requests.post(TOKEN_URL, params, timeout=5) if f.status_code == 200: result = f.json() if 'access_token' in result.keys() and 'scope' in result.keys(): if not 'brain_all_scope' in result['scope'].split(' '): return None, 'please ensure has check the ability' return result['access_token'], '' else: return None, '请输入正确的 API_KEY 和 SECRET_KEY' else: return None, '请求token失败: code {}'.format(f.status_code) except BaseException as err: return None, '请求token失败: {}'.format(err)
def read_file(image_path): f = None try: f = open(image_path, 'rb') # 二进制读取图片信息 return f.read(), '' except BaseException as e: return None, '文件({0})读取失败: {1}'.format(image_path, e) finally: if f: f.close()
def pic2text(img_path): def request_orc(img_base, token): """ 调用百度OCR接口,图片识别文字 :param img_base: 图片的base64转码后的字符 :param token: fetch_token返回的token :return: 返回一个识别后的文本字典 """ try: req = requests.post( OCR_URL + "?access_token=" + token, data={'image': img_base}, headers={'Content-Type': 'application/x-www-form-urlencoded'} ) if req.status_code == 200: result = req.json() if 'words_result' in result.keys(): return req.json()["words_result"], '' elif 'error_msg' in result.keys(): return None, '图片识别失败: {}'.format(req.json()["error_msg"])
else: return None, '图片识别失败: code {}'.format(req.status_code) except BaseException as err: return None, '图片识别失败: {}'.format(err)
file_content, file_error = read_file(img_path) if file_content: token, token_err = fetch_token() if token: results, result_err = request_orc(base64.b64encode(file_content), token) if result_err: # 打印失败信息 print(result_err) for result in results: # 打印处理结果                print(result)                if __name__ == '__main__': pic2text(img_path='你自己图片所在路径') # 输入自己图片所在位置

    先来一起看看执行后的结果,左边为识别结果,右边为原始图片,有没有觉得OCR就是这么丝滑好用。

如何进行图片文字识别

    现在对代码中需要重点关注并修改的部分,来进行一下说明。重点关注:'API_KEY ' 'SECRET_KEY'  'OCR_URL'  'img_path'

API_KEY = 'key' # 自行获取补充SECRET_KEY = 'key'  # 自行获取补充OCR_URL = "URL"  # OCR接口,请求URL参数,根据官方API文档修改补充。
if __name__ == '__main__': pic2text(img_path='你自己图片所在路径') # 输入自己图片所在位置

    API_KEY和SECRET_KEY是需要通过个人账号来进行获取的,请先登录百度智能云官网,并点击创建应用。

如何进行图片文字识别

    按照提示步骤进行补充,如果没有进行免费额度领取可以按照提示进行领取。应用归属选择个人,进行应用描述补充后进行提交。

如何进行图片文字识别

如何进行图片文字识别

    提交后完成后,可在管理应用中看到创建的应用名称。API Key及代码中需要补充的API_KEY,Secret Key及代码中需要补充的SECRET_KEY

如何进行图片文字识别


   对于API接口的获取,需要自行通过API文档来查看。API接口的选择,根据所使用服务类型来选择。由于我免费领取定的额度中包含“通用文字识别(高精度版)”,所以下图选择了对应服务类型的API接口,请求URL及代码中需要补充的OCR_URL

如何进行图片文字识别

    最后是img_path,对于img_path想要给大家强调如何写自己图片所在位置的路径。对于这个问题其实就是Python中什么是文件路径,如何书写文件路径。在Window下python读取数据路径可以有三种表示方式分别为:转义、声明字符串、正斜杠,我们来分别看看如何表示。

    转义方式,需要两个反斜杠。

if __name__ == '__main__':    pic2text(img_path='c:\a.png'# 反斜杠必须要有两个。因为每个反斜杠需要由另一个反斜杠字符来转义。

    声明字符串,表示不需要转义。

if __name__ == '__main__':    pic2text(img_path= r'c:a.png'# 不需要转义

    正斜杠表示路径,与linux一样,没有转义的误解。

if __name__ == '__main__':    pic2text(img_path='c:/a.png'#没有转义的误解
    至于选择哪一种方式,看每个人的使用习惯。个人比较推荐声明字符串和正斜杠表示路径,优选声明字符串方式。
    到这里通过百度OCR接口实现图片文字识别内容就完结了,有需要代码的伙伴可在上方自取或者关注此微信公众号并回复“OCR”获取py文件。

如何进行图片文字识别

原文始发于微信公众号(弥天安全实验室):如何进行图片文字识别

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: