当前位置: 首页 > news >正文

用 Java 和 Tesseract 进行验证码识别:基础实现与优化

验证码(CAPTCHA)是防止自动化攻击的常见手段。然而,在某些场景下,如自动化测试或者爬虫平台,可能需要识别和处理验证码图像。本文将指导你如何使用 Java 和 Tesseract OCR(光学字符识别)库来实现验证码识别,并提供一些优化建议。

🧰 环境准备

安装 Java 和 Maven:
确保 Java 和 Maven 已经安装好。可以通过命令行检查 Java 和 Maven 版本:

java -version
mvn -v
更多内容访问ttocr.com或联系1436423940

安装 Tesseract OCR:
Tesseract 是开源的 OCR 引擎,用于提取图像中的文本。

Windows 用户: 下载并安装 Tesseract,配置环境变量。

Linux 用户(Ubuntu):

sudo apt install tesseract-ocr

macOS 用户:

brew install tesseract

添加 Maven 依赖:

在你的 pom.xml 中添加以下依赖来使用 Tesseract:

net.sourceforge.tess4jtess4j5.4.0

🧩 核心代码实现

  1. 创建 OCR 服务
    import net.sourceforge.tess4j.*;
    import java.awt.image.BufferedImage;
    import javax.imageio.ImageIO;
    import java.io.File;
    import java.io.IOException;

public class OcrService {

public static String recognizeCaptcha(File imageFile) {ITesseract instance = new Tesseract();instance.setDatapath("tessdata");  // Tesseract OCR 数据路径instance.setLanguage("eng");        // 选择语言instance.setTessVariable("tessedit_pageseg_mode", "6");  // 单行文本模式try {BufferedImage image = ImageIO.read(imageFile);  // 读取图片文件return instance.doOCR(image).trim();            // 执行 OCR 识别} catch (TesseractException | IOException e) {e.printStackTrace();return "识别失败";}
}

}

  1. 创建控制器接口
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;

import java.io.File;

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

@PostMapping("/recognize")
public String recognizeCaptcha(@RequestParam("file") MultipartFile file) throws Exception {// 临时保存文件File tempFile = File.createTempFile("captcha_", ".png");file.transferTo(tempFile);// 调用 OCR 服务进行识别String result = OcrService.recognizeCaptcha(tempFile);// 删除临时文件tempFile.delete();return "识别结果: " + result;
}

}

🛠️ 图像预处理提升识别准确度

在某些情况下,验证码图像包含噪点或较低的对比度,直接进行 OCR 识别可能不够理想。你可以对图像进行预处理来提升识别准确性。

  1. 灰度化与二值化处理
    import java.awt.Color;
    import java.awt.image.BufferedImage;

public class ImagePreprocessor {

public static BufferedImage preprocessImage(BufferedImage image) {// 灰度化处理BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);for (int x = 0; x < image.getWidth(); x++) {for (int y = 0; y < image.getHeight(); y++) {Color color = new Color(image.getRGB(x, y));int gray = (int)(0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue());grayImage.setRGB(x, y, new Color(gray, gray, gray).getRGB());}}// 二值化处理BufferedImage binaryImage = new BufferedImage(grayImage.getWidth(), grayImage.getHeight(), BufferedImage.TYPE_BYTE_BINARY);for (int x = 0; x < grayImage.getWidth(); x++) {for (int y = 0; y < grayImage.getHeight(); y++) {int rgb = grayImage.getRGB(x, y);int value = rgb == Color.BLACK.getRGB() ? 0 : 255;binaryImage.setRGB(x, y, new Color(value, value, value).getRGB());}}return binaryImage;
}

}

  1. 在 OcrService 中集成图像预处理
    public static String recognizeCaptcha(File imageFile) {
    ITesseract instance = new Tesseract();
    instance.setDatapath("tessdata");
    instance.setLanguage("eng");
    instance.setTessVariable("tessedit_pageseg_mode", "6");

    try {
    BufferedImage image = ImageIO.read(imageFile);
    BufferedImage processedImage = ImagePreprocessor.preprocessImage(image); // 预处理图像
    return instance.doOCR(processedImage).trim(); // 执行 OCR
    } catch (TesseractException | IOException e) {
    e.printStackTrace();
    return "识别失败";
    }
    }

📈 提升识别率的其他方法

训练自定义语言模型:
如果你的验证码中包含特定字体或字符,可以通过训练 Tesseract 来识别特定类型的验证码。你可以通过 Tesseract 提供的训练工具自定义语言模型。

调整 tessedit_pageseg_mode:
Tesseract 提供了多个页面分割模式(PSM)。例如,如果验证码是单行文本,使用 tessedit_pageseg_mode=6 可以提高识别准确率。

去噪声与字符分割:
如果验证码字符之间存在粘连或噪声,可以使用图像处理技术(如高斯模糊或形态学运算)对图像进行进一步清理。

使用深度学习模型:
如果 Tesseract 无法满足需求,可以考虑基于深度学习的 OCR 方案,如 EasyOCR 或 PaddleOCR,它们在复杂验证码识别中通常能提供更好的准确度。

http://www.hskmm.com/?act=detail&tid=16086

相关文章:

  • Java第二次实验
  • 详细介绍:【2025PolarCTF秋季个人赛】WEB方向wp
  • 英语_阅读
  • Nuget安装以及西门子PLC通信
  • 每日反思(2025_09_24)
  • 安装Flask库
  • 《新概念英语》在线朗读,单句点读,随时随地在线学习。
  • P10004 [集训队互测 2023] Permutation Counting 2
  • 毕赤酵母细胞工厂升级:CRISPR 技术破局传统局限,解锁多基因代谢工程新可能
  • 日总结 7
  • 读书笔记:OpenPBR 规范(1)
  • 9月24号
  • linux系统下nginx网站ssl证书自动续签
  • C#使用Bitmap操作图像的基础方法
  • 知识学报:位运算(1)
  • CentOS 7 下 Kubernetes 集群搭建与配置指南
  • 2024/9/24
  • Git 工作树 (worktree)、合并 (merge) 流程、拉取请求 (PR) 机制,以及基线分支概念
  • 【HD300I 】基于昇腾 310P 的全国产化智能计算模组
  • 《密码系统设计》第三周
  • 详细介绍:Cloudflare 推出 GenAI 安全工具,守护企业数据
  • 论小学教师转移矛盾的方法——以“小组连坐制”为例
  • 9.24
  • 编译器与链接器--通俗解释
  • WPF路由事件
  • VS2022 不支持 .NET Framework 4.0 的解决方法
  • 【Origin】数据分析后的图,提取到外部图表
  • P3747 [六省联考 2017] 相逢是问候
  • B1I、B1C、B2a双频北斗卫星定位芯片AT9850B-F7N-22
  • Wi-Fi技能——网络安全