文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

几行 Java 代码搞定图片提取文字功能

2024-12-14 00:55

关注

 近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是 tesseract + Python flask的方案实现,二是 tesseract + Spring web 的技术解决方案,并简作论述,与君共勉。

一、tesseract-ocr介绍

ocr 含义是Optical Character Recognition,含义即视觉字符识别。而tesseract是该领域特别优秀开源的作品。

官方的tesseract定义:

OCR engine - libtesseract and a command line program - tesseract.

即tesseract包括一个视觉字符识别引擎libtesseract和命令行程序tesseract。

当前最新稳定版本是4.x.x基于LSTM,源码可从找到tesseract的GitHub: tesseract.找到。

关于tesseract的工作模式如上图所示。假设现在有一个图片输入,整个执行流程为:

  1.  输入(一张图片)
  2.  有用信息提取(比如一个图片上只有一个字,那其他留白的是无用,这个字上每个色素是有效的并且相关)
  3.  找出文字/线条
  4.  字符分类集
  5.  输入与分类集对比找出最接近的
  6.  输出识别结果

二、安装tesseract

第一步下载

下载合适的exe安装文件:

网址:https://digi.bib.uni-mannheim.de/tesseract/,下载完成后后装即可

第二步环境变量配置

在path变量中加入tesseract-ocr的安装路径

第三步安装成功检测

使用tesseract指令,显示如下:

Linux环境下载安装与上述类似

下载leptonica 和 tesseract两个包,解压安装,配置环境变量即可。网上很容易找到该安装包。

三、使用命令行

tesseract + 图片路径 + 保存结果名 + -l 语言集

示列: tesseract 1606150081.png 1606150081 -l chi_sim

tesseract + 图片路径 +stdout -l +语言集

示列: tesseract D:\company\ruigushop\spring-2s\test.png stdout -l chi_sim

有了上述之后就可以完成web图片识别程序的开发啦,废话不多说,直接上代码。

四、程序实现(Python)

程序设计思路:

上传图片 -> 保存 ->对上传的图片执行tesseract指令->获取识别结果

只有二十多行代码就实现了,so easy,以后网上看到图片识别程序再也不会感觉神奇了吧! 

  1. coding=utf-8  
  2. from flask import Flask, request  
  3. import os  
  4. import datetime  
  5. import time  
  6. app = Flask(__name__) 
  7. def get_time_stamp():  
  8.     times = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')  
  9.     array = time.strptime(times, "%Y-%m-%d %H:%M:%S")  
  10.     time_stamp = int(time.mktime(array))  
  11.     return time_stamp  
  12. @app.route('/image/extract', methods=['POST'])  
  13. def pure_rec():  
  14.     file = request.files.get('file')  
  15.     ts = str(get_time_stamp())  
  16.     up_path = os.path.join(ts + file.filename)  
  17.     file.save(up_path)  
  18.     cmd = "tesseract "+up_path+" " + ts + " -l chi_sim"  
  19.     print(cmd)  
  20.     os.system(cmd)  
  21.     with open(ts+".txt", 'r+', encoding="utf-8") as f: 
  22.         result = f.read()  
  23.         return result   
  24. if __name__ == '__main__':  
  25.     app.run(debug=True

五、程序实现(Java)

不需要任何引入第三方jar包,搭建一个简单的 Springboot Web 项目就可以了,没有其他额外的依赖。

Controller: 

  1. @RestController  
  2. public class LiteralExtractController {  
  3.     @PostMapping("/image/extract")  
  4.     public String reg(@RequestParam("file")MultipartFile file) throws IOException {  
  5.         String result = "" 
  6.         String filefilename = file.getOriginalFilename();  
  7.         File save = new File(System.getProperty("user.dir")+"\\"+filename);  
  8.         if (!save.exists()){  
  9.             save.createNewFile();  
  10.         }  
  11.         file.transferTo(save);  
  12.         String cmd = String.format("tesseract %s stdout -l %s",System.getProperty("user.dir")+"\\"+filename,"chi_sim");  
  13.         result = cmd(cmd);  
  14.         return result;  
  15.     }  
  16.     public static String cmd(String cmd) {  
  17.         BufferedReader br = null 
  18.         try {  
  19.             Process p = Runtime.getRuntime().exec(cmd);  
  20.             br = new BufferedReader(new InputStreamReader(p.getInputStream()));  
  21.             String line = null 
  22.             StringBuilder sb = new StringBuilder();  
  23.             while ((line = br.readLine()) != null) {  
  24.                 sb.append(line + "\n");  
  25.             }  
  26.             return sb.toString();  
  27.         } catch (Exception e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.         finally  
  31.         {  
  32.             if (br != null)  
  33.             {  
  34.                 try {  
  35.                     br.close();  
  36.                 } catch (Exception e) {  
  37.                     e.printStackTrace();  
  38.                 }  
  39.             }  
  40.         }  
  41.         return null;  
  42.     }  

六、实验测试

很简单二十多行代码就完成了,看看效果怎么样吧。

测试一图片:

测试一结果:

测试二图片:

测试二结果:

perfect,识别的很准确,第二个测试全部是英文字符的时候我们采用了中文训练的数据集,虽然也很好的识别了,但是速度会慢很多。

七、总结

图片识别在当今网络技术领域是非常热门的一块,而这次完成的这个程序完全是依赖别人开源框架来完成了这个技术实现,在应用层面这是成功的,但是本质上并没有实际算法,技术核心上的东西,如果只关心应用层开发上述解决了我们计算机在规则字符识别上的问题。

上述代码中基本没有难点,直接复制即可使用。此外,tesseract作为一款优秀的开源字符识别软件,但它也不是万能的,tesseract只能识别规则的字符,对于一些艺术字,抽象字它是无能为力的。 

 

来源:java版web项目内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯