用 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
即使图片中含有些许噪点,通过简单的预处理+字符限制,大多数验证码都能识别准确。