首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 整合 Tesseract OCR 實現圖像文字識別:完整代碼實戰

     編輯:Java 相關知識

項目背景與目標

承接上篇命令行基礎教程,本文詳細介紹如何在 Java 項目中集成 Tesseract OCR 引擎,實現圖片文字的自動識別與提取。核心思路是通過 Java 的 ProcessBuilder 調用系統級 Tesseract 可執行文件,並輔以圖像預處理(去噪、二值化)顯著提升識別準確率。

環境準備

  • 安裝 Tesseract OCR 引擎(Windows/Linux 均支持)
  • 配置語言包(如 eng 英文、chi_sim 簡體中文)
  • 項目依賴:swingx 用於作業系統判斷,標準 java.awt 處理圖像

核心識別代碼(OCRHelper)

public class OCRHelper {
    private final String LANG_OPTION = "-l";
    private String tessPath = new File("tesseract").getAbsolutePath();

    public String recognizeText(File imageFile) throws Exception {
        File outputFile = new File(imageFile.getParentFile(), "output");
        List<String> cmd = new ArrayList<>();
        
        // 跨平台命令適配
        if (OS.isWindowsXP()) cmd.add(tessPath + "\\tesseract");
        else if (OS.isLinux()) cmd.add("tesseract");
        else cmd.add(tessPath + "\\tesseract");
        
        cmd.add(""); // 佔位:圖片路徑
        cmd.add(outputFile.getName());
        cmd.add(LANG_OPTION);
        cmd.add("eng"); // 或 chi_sim
        
        ProcessBuilder pb = new ProcessBuilder(cmd);
        pb.directory(imageFile.getParentFile());
        cmd.set(1, imageFile.getName());
        pb.redirectErrorStream(true);
        Process process = pb.start();
        
        // 讀取輸出結果
        BufferedReader reader = new BufferedReader(
            new InputStreamReader(process.getInputStream()));
        StringBuilder result = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) result.append(line);
        return result.toString();
    }
}

圖像去噪增強(ClearImageHelper)

針對驗證碼、模糊文檔等複雜場景,提供基於 Otsu 算法的自適應二值化與干擾線清除:

  • 灰度化 + 亮度增強(RGB 通道 ×1.1 +30)
  • Otsu 算法計算最優閾值
  • 二值化處理 + 矩陣可視化輸出
  • 無第三方依賴,純 JDK 實現
// 核心邏輯片段
int threshold = ostu(gray, w, h); // Otsu 閾值
BufferedImage binaryImg = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);
for (int x = 0; x < w; x++) {
    for (int y = 0; y < h; y++) {
        if (gray[x][y] > threshold) gray[x][y] |= 0x00FFFF; // 白
        else gray[x][y] &= 0xFF0000; // 黑
        binaryImg.setRGB(x, y, gray[x][y]);
    }
}
ImageIO.write(binaryImg, "jpg", new File(destDir, sfile.getName()));

效果展示

原始驗證碼圖片 去噪後效果圖 去噪局部特寫

實戰建議

  1. 優先嘗試直接識別,失敗再啟用去噪預處理
  2. 中文識別需下載 chi_sim.traineddata 至 tessdata 目錄
  3. 生產環境建議封裝為服務,避免頻繁創建進程開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved