当前位置: 首页 > article >正文

java识别图片上的文字、java中语言库tessdate的使用

  • 下载语言库:tessdata语言库
  • 下载好后,记住在本地路径:如: D:\tessdate\tessdata-main

  • 添加 maven 
<!--基于 Tesseract-OCR 封装的 OCR 识别 jar-->
<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>5.8.0</version>
</dependency>
  • 识别代码:(识别一些简单的文字)
public static void main(String[] args) {
        // 需要识别的图片路径
        String imagePath = "C:/Users/Dell/Desktop/cc.jpg";     
        // 使用Tesseract进行OCR
        Tesseract tesseract = new Tesseract();
        // 设置Tesseract数据路径 上面下载的本地路径
        tesseract.setDatapath("D:\\tessdate\\tessdata-main");
        // 设置语言库  中文
        tesseract.setLanguage("chi_sim"); 

        try {
            // 进行文字识别
            String result = tesseract.doOCR(new File(imagePath));
            System.out.println("OCR结果:");
            System.out.println(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
    }

识别结果如下

这样只能识别一些简单的文字,还可能会识别出错,想识别复杂一点的减少出错率需要配合上opencv 使用--如下:

  • 添加maven
 <dependency>
     <groupId>org.bytedeco</groupId>
     <artifactId>opencv-platform</artifactId>
     <version>4.5.1-1.5.5</version>
 </dependency>

处理图像(根据情况修改里面的参数,找到识别率最高的参数组。注:有的参数有最小最大值或单数双数限制,不正确时会报错,从错误信息就可以看出来):

public static Mat preprocessImage(String imagePath) {
    // 1. 读取图像文件
    // 使用 OpenCV 的 imread 函数从指定路径读取图像,返回一个 Mat 对象。
    // Mat 是 OpenCV 中用于存储图像的基本数据结构。
    Mat src = opencv_imgcodecs.imread(imagePath);

    // 2. 转换为灰度图像
    // 使用 cvtColor 函数将读取的图像从 BGR 格式转换为灰度图像。
    // BGR 是 OpenCV 中默认的颜色格式,而灰度图像只有单一通道。
    Mat gray = new Mat();
    opencv_imgproc.cvtColor(src, gray, opencv_imgproc.COLOR_BGR2GRAY);

    // 3. 去噪
    // 使用 fastNlMeansDenoising 函数进行快速非局部均值去噪,主要用于减少图像中的噪声。
    // 这个步骤可以提高图像的清晰度,尤其是在灰度图像的情况下。
    Mat denoised = new Mat();
    opencv_photo.fastNlMeansDenoising(gray, denoised);

    // 4. 形态学操作去除背景纹路
    // 使用 getStructuringElement 创建一个形态学操作的核 (kernel),它是一个 2x2 的矩形。
    // 在形态学处理中,核用于在图像上执行膨胀、腐蚀等操作。
    Mat morphKernel = opencv_imgproc.getStructuringElement(opencv_imgproc.MORPH_RECT, new Size(2, 2));

    // 使用 morphologyEx 进行形态学关闭操作 (MORPH_CLOSE),这是一种先膨胀后腐蚀的操作。
    // 这种操作可以消除图像中的小空洞或细小的黑色区域,平滑图像中的边缘。
    Mat morph = new Mat();
    opencv_imgproc.morphologyEx(denoised, morph, opencv_imgproc.MORPH_CLOSE, morphKernel);

    // 5. 自适应阈值处理(二值化)
    // 使用 adaptiveThreshold 将形态学处理后的图像转换为二值图像。
    // 自适应阈值会根据图像局部区域的亮度自动调整阈值,从而对亮度不均的图像效果更好。
    // 参数说明:
    // 255 是最大值,表示超过阈值的像素值将设为 255(白色)。
    // ADAPTIVE_THRESH_GAUSSIAN_C 表示采用高斯滤波的方式来计算阈值。
    // THRESH_BINARY 表示二值化处理,像素值要么为 0(黑色),要么为 255(白色)。
    // 3 是 blockSize,表示用于计算阈值的邻域大小。
    // 2 是一个常数,会从计算出来的阈值中减去,用来调整结果。
    Mat binary = new Mat();
    opencv_imgproc.adaptiveThreshold(morph, binary, 255, opencv_imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, opencv_imgproc.THRESH_BINARY, 3, 2);

    // 6. 返回处理后的二值图像
    return binary;
}

使用方法:

public static void main(String[] args) {
        // 识别的图片路径
        String imagePath = "C:/Users/Dell/Desktop/ee.jpeg";
        // 获取处理后的图片
        Mat processedImage = preprocessImage(imagePath);

        // 保存预处理后的图像以便检查
        File outputDir = new File("output");
        if (!outputDir.exists()) {
            outputDir.mkdirs();  // 创建目录及所需的父目录
        }
        // 保存处理后的图片         处理后的新图片路径
        opencv_imgcodecs.imwrite("output/processed_image.jpg", processedImage);
        Tesseract tesseract = new Tesseract();
        tesseract.setDatapath("D:\\tessdate\\tessdata-main");
        tesseract.setLanguage("chi_sim");
        try {
            //    识别保存处理后的图片
            String result = tesseract.doOCR(new File("output/processed_image.jpg"));
            System.out.println("OCR结果:");
            System.out.println(result);
        } catch (TesseractException e) {
            e.printStackTrace();
        }
    }


http://www.kler.cn/a/311640.html

相关文章:

  • PaaS云原生:分布式集群中如何构建自动化压测工具
  • 【PGCCC】Postgresql Toast 原理
  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • F5全新报告揭示AI时代API安全面临严峻挑战
  • uni-app表单⑪
  • 力扣 LeetCode 27. 移除元素(Day1:数组)
  • Web APIs 第二天
  • 如何应对pcdn技术中遇到的网络安全问题?
  • Docker 进入容器并运行命令的方法
  • iOS17找不到developer mode
  • 从黎巴嫩电子通信设备爆炸看如何防范网络电子袭击
  • Python 爬虫入门 - Request 静态页面数据获取
  • 支持升降压型、升压、降压、60V的1.2MHz频率LED恒流驱动器LGS63040、LGS63042
  • 记录可编辑表格(未完整)
  • 【25.3】C++智能交友系统
  • K8s1.28 部署Dashboard获取登录信息
  • STM32 HAL freertos零基础(八)事件标志组
  • 09 Shell Scriptfor循环结构语句
  • 防爆手机+鸿蒙系统,遨游通讯筑牢工业安全基石
  • Android实现自定义下拉列表绑定数据
  • WEB 编程:使用富文本编辑器 Quill 配合 WebBroker 后端
  • Go语言grequests库并发请求的实战案例
  • vue3常用的组件间通信
  • 『功能项目』眩晕图标显示【52】
  • Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐
  • Cubic Eight-Puzzle(UVA-1604)