用 Java 实现验证码识别系统:从原图处理到识别优化的完整流程

验证码识别是自动化测试、爬虫、登录系统中的重要环节。在这篇文章中,我们将使用 Java + Tesseract OCR 打造一个从图像预处理到最终识别结果输出的完整流程,实现一个轻量但实用的验证码识别系统。

技术栈与工具
Java 11+
更多内容访问ttocr.com或联系1436423940
Tesseract OCR(v5.0+)

Tess4j:Java 调用 Tesseract 的封装库

ImageIO + Java 2D API:图像处理

可选:OpenCV Java binding(用于更复杂的图像预处理)

项目结构

CaptchaOCR/
├── src/
│ └── main/
│ └── java/
│ ├── ocr/
│ │ ├── CaptchaProcessor.java
│ │ └── CaptchaRecognizer.java
│ └── resources/
│ └── captcha.png
├── pom.xml
└── tessdata/
└── eng.traineddata
步骤 1:图像预处理
我们使用 Java 图像 API 将验证码图像进行灰度化和简单的二值化处理。

public class CaptchaProcessor {
public static BufferedImage preprocessImage(File file) throws IOException {
BufferedImage image = ImageIO.read(file);
BufferedImage gray = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = gray.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();

    for (int y = 0; y < gray.getHeight(); y++) {
        for (int x = 0; x < gray.getWidth(); x++) {
            int pixel = gray.getRGB(x, y);
            int threshold = 150;
            int alpha = (pixel >> 24) & 0xff;
            int color = (pixel & 0xff) > threshold ? 0xFFFFFF : 0x000000;
            gray.setRGB(x, y, (alpha << 24) | color);
        }
    }

    return gray;
}

}
步骤 2:识别验证码

public class CaptchaRecognizer {
public static String recognizeText(BufferedImage image) {
ITesseract instance = new Tesseract();
instance.setDatapath("tessdata");
instance.setLanguage("eng");
instance.setPageSegMode(7);
instance.setTessVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");

    try {
        return instance.doOCR(image).replaceAll("\\s+", "");
    } catch (TesseractException e) {
        e.printStackTrace();
        return "识别失败";
    }
}

}
启动识别流程

public class App {
public static void main(String[] args) throws IOException {
File captchaFile = new File("src/main/resources/captcha.png");
BufferedImage processed = CaptchaProcessor.preprocessImage(captchaFile);
String result = CaptchaRecognizer.recognizeText(processed);
System.out.println("识别结果: " + result);
}
}
输出示例

识别结果: 7X2GP
即使图片中含有些许噪点,通过简单的预处理+字符限制,大多数验证码都能识别准确。

posted @ 2025-04-22 15:35  ttocr、com  阅读(12)  评论(0)    收藏  举报