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

用 Java 和 Tesseract 实现验证码识别

验证码(CAPTCHA)是为了防止自动化脚本进行恶意行为而设计的图像验证方式,通常用于网站注册、登录或提交表单时。虽然验证码的目标是阻止机器人,但在某些情况下,我们可能需要使用自动化工具来识别这些验证码。本文将介绍如何使用 Java 编程语言和 Tesseract OCR 引擎来识别验证码。

环境准备
安装 Tesseract OCR
首先,你需要在计算机上安装 Tesseract OCR 引擎。Tesseract 是一个开源的 OCR 引擎,广泛用于图像文字识别。安装方法如下:
Windows:可以从 Tesseract 官方 GitHub 下载 Windows 安装包。
Linux:在 Linux 系统上,使用以下命令安装:
bash
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:
bash

brew install tesseract
安装完成后,你可以在命令行中检查 Tesseract 是否安装成功:

bash

tesseract --version
安装 Java 和依赖库
你需要安装 JDK 和 Maven(或 Gradle)来管理项目依赖。确保你已安装 JDK 11 或更高版本,可以从 Oracle 官方网站 下载并安装。

然后,使用 Maven 来管理 Java 项目的依赖。在 pom.xml 中添加 Tesseract OCR 相关的依赖:

xml

net.sourceforge.tess4j tess4j 4.5.4 Tess4J 是 Tesseract OCR 的 Java 包装器,它提供了简单易用的接口,可以直接调用 Tesseract 进行 OCR 操作。
编写验证码识别代码
接下来,编写一个简单的 Java 程序,使用 Tesseract OCR 引擎识别验证码。
java

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.util.ImageHelper;

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

public class CaptchaRecognition {

public static void main(String[] args) {
// Tesseract 数据文件路径,确保路径指向 Tesseract 安装目录中的 tessdata 文件夹
String tessDataPath = "C:/Program Files/Tesseract-OCR/tessdata"; // 根据实际路径修改

// 初始化 Tesseract OCR 引擎
ITesseract tesseract = new Tesseract();
tesseract.setDatapath(tessDataPath); // 设置 tesseract 数据文件夹的路径
tesseract.setLanguage("eng"); // 设置语言为英文// 读取验证码图片
File imageFile = new File("captcha.png");try {// 读取图像并进行 OCR 识别BufferedImage image = ImageIO.read(imageFile);String result = tesseract.doOCR(image);// 输出识别结果System.out.println("识别的验证码是: " + result.trim());
} catch (IOException e) {e.printStackTrace();
} catch (Exception e) {e.printStackTrace();
}

}
}
代码说明:
Tesseract 数据文件路径:确保 Tesseract 的数据文件路径正确。Tesseract 安装后会在安装目录下生成一个 tessdata 文件夹,里面包含了 OCR 所需的语言数据文件。
设置 Tesseract 引擎:通过 Tesseract 类的实例来设置语言和数据文件路径。
读取验证码图像:使用 ImageIO.read() 读取验证码图像文件,然后通过 Tesseract 进行 OCR 识别。
3. 图像预处理
为了提高 OCR 的识别率,通常需要对验证码图像进行一些预处理操作,常见的图像预处理包括:

灰度化
将彩色图像转换为灰度图像,去除颜色对字符的干扰。

二值化
将灰度图像转换为黑白图像,增强文本与背景之间的对比度。

去噪
去除图像中的噪点,以便更清晰地识别字符。

使用 Tess4J 和 Java 的图像处理库,可以对图像进行处理。以下是一个使用 BufferedImage 对图像进行预处理的示例:

java

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

public class ImagePreprocessor {

public 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);
Graphics g = grayImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();// 二值化:设置阈值为 128
for (int i = 0; i < grayImage.getWidth(); i++) {for (int j = 0; j < grayImage.getHeight(); j++) {int rgb = grayImage.getRGB(i, j);int gray = (int) (0.2126 * ((rgb >> 16) & 0xFF) + 0.7152 * ((rgb >> 8) & 0xFF) + 0.0722 * (rgb & 0xFF));grayImage.setRGB(i, j, gray > 128 ? Color.WHITE.getRGB() : Color.BLACK.getRGB());}
}return grayImage;

}

public static void main(String[] args) {
try {
// 预处理图像
BufferedImage preprocessedImage = preprocessImage("captcha.png");

    // 保存预处理后的图像ImageIO.write(preprocessedImage, "png", new File("processed_captcha.png"));System.out.println("预处理后的图像已保存");} catch (IOException e) {e.printStackTrace();
}

}
}
代码说明:
灰度化:通过 Graphics 将原始图像绘制为灰度图像。
二值化:使用简单的阈值算法,将图像转换为黑白两种颜色。
保存图像:将处理后的图像保存为新文件。
在识别验证码前,先对图像进行预处理,能够大大提高 OCR 的识别准确度。

提高识别准确率
虽然 Tesseract 是一个强大的 OCR 引擎,但在一些复杂的验证码中,可能会出现识别错误。以下是一些常见的优化方法:

字符白名单
如果验证码只包含数字或字母,可以设置 Tesseract 只识别特定的字符,提高识别准确度。

java

tesseract.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 调整 OCR 配置
Tesseract 提供了多种配置选项,通过修改 psm(页面分割模式)和 oem(OCR 引擎模式)可以优化识别效果。

java

tesseract.setOcrEngineMode(ITesseract.OEM_LSTM_ONLY); // 使用 LSTM 引擎
tesseract.setPageSegMode(ITesseract.PageSegMode.PSM_SINGLE_BLOCK); // 设置页面分割模式
3. 图像分割
对于多字符的验证码图像,图像分割是一个有效的策略。可以先将图像切割成单个字符的图像,然后分别进行识别。

去噪与清晰化
通过使用图像处理算法(如高斯滤波、中值滤波等)来去噪,提升图像质量,进而提高识别率。

运行程序
保存代码为 CaptchaRecognition.java,并确保你的项目配置了 Tess4J 依赖。将验证码图像(例如 captcha.png)放在项目目录中。然后,使用以下命令编译并运行程序:

bash

javac CaptchaRecognition.java
java CaptchaRecognition
程序运行后,识别的验证码将输出在控制台上。

http://www.wxhsa.cn/company.asp?id=2888

相关文章:

  • Microsoft-Activation-Scripts,好用,记录一下。
  • 双重map 的赋值初始化
  • 0voice-1.4.1
  • 9.13 模拟赛 T3
  • Docker应用 - FileBrowser
  • AI踩坑之Nlog使用
  • 论文解读-《OpenGSL A Comprehensive Benchmark for Graph Structure Learning》 - zhang
  • Cmake介绍
  • Git 生成 ssh key
  • 基础篇:消息队列理论部分,另一种环境搭建Docker运行RabbitMQ
  • 项目案例作业1:学生信息管理系统(面向对象初步接触)
  • P1097 合唱队形
  • 一生一芯学习:pa2.1 RTFM
  • Linux网络:初识网络 - 详解
  • 20250909比赛总结
  • 又寸入生白勺司烤
  • Ubuntu 安装 GIPM
  • 手动下载vscode扩展的方法
  • GAS_Aura-Aura Projectile
  • CF1583F Defender of Childhood Dreams
  • scrollArea无法滚动
  • 时间序列分析(1)
  • 一行代码没写,做了一个小程序
  • 【置顶】欢迎来到 ziyaojia 的主页
  • copyparty 是一款使用单个 Python 材料实现的内网文件共享软件,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
  • ZYNQ Ultrascale+系列部署yolo v10(暂定,若过于艰难则考虑降级或FQ)
  • 【EF Core】再谈普通实体关系与 Owned 关系的区别
  • qoj6104 Building Bombing
  • 必知必会:使用serializers.Serializer在views.py视图文件中序列化和反序列化过程的开发模板
  • Cursor小程序实战五:Cursor对接微信两大核心问题