Java 实现验证码识别:结合 Tesseract OCR 解析图片

在自动化测试、数据采集等场景中,我们经常需要自动识别验证码(CAPTCHA)。本篇文章介绍如何使用 Java + Tesseract OCR 来解析验证码,并通过图像预处理提高识别准确率。

  1. 环境准备
    1.1 安装 Tesseract OCR

在使用 Java 解析验证码前,首先需要安装 Tesseract OCR。
更多内容访问ttocr.com或联系1436423940
Windows 用户

从 Tesseract OCR GitHub
下载并安装。

将 C:\Program Files\Tesseract-OCR\ 添加到 环境变量 PATH。

Linux/macOS 用户

Ubuntu

sudo apt update && sudo apt install tesseract-ocr

macOS(使用 Homebrew)

brew install tesseract

安装完成后,检查是否成功:

tesseract --version

1.2 创建 Java 项目并添加依赖

在 Java 项目中,需要使用 Tess4J 作为 Tesseract 的 Java 封装库。

Maven 依赖


net.sourceforge.tess4j
tess4j
4.5.5

Gradle 依赖
dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}

  1. 代码实现:验证码识别

下面是一个 Java 代码示例,展示如何加载验证码图像、进行预处理,并使用 Tesseract OCR 解析验证码。

2.1 代码示例
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class CaptchaRecognizer {

// 指定 Tesseract 安装路径(Windows 用户需要配置)
private static final String TESSERACT_PATH = "C:\\Program Files\\Tesseract-OCR\\";

public static void main(String[] args) {
    String imagePath = "captcha.png"; // 替换为你的验证码图片路径
    try {
        BufferedImage image = preprocessImage(imagePath);
        String result = recognizeCaptcha(image);
        System.out.println("识别出的验证码: " + result);
    } catch (IOException | TesseractException e) {
        e.printStackTrace();
    }
}

/**
 * 预处理验证码图片,提高 OCR 识别率
 */
private static BufferedImage preprocessImage(String imagePath) throws IOException {
    BufferedImage image = ImageIO.read(new File(imagePath));

    // 转换为灰度图像
    BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    Graphics2D g = grayImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();

    // 二值化(手动设定阈值)
    for (int y = 0; y < grayImage.getHeight(); y++) {
        for (int x = 0; x < grayImage.getWidth(); x++) {
            int rgb = grayImage.getRGB(x, y);
            int gray = (rgb >> 16) & 0xFF;
            gray = (gray > 128) ? 255 : 0; // 设定阈值进行二值化
            grayImage.setRGB(x, y, new Color(gray, gray, gray).getRGB());
        }
    }

    // 保存处理后的图像(可选)
    ImageIO.write(grayImage, "png", new File("processed_captcha.png"));
    return grayImage;
}

/**
 * 识别验证码
 */
private static String recognizeCaptcha(BufferedImage image) throws TesseractException {
    ITesseract tesseract = new Tesseract();
    tesseract.setDatapath(TESSERACT_PATH + "tessdata"); // 设置 OCR 语言数据路径
    tesseract.setLanguage("eng"); // 识别英语字符
    tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); // 只识别这些字符
    tesseract.setPageSegMode(6); // 设定页面分割模式(PSM 6 适用于验证码)
    return tesseract.doOCR(image).trim();
}

}

  1. 代码解析
    3.1 图像预处理

为了提高 OCR 识别率,代码对图像进行了以下优化:

灰度化:去除颜色干扰,保留亮度信息。

二值化:转换为黑白图像,提高字符对比度。

字符过滤:仅识别 字母和数字,减少误识别。

tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");

3.2 OCR 解析

使用 Tesseract 解析验证码文本:

tesseract.setPageSegMode(6); // 设定 PSM 模式(6 适用于单行文本)
String text = tesseract.doOCR(image).trim();

  1. 运行程序

确保 captcha.png 存在于代码目录中,然后执行:

mvn compile exec:java -Dexec.mainClass="CaptchaRecognizer"

或在 IDE 中直接运行 CaptchaRecognizer.main() 方法。

  1. 提高 OCR 识别准确率
    5.1 选择合适的 PSM 模式

Tesseract 提供多种 页面分割模式(PSM),验证码通常使用 PSM 6 或 7:

tesseract.setPageSegMode(6);

5.2 进一步图像优化

去噪点:可使用 OpenCV 进一步去除背景干扰。

字符分割:对于粘连字符,可尝试 轮廓检测 + 投影分割。

5.3 采用深度学习 OCR

如果 Tesseract 识别率不高,可使用 深度学习 OCR,如:

EasyOCR(Python)

PaddleOCR(Python)

Google Vision API(云端 OCR)

posted @ 2025-09-07 19:30  ttocr、com  阅读(18)  评论(0)    收藏  举报