Java中如何使用 tesseract-ocr 进行图片文字提取(tesseract、tesseract训练自己的字库)

tesseract下载链接:

github:https://github.com/tesseract-ocr/ 

db:https://digi.bib.uni-mannheim.de/tesseract/

文字识别技术在许多领域都有广泛的应用,例如文档处理、自动化办公、移动设备上的文本输入等。而Tesseract-OCR作为一款开源的OCR引擎,以其高效、准确的文字识别能力,受到了广泛的关注和应用。本文将详细介绍Tesseract-OCR的原理、优势、使用方法以及应用案例,帮助读者更好地理解和使用这款工具。

一、Tesseract-OCR简介

Tesseract-OCR是由HP实验室开发,后由Google维护的一款开源OCR引擎。OCR是Optical Character Recognition的缩写,意为光学字符识别,是一种通过计算机软件识别印刷或手写文本的技术。Tesseract-OCR采用深度学习的方法进行文字识别,可以识别多种语言,包括英文、中文、德文、法文等。

二、Tesseract-OCR的优势
  • 准确性高:Tesseract-OCR的准确性在同类产品中处于领先地位,对于印刷体文本的识别率高达95%以上。
  • 支持多种语言:Tesseract-OCR支持多种语言的识别,包括英文、中文、德文、法文等,并可以通过训练来扩展识别其他语言。
  • 灵活的API接口:Tesseract-OCR提供了灵活的API接口,可以轻松集成到各种应用中,方便开发者进行二次开发。
  • 跨平台性:Tesseract-OCR可以在多种操作系统上运行,如Windows、Linux和Mac OS等。
    三、Tesseract-OCR的使用方法
  • 安装:首先需要下载并安装Tesseract-OCR软件。可以从官网下载最新版本的安装包进行安装。对于不同的操作系统,需要选择相应的安装包进行下载和安装。
  • 训练数据:为了提高识别的准确性,需要对特定的字体或文本进行训练。训练数据可以是自己的数据集,也可以使用公开的数据集进行训练。训练完成后,保存为.traineddata文件供Tesseract-OCR使用。
  • API接口:Tesseract-OCR提供了多种语言的API接口,包括C++、Java、Python等。开发者可以根据自己的需求选择相应的接口进行集成和使用。使用API接口可以方便地进行文本识别的各种操作,例如识别图片中的文本、进行文本转换等。
    四、Tesseract-OCR的应用案例
  • PDF文字识别:将PDF文件中的文字识别出来,方便用户进行编辑和使用。
  • 图形验证码识别:将图形验证码中的文字识别出来,用于登录验证等场景。
  • 移动设备上的文本输入:通过拍照或扫描文档,将图片中的文字识别出来,方便用户进行文本输入。
  • 自动化办公:将纸质文档或图片中的文字识别出来,进行后续的处理和分析。
三、(源码)Tesseract-OCR在Java中的应用实例
1、maven配置
        <!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j --><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version></dependency>
2、源码
/*** 	提取图片文字接口 V1.1*/
@RestController 
@RequestMapping(value="/ts/api/extract")     
public class TpExtractionApiController {// Windows图片地址public final static String globalVariableImageUrl = "D:\\tesseract";// Windows tesseract 训练地址public final static String globalVariableTesseractUrl = "D:\\tesseract";/*** 	main*/@RequestMapping(value="/image", method=RequestMethod.POST) public TpExtraction reg(@ApiParam(value = "文件") @RequestPart(value = "multipartFile") MultipartFile multipartFile) {//TpExtraction tpExtraction = new TpExtraction();//String filename = multipartFile.getOriginalFilename();//创建tess对象ITesseract tesseract = new Tesseract();//windows 设置训练文件目录tesseract.setDatapath(globalVariableUrl+"\\tessdata");//设置训练语言tesseract.setLanguage("chi_sim");//String result = "";//try {File file = null;try {// MultipartFile 转 Filefile = convert(multipartFile,filename);// 判断是否为PNG类型boolean bl_png = isImagePng(file);// true/falseif(bl_png) {// true 不处理}else {// 判断文件格式boolean bl = isImage(file);// if(bl) {// 转换为pngfile = convertToPng(file);}else {tpExtraction.setMsg("文件格式异常,请上传.png图片格式。");return tpExtraction;}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}result = tesseract.doOCR(file);tpExtraction.setMsg(result);} catch (TesseractException e) {// TODO Auto-generated catch blocke.printStackTrace();}return tpExtraction;}/***	 MultipartFile 转 File**/public static File convert(MultipartFile file,String filename) throws IOException {// windows 图片路径File convFile = new File(globalVariableUrl+"\\"+filename);// 创建文件convFile.createNewFile();try (InputStream in = file.getInputStream();OutputStream out = new FileOutputStream(convFile)) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}return convFile;}/*** 判断文件类型是否为图片类型*/public static boolean isImage(File file) {String name = file.getName().toLowerCase();return name.endsWith(".jpg") || name.endsWith(".jpeg") || name.endsWith(".png") ||name.endsWith(".gif") || name.endsWith(".bmp") || name.endsWith(".wbmp");}/*** 判断文件类型是否为PNG图片类型*/public static boolean isImagePng(File file) {String name = file.getName().toLowerCase();return name.endsWith(".png");}/***	将图片文件转换为PNG格式*/public static File convertToPng(File file) {//File writeFile = null;//try {BufferedImage image = ImageIO.read(file);String name = file.getName().toLowerCase();String format = "png";if (name.endsWith(".jpg") || name.endsWith(".jpeg")) {format = "png";} else if (name.endsWith(".gif")) {format = "gif";} else if (name.endsWith(".bmp") || name.endsWith(".wbmp")) {format = "bmp";}writeFile = new File(file.getParent(), name.substring(0, name.lastIndexOf('.')) + ".png");ImageIO.write(image, format, writeFile);} catch (IOException e) {e.printStackTrace();}return writeFile;}}
3、应用效果

四、 总结

如果想要提高tesseract识别率对图片分块是一个非常好的方法,识别率提高巨大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python推导式写出简洁高效的代码方法详解

概要 推导式是Python中一种非常强大的语法特性,允许你用简洁的语法创建列表、字典、集合等数据结构。使用推导式不仅可以让代码更加简洁和易读,还能提高代码的执行效率。本文将详细介绍Python中的各种推导式,并提供相应的示例代码,帮助全面掌握这一强大的工具。 列表推导式…

【前端项目笔记】9 数据报表

数据报表 效果展示&#xff1a; 在开发代码之前新建分支 git checkout -b report 新建分支report git branch 查看分支 git push -u origin report 将本地report分支推送到云端origin并命名为report 通过路由的形式将数据报表加载到页面中 渲染数据报表基本布局 面包屑导航…

数据洞察:从零到一的数据仓库与Navicat连接全攻略【实训Day04】[完结篇]

一、数据分析 1 实现数据仓库(在hadoop101上) 1) 创建jobdata数据库 # cd $HIVE_HOME # bin/hive hive>create database jobdata; hive>use jobdata; 2) 创建原始职位数据事实表ods_jobdata_orgin(在hadoop101上) create table ods_jobdata_origin( city string CO…

Keepalived+LVS实现负责均衡,高可用的集群

Keepalived的设计目标是构建高可用的LVS负载均衡群集&#xff0c;可以调用ipvsadm工具来创建虚拟服务器&#xff0c;管理服务器池&#xff0c;而不仅仅用作双机热备。使用Keepalived构建LVS群集更加简便易用&#xff0c;主要优势体现在&#xff1a;对LVS负责调度器实现热备切换…

配置并调试后端程序(sql)

1.环境准备 安装VS Code和Node.js插件&#xff1a;确保你已经安装了VS Code和Node.js插件。创建launch.json文件&#xff1a;在你的项目中创建一个.vscode文件夹&#xff0c;并在其中创建launch.json文件。添加以下内容&#xff1a; {"version": "0.2.0"…

uniapp 数据父传子

文章目录 可能出现的问题 在uni-app中&#xff0c;父组件向子组件传递数据主要通过属性绑定的方式实现。这里提供一个简单的示例来说明如何进行父传子的数据传递&#xff1a; 父组件 准备数据: 在父组件的data中定义要传递的数据。 export default {data() {return {parentMe…

PLC基础知识

1.PLC中的数据寄存器地址D表示存数据的地方。 2.PLC的物理存储器的规定&#xff1a;PLC存储器以字节为单位&#xff08;Byte&#xff09;&#xff0c;存储单元以位&#xff08;Bit&#xff09;、字节&#xff08;B&#xff0c;8Bit&#xff09;、字&#xff08;W&#xff0c;1…

电子行业MES系统解决方案

工业4.0时代的工业自动化&#xff0c;将在原有自动化技术和架构下&#xff0c;实现集中式控制向分散式增强型控制的基本模式转变&#xff0c;让设备从传感器到因特网的通讯能够无缝对接&#xff0c;从而建立一个高度灵活的、个性化和数字化、融合了产品与服务的生产模式。在这种…

spark shuffle写操作——BypassMergeSortShuffleWriter

创建分区文件writer 每一个分区都生成一个临时文件&#xff0c;创建DiskBlockObjectWriter对象&#xff0c;放入partitionWriters 分区writer写入消息 遍历所有消息&#xff0c;每一条消息都使用分区器选择对应分区的writer然后写入 生成分区文件 将分区writer的数据flu…

从海上长城到数字防线:视频技术在海域边防现代化中的创新应用

随着全球化和科技发展的加速&#xff0c;海域安全问题日益凸显其重要性。海域边防作为国家安全的第一道防线&#xff0c;其监控和管理面临着诸多挑战。近年来&#xff0c;视频技术的快速发展为海域边防场景提供了新的解决方案&#xff0c;其高效、实时、远程的监控特点极大地提…

如何快速开展每日待办工作 待办任务高效管理

每天&#xff0c;我们都需要处理大量的待办工作&#xff0c;如何高效有序地开展这些工作成为了我们必须要面对的问题。仅仅依靠个人的记忆和脑力去管理这些繁杂的事务&#xff0c;显然是一项艰巨的挑战。在这个时候&#xff0c;如果能有一款实用的待办工具来辅助我们&#xff0…

如何使用C++调用Pytorch模型进行推理测试:使用libtorch库

如何使用C调用Pytorch模型进行推理测试&#xff1a;使用libtorch库 目录 如何使用C调用Pytorch模型进行推理测试&#xff1a;使用libtorch库一、环境准备1&#xff0c;linux&#xff1a;以ubuntu 22.04系统为例1. 准备CUDA和CUDNN2. 准备C环境3, 下载libtorch文件4, 编写测试li…

期权学习必看圣书:《3小时快学期权》要在哪里看?

今天带你了解期权学习必看圣书&#xff1a;《3小时快学期权》要在哪里看&#xff1f;《3小时快学期权》是一本关于股票期权基础知识的书籍。 它旨在通过简明、易懂的语言和实用的案例&#xff0c;让读者在短时间内掌握股票期权的基本概念、操作方法和投资策略。通过这本书&…

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…

算力互联网网络架构;SRV6;智享WAN

目录 算力互联网网络架构 SRV6 主要特点 应用场景 结论 G-SRV6 多层次网络切片 智享WAN 一、定义与背景 二、关键技术 三、应用场景与优势 四、发展现状与未来展望 智能算力网络成为智能经济时代代表性数字基础设施 算力互联网网络架构 为构建算力互联网这个前瞻性…

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”&#xff0c;就是云存储&#xff0c;前端发文件到服务器&#xff0c;服务器不用再存到本地磁盘&#xff0c;可以直接传给“阿里云OSS”&#xff0c;存在网上。 二、怎么用 大体逻辑&#xff1a; 细分的话就是&#xff1a; 1、准…

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态&#xff1f; 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。在句话我是这样理解的&#xff1a; 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…

消息中间件ApacheKafka在windows简单安装

一.背景 之前公司需要API网关管理软件ApacheShenYu&#xff0c;我相信把调用的记录都存到一个数据库。他支持日志推送到kafka&#xff0c;所以&#xff0c;我准备尝试一下通过kafka接收调用的日志信息。第一步&#xff0c;当然是安装kafka了。 二.ApacheKafka的下载 打开下载…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏&#xff08;Memory Leak&#xff09;是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放&#xff0c;导致内存无法被重新利用时&#xff0c;就会发生内存泄漏。这种错误会导致程序占用越来越多的内存&#xff0c;最终可能导致系…

论文学习——动态多目标优化的一种新的分位数引导的对偶预测策略

论文题目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 动态多目标优化的一种新的分位数引导的对偶预测策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…