Java中实现OCR识别读取图片中的文字

 更新时间:2024年04月01日 09:25:39   作者:Eiceblue  
图片内容一般无法编辑,如果想要读取图片中的文本,我们需要用到OCR工具,本文将介绍如何在Java中实现OCR识别读取图片中的文字,文中通过代码示例介绍的非常详细,需要的朋友可以参考下

所需工具:

  • IDEA
  • Spire.OCR for Java - Java OCR组件,支持识别多种语言、字体,可读取JPG、PNG、GIF、BMP 和 TIFF 等常用图片中的文本信息。

产品包下载链接:下载 | Spire.OCR for Java

或从Maven仓库导入:

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.ocr</artifactId>
        <version>1.9.0</version>
    </dependency>
</dependencies>
  • 其余依赖文件。按操作系统下载对应文件后,解压缩至指定的文件路径。

Linux

Windows x64

提取码:nw77

Java OCR识别图片文本的实现步骤

1. 在IDEA中新建一个项目并导入Spire.OCR.jar。

2. 将刚才下载解压缩后的 “dependencies” 文件夹复制到IDEA项目目录下。

3.确保导入以上所需依赖后,运行以下代码实现扫描读取图片中的文本。

import com.spire.ocr.OcrScanner;
import java.io.*;
 
public class ReadImage {
    public static void main(String[] args) throws Exception {
        //指定依赖文件的路径
        String dependencies = "F:\\dependencies\\";
        //指定要需要扫描的图片的路径
        String imageFile = "图片.png";
        //指定输出文件的路径
        String outputFile = "读取图片.txt";
 
        //创建OcrScanner对象,并设置其依赖文件路径
        OcrScanner scanner = new OcrScanner();
        scanner.setDependencies(dependencies);
 
        //扫描指定的图像文件
        scanner.scan(imageFile);
 
        //获取扫描的文本内容
        String scannedText = scanner.getText().toString();
 
        //创建输出文件对象
        File output = new File(outputFile);
        //如果输出文件已经存在,则将其删除
        if (output.exists()) {
            output.delete();
        }
        //创建BufferedWriter对象来将扫描的文本内容写入输出文件
        BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
        writer.write(scannedText);
        writer.close();
    }
}

示例图片:

OCR图片扫描结果:

OCR识别流程

概括

传统的OCR基于图像处理(二值化、连通域分析、投影分析等)和统计机器学习(Adaboost、SVM),过去20年间在印刷体和扫描文档上取得了不错的效果。传统的印刷体OCR解决方案整体流程如图。

在这里插入图片描述

从输入图像到给出识别结果经历了图像预处理、文字行提取和文字行识别三个阶段。

图像预处理

  • 二值化:由于彩色图像所含信息量过于巨大,在对图像中印刷体字符进行识别处理前,需要对图像进行二值化处理,使图像只包含黑色的前景信息和白色的背景信息,提升识别处理的效率和精确度
  • 图像降噪:由于待识别图像的品质受限于输入设备、环境、以及文档的印刷质量,在对图像中印刷体字符进行识别处理前,需要根据噪声的特征对待识别图像进行去噪处理,提升识别处理的精确度
  • 倾斜校正:由于扫描和拍摄过程涉及人工操作,输入计算机的待识别图像或多或少都会存在一些倾斜,在对图像中印刷体字符进行识别处理前,就需要进行图像方向检测,并校正图像方向。

在这里插入图片描述

文字检测

文字检测主要有两条线,两步法和一步法。

  • 两步法:faster-rcnn.
  • 一步法:yolo。相比于两步法,一步法速度更快,但是accuracy有损失。

文字检测按照文字的角度分。

  • 水平文字检测:四个自由度,类似于物体检测。水平文字检测比较好的算法是CTPN。
  • 倾斜文字检测:文本框是不规则的四边形,八个自由度。倾斜文字检测个人比较喜欢的方法是CVPR的EAST和Seglink。

在这里插入图片描述

文本识别

在以前的OCR任务中,识别过程分为两步:单字切割和分类任务。

现今基于深度学习的端到端OCR技术有两大主流技术:CRNN OCR和attention OCR。

其实这两大方法主要区别在于最后的输出层(翻译层),即怎么将网络学习到的序列特征信息转化为最终的识别结果。

这两大主流技术在其特征学习阶段都采用了CNN+RNN的网络结构,CRNN OCR在对齐时采取的方式是CTC算法,而attention OCR采取的方式则是attention机制。

在这里插入图片描述

网络结构包含三部分,从下到上依次为:

  • 卷积层,使用CNN,作用是从输入图像中提取特征序列;
  • 循环层,使用RNN,作用是预测从卷积层获取的特征序列的标签(真实值)分布;
  • 转录层,使用CTC,作用是把从循环层获取的标签分布通过去重整合等操作转换成最终的识别结果;

在这里插入图片描述

到此这篇关于Java中实现OCR识别读取图片中的文字的文章就介绍到这了,更多相关Java OCR识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现网络限速的详细步骤

    SpringBoot实现网络限速的详细步骤

    本文详细介绍了网络限速的重要性及常见限速策略,如固定窗口计数器、滑动窗口计数器、令牌桶算法和漏桶算法,并重点讲解了如何在SpringBoot中使用AOP和令牌桶算法实现网络限速,通过自定义注解、面向切面编程和测试验证等步骤,需要的朋友可以参考下
    2026-04-04
  • Java程序生成Access文件代码实例

    Java程序生成Access文件代码实例

    这篇文章主要介绍了Java程序生成Access文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • springboot集成nacos的配置方法

    springboot集成nacos的配置方法

    这篇文章主要介绍了springboot集成nacos的配置方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Mybatis防止sql注入的实例

    Mybatis防止sql注入的实例

    本文通过实例给大家介绍了Mybatis防止sql注入的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • SpringMVC高级开发功能实现过程解析

    SpringMVC高级开发功能实现过程解析

    这篇文章主要介绍了SpringMVC高级开发功能实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Storm框架整合springboot的方法

    Storm框架整合springboot的方法

    Storm框架中的每个Spout和Bolt都相当于独立的应用,Strom在启动spout和bolt时提供了一个open方法(spout)和prepare方法(bolt)。这篇文章主要介绍了Storm框架整合springboot的方法,需要的朋友可以参考下
    2018-11-11
  • java如何获取视频文件的编解码器代码示例

    java如何获取视频文件的编解码器代码示例

    这篇文章主要给大家介绍了关于java如何获取视频文件的编解码器的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-05-05
  • MyBatis-Plus联表查询(Mybatis-Plus-Join)的功能实现

    MyBatis-Plus联表查询(Mybatis-Plus-Join)的功能实现

    mybatis-plus作为mybatis的增强工具,简化了开发中的数据库操作,这篇文章主要介绍了MyBatis-Plus联表查询(Mybatis-Plus-Join),需要的朋友可以参考下
    2022-08-08
  • Springboot详解如何实现SQL注入过滤器过程

    Springboot详解如何实现SQL注入过滤器过程

    这篇文章主要介绍了基于springboot实现SQL注入过滤器,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2022-06-06
  • C++ 程序流程结构详解

    C++ 程序流程结构详解

    这篇文章主要介绍了C++程序的程序流程结构以及关系和逻辑运算符讲解,是C++入门学习中的基础知识,需要的朋友可以参考下
    2021-09-09

最新评论