02.25 简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取

最近很多人同学私聊,想要这篇文章中的源码,特意重发一下,文中代码可粘贴复制。

最近和同事聊天,聊到一个比较充满使命感的心酸的话题——在网上给小朋友抄题。。。那么问题来了,除了大家所知的QQ文字识别功能之外,还有哪些方式可以做到文字识别呢。

作为一名热心的Python小工,我想这个问题可以尝试着使用Python解决一下,看下效果。

Google一下,发现很多大的厂商(百度、阿里、腾讯等)已有相关的API开放使用,那么我们今天就以百度为例,分享下如何使用百度文字识别(OCR)服务,实现文字提取,其实三者都尝试过,感觉百度的效果最好(非评测),所以本文就以百度为例。

先简单介绍下,百度大脑AI开发平台,首先我们需要注册下开发平台用户,非常简单,手机号码注册即可。

http://ai.baidu.com/

登录后我们可以在控制台看到,开发平台提供的众多服务,其中有文字识别服务。


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取


创建一个文字识别服务应用,如下


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取


简单操作后,我们就可以成功创建一个服务应用,如下,其中AppID、API Key、Secret Key是我们后面调用OCR服务时需要用到的。


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取


接下来,我们看下如何使用Python调用百度OCR服务实现文字提取。

Python实现

代码设计

  • 图片压缩:由于OCR服务对图片大小有限制,因此在使用时若图片大小超过最大限制,要进行压缩处理。
  • OCR调用:实现利用百度OCR服务提取单张图片文字,返回文字内容。
  • 批量处理:实现N张图片的文字提取,并且保存提取结果到文本文件中。

图片压缩

<code> def photo_compression(original_image , tmp_image_path):     """     图片备份、压缩     :param original_image: 原始图片路径     :param tmp_image_path: 临时图片路径,备份路径     :return:     """     from PIL import Image     img = Image.open(original_image)     width, height = img.size     # 该数值压缩后的图片大约 200k+     while (width * height > 4000000):           width = width // 2         height = height // 2     e_img = img.resize((width, height), Image.BILINEAR)     save_path = path.join(tmp_image_path,                           os.path.basename(original_image))     e_img.save(save_path)          return save_path/<code>

OCR服务调用

该函数中使用到在上一章节,提到的AppID、API Key、Secret Key信息。

在代码中,我们使用了basicGeneral(通用文字识别),每天免费使用50000次,还有basicAccurate通用文字识别(高精度版),每天免费使用500次。基本满足我们日常使用,若不够,可以再使用其他文字识别服务。

<code> def ocr(original_image):     """     使用百度OCR进行文字识别,支持jpg/jpeg/png/bmp格式     :param original_image: 待识别图片     :return:     """     from aip import AipOcr     filename = path.basename(original_image)      APP_ID = '16572971'     API_KEY = '97jmvxVbuce8B3AQtxUirQ00'     SECRECT_KEY = 'dWAdA12ByPnSKzMI0MAXyvUwfDh171Cn'      client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)     with open(original_image, 'rb') as picfile_read:         img = picfile_read.read()         print "正在识别图片: {0} ……".format(filename)         try:             # 通用文字识别,50000次/天免费             result = client.basicGeneral(img)         except:             # 通用文字识别(高精度版),500次/天免费             result = client.basicAccurate(img)      return result /<code>

批量处理

通过传入单张图片或多张图片,调用OCR服务实现批量图片文字提取。

<code> def run_ocr( original_image, tmp_image_path,           result_file_path='identify_results.txt'):     """     主函数 批量执行图片文本识别,结果存储     :param original_image: 原始图片     :param tmp_image_path: 临时图片     :param result_file_path: 识别文字存储文件     :return:     """     # 判断是否存在历史识别结果,若存在则删除     if path.exists(result_file_path):         os.remove(result_file_path)     # 判断临时图片路径是否存在,若不存在则创建     if not path.exists(tmp_image_path):         os.mkdir(tmp_image_path)     # 临时文件路径列表     tmp_file_path = []     for picfile in glob.glob(original_image):         tmp_file = photo_compression(picfile, tmp_image_path)         tmp_file_path.append(tmp_file)     # 遍历所有文件,进行ocr识别 结果存储     for picfile in tmp_file_path:         result = ocr(picfile)         lines = [text.get('words').encode('utf-8') + '\\n' for text in result.get('words_result')]          with open(result_file_path, 'a+') as fo:             fo.writelines("=" * 100 + '\\n')             fo.writelines("【识别图片】: {0} \\n".format(path.basename(picfile) ))             fo.writelines("【文本内容】: \\n")             fo.writelines(lines)         os.remove(picfile)          if __name__ == "__main__":     tmp_image_path = r'D:\\learn\\tmp'     original_image = r"D:\\learn\\*.png"     run_ocr(original_image,tmp_image_path)             /<code>

效果如下

单张图片


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取


识别结果

<code> 软件测试开发技术栈V 文章视频微头条收藏 支持反编译,阿里开源性能监控分析神器 Arthas 1.0万阅读·15评论·2019-06-17 22:30      /<code>


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取


识别结果

<code> Arthas(阿尔萨斯)是 Alibaba开源的Java诊断性能监控分析工具,它不需要做任何的参数配置,就可以直观的获取各种维庋的性能数据。通过阅读官网的介绍,可以看到,当我们遇到以下类似问题而束手无策时, Arthas可以帮助我们解决 这个类从哪个jar包加载的?为什么会报各种类相关的 EXception? ■我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? ■遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! ■是否有一个全局视角来查看系统的运行状况? ■有什么办法可以监控到M的实时运行状态? Arthas支持JDK6+,支持 Linux/Mac∧ Winodws,采用命令行交互模式,同时提供丰富的 Tab自动补全功能,进一步方便进行问题的定位和诊断/<code>


批量处理结果


简单实用,准确高效,Python利用百度文字识别服务实现图片文字提取



分享到:


相關文章: