Java 实现验证码识别:结合 Tesseract OCR 解析图片
在自动化测试、数据采集等场景中,我们经常需要自动识别验证码(CAPTCHA)。本篇文章介绍如何使用 Java + Tesseract OCR 来解析验证码,并通过图像预处理提高识别准确率。
- 环境准备
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 依赖
Gradle 依赖
dependencies {
implementation 'net.sourceforge.tess4j:tess4j:4.5.5'
}
- 代码实现:验证码识别
下面是一个 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();
}
}
- 代码解析
3.1 图像预处理
为了提高 OCR 识别率,代码对图像进行了以下优化:
灰度化:去除颜色干扰,保留亮度信息。
二值化:转换为黑白图像,提高字符对比度。
字符过滤:仅识别 字母和数字,减少误识别。
tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
3.2 OCR 解析
使用 Tesseract 解析验证码文本:
tesseract.setPageSegMode(6); // 设定 PSM 模式(6 适用于单行文本)
String text = tesseract.doOCR(image).trim();
- 运行程序
确保 captcha.png 存在于代码目录中,然后执行:
mvn compile exec:java -Dexec.mainClass="CaptchaRecognizer"
或在 IDE 中直接运行 CaptchaRecognizer.main() 方法。
- 提高 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)
浙公网安备 33010602011771号