自学内容网 自学内容网

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();
        }
    }


原文地址:https://blog.csdn.net/weixin_43583693/article/details/140468214

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!