0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用Java几行代码从图片提取文字

Android编程精选 来源:CSDN博客 作者:兴趣使然的程序猿 2021-10-28 14:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


	
近日浏览网上一些图片提取文字的网站,觉得甚是有趣,花费半日也做了个在线图片识别程序,完成了两个技术方案的选择,一是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两个包,解压安装,配置环境变量即可。网上很容易找到该安装包。

三、使用命令行

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

示列:tesseract 1606150081.png 1606150081 -l chi_sim

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

示列:tesseract D:company uigushopspring-2s est.png stdout -l chi_sim

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

四、程序实现(Python)

程序设计思路:

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

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

关注Java核心技术,推送更多 Java 干货!76f796be-3762-11ec-82a8-dac502259ad0.png

#coding=utf-8
fromflaskimportFlask,request
importos
importdatetime
importtime

app=Flask(__name__)

defget_time_stamp():
times=datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')
array=time.strptime(times,"%Y-%m-%d%H:%M:%S")
time_stamp=int(time.mktime(array))
returntime_stamp

@app.route('/image/extract',methods=['POST'])
defpure_rec():
file=request.files.get('file')
ts=str(get_time_stamp())
up_path=os.path.join(ts+file.filename)
file.save(up_path)
cmd="tesseract"+up_path+""+ts+"-lchi_sim"
print(cmd)
os.system(cmd)
withopen(ts+".txt",'r+',encoding="utf-8")asf:
result=f.read()
returnresult

if__name__=='__main__':
app.run(debug=True)

五、程序实现(Java)

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

推荐一个 Spring Boot 基础教程及实战示例:https://www.javastack.cn/categories/Spring-Boot/

Controller:

packagecom.lbh.web.controller;

/*
*Copyright@lbhbinhao@163.com
*Author:liubinhao
*Date:2020/11/23
*++++______@authorliubinhao____________
*+++//|//|//|
*+/_____/|/_____/|/_____/|
*|||||||||
*||||||________|||
*|||||/|||
*|||||/___________|||
*|||___________________||____________|||
*||//|||||||
*||/_________________//||/||/
*|_________________________|/b|_____|/|_____|/
*/
importorg.springframework.web.bind.annotation.PostMapping;
importorg.springframework.web.bind.annotation.RequestParam;
importorg.springframework.web.bind.annotation.RestController;
importorg.springframework.web.multipart.MultipartFile;

importjava.io.BufferedReader;
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStreamReader;

@RestController
publicclassLiteralExtractController{

@PostMapping("/image/extract")
publicStringreg(@RequestParam("file")MultipartFilefile)throwsIOException{
Stringresult="";
Stringfilename=file.getOriginalFilename();
Filesave=newFile(System.getProperty("user.dir")+""+filename);
if(!save.exists()){
save.createNewFile();
}
file.transferTo(save);
Stringcmd=String.format("tesseract%sstdout-l%s",System.getProperty("user.dir")+""+filename,"chi_sim");
result=cmd(cmd);
returnresult;
}

publicstaticStringcmd(Stringcmd){
BufferedReaderbr=null;
try{
Processp=Runtime.getRuntime().exec(cmd);
br=newBufferedReader(newInputStreamReader(p.getInputStream()));
Stringline=null;
StringBuildersb=newStringBuilder();
while((line=br.readLine())!=null){
sb.append(line+"
");
}
returnsb.toString();
}catch(Exceptione){
e.printStackTrace();
}
finally
{
if(br!=null)
{
try{
br.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
returnnull;
}
}

哈哈哈,还有帅气的程序logo。

六、实验测试

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

七、总结

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

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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115649
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73129

原文标题:Java 几行代码提取图片文字,过个厉害了。。

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Arm Neoverse CPU上大代码Java应用的性能测试

    Java 是互联网领域广泛使用的编程语言。Java 应用的一些特性使其性能表现与提前编译的原生应用(例如 C 程序)大相径庭。由于 Java 字节码无法直接在 CPU 上执行,因此通常运行时在
    的头像 发表于 11-05 11:25 368次阅读
    Arm Neoverse CPU上大<b class='flag-5'>代码</b>量<b class='flag-5'>Java</b>应用的性能测试

    Java 25正式发布,重要特性详解(附代码示例):灵活构造函数体、模块导入声明、AOT方法分析等

    Java 25现已发布,更多新特性来了!配合Perforce JRebel,代码修改即时生效,无需重启服务,即可实现“改完就看效果”。新特性+快工具,让你的Java开发体验双倍提升!
    的头像 发表于 10-29 13:16 837次阅读
    <b class='flag-5'>Java</b> 25正式发布,重要特性详解(附<b class='flag-5'>代码</b>示例):灵活构造函数体、模块导入声明、AOT方法分析等

    淘宝图片搜索接口开发实战: CNN 特征提取到商品匹配(附避坑手册 + 可复用代码

    本文详解淘宝图片搜索接口开发全流程,涵盖CNN特征提取、商品匹配、参数配置及400/429等高频报错解决方案,附合规避坑指南与可复用代码,助你高效实现图像搜商品功能。
    的头像 发表于 10-21 10:03 257次阅读

    商品图片批量上传接口设计与实现

    设计、实现步骤、代码示例、错误处理和性能优化。文章基于Python Flask框架,确保内容真实可靠,适合开发者快速上手。 1. 接口设计概述 一个标准的商品图片批量上传接口应遵循RESTful原则,使用HTTP POST方法。关键设计点包括: 端点定义:例
    的头像 发表于 10-13 15:25 198次阅读

    BootLoader app程序反复重启,IAP升级失败怎么处理?

    keil开发的BootLoader程序,用RT-Thread Studio开发的app程序,板子每次上电后,BootLoader程序跳转到app程序,就打印几行RT-Thread的日志,然后就反复重启:先执行BootLoader程序,再执行app程序打印
    发表于 09-10 07:36

    知乎开源“智能预渲染框架” 几行代码实现鸿蒙应用页面“秒开”

    ,交互延迟等核心痛点,通过智能预测用户浏览目标进行提前渲染,只需几行代码即可显著提升复杂页面的加载性能,实现“页面秒开”的高效体验,为鸿蒙开发者带来开发效率和用户体验的双重飞跃。 随着鸿蒙生态快速发展,应用开发者难免会遇到一些性能问题
    的头像 发表于 08-29 14:32 464次阅读
    知乎开源“智能预渲染框架” <b class='flag-5'>几行</b><b class='flag-5'>代码</b>实现鸿蒙应用页面“秒开”

    Perforce JRebel 简介:即时加载代码变更,加速Java应用开发

    Perforce JRebel 专为Java开发提速而生!支持跳过构建与重新部署,实时加载代码变更,支持100+框架,无缝集成主流IDE与应用服务器。
    的头像 发表于 08-14 14:35 486次阅读
    Perforce JRebel 简介:即时加载<b class='flag-5'>代码</b>变更,加速<b class='flag-5'>Java</b>应用开发

    产品图片上传API接口

    的基本原理、实现方法、代码示例及最佳实践,帮助您构建可靠高效的上传功能。 1. 基本工作原理 产品图片上传API接口通常基于RESTful架构设计,使用HTTP POST方法传输文件。当用户发起请求时,API接收包含图片数据的m
    的头像 发表于 07-25 14:30 455次阅读
    产品<b class='flag-5'>图片</b>上传API接口

    如何在dify中搭建OCR智能体

    企业在日常运营中面临合同、票据、手写笔记等多种文档的处理需求,这些文档常以图片或扫描件形式存在,文字提取困难,严重制约数字化管理效率。
    的头像 发表于 06-27 14:19 4303次阅读

    如何使用USB2.0将数据fpga传输到PC?

    : Input/Output Error您CAN 帮助我找到此错误的解决方案,以便 CAN 将数据 fpga 发送到计算机?在此先感谢。 告诉我是否需要查看 JAVA 代码和 vhdl 项目。 预先谢谢
    发表于 05-29 06:28

    CodeBuddy 打造一款响应式图片画廊

    图片画廊页面来作为练手项目,目标很明确:要实现不等高的 Masonry 布局,点击图片能弹出大图预览,还要能通过键盘切换图片。理想状态下,它还应该支持无限滚动加载,并提供分类筛选功能。光想想就觉得挺麻烦的,但我决定用 Code
    的头像 发表于 05-11 13:33 484次阅读
    CodeBuddy 打造一款响应式<b class='flag-5'>图片</b>画廊

    Java开发者必备的效率工具——Perforce JRebel是什么?为什么很多Java开发者在用?

    Perforce JRebel是一款Java开发效率工具,旨在帮助java开发人员更快地编写更好的应用程序。JRebel可即时重新加载对代码的修改,无需重启或重新部署应用程序,就能让开发者即时看到
    的头像 发表于 04-27 13:44 642次阅读
    <b class='flag-5'>Java</b>开发者必备的效率工具——Perforce JRebel是什么?为什么很多<b class='flag-5'>Java</b>开发者在用?

    Java 到 Go:面向对象的巨人与云原生的轻骑兵

    Go 语言在 2009 年被 Google 推出,在创建之初便明确提出了“少即是多(Less is more)”的设计原则,强调“以工程效率为核心,用极简规则解决复杂问题”。它与 Java 语言生态
    的头像 发表于 04-25 11:13 505次阅读

    怎么使用代码控制DLP4500投影图片

    最近在研究怎么使用代码控制DLP4500投影图片。看网上说可以参考dlp4500_test.zip这个文件,但是我没有在网上找到这个文件。 能麻烦分享一个下载连接嘛?
    发表于 02-27 06:34

    SSM框架在Java开发中的应用 如何使用SSM进行web开发

    SSM框架,即Spring、SpringMVC和MyBatis的整合,是Java Web开发中常用的技术栈。它通过分层架构,实现了视图、控制、业务逻辑和数据访问的分离,提高了代码的可维护性和可扩展性
    的头像 发表于 12-16 17:28 2115次阅读