使用 Java 和 Tesseract 实现验证码识别

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

  1. 环境准备
    安装 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 操作。
  1. 编写验证码识别代码
    接下来,编写一个简单的 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 的识别率,通常需要对验证码图像进行一些预处理操作,常见的图像预处理包括:

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

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

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

使用 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 的识别准确度。

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

  2. 字符白名单
    如果验证码只包含数字或字母,可以设置 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. 图像分割
对于多字符的验证码图像,图像分割是一个有效的策略。可以先将图像切割成单个字符的图像,然后分别进行识别。

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

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

bash

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

posted @   ttocr、com  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示