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

验证码(CAPTCHA)广泛应用于网站和应用程序中,用于防止自动化机器人提交表单或进行不当操作。虽然验证码设计的目的是为了阻止机器人,但在某些情况下,我们希望能够通过自动化的方式来识别这些验证码。本文将介绍如何使用 Java 和 Tesseract OCR 引擎来识别验证码。

  1. 环境准备
    安装 Tesseract OCR
    首先,你需要在你的计算机上安装 Tesseract OCR 引擎。根据操作系统的不同,安装方法也有所不同:

Windows:可以从 Tesseract GitHub 下载并安装。安装完成后,记下 Tesseract 可执行文件的路径。
Linux:使用以下命令进行安装:
更多内容访问ttocr.com或联系1436423940
sudo apt-get install tesseract-ocr
macOS:使用 Homebrew 安装:

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

tesseract --version
安装 Java 环境
确保你已经安装了 Java 开发环境。如果你尚未安装 Java,可以从 Oracle 官网 下载并安装。安装完成后,通过以下命令检查 Java 版本:

java -version
配置 Java 项目
在 Java 项目中,我们将使用 Tesseract OCR Java Wrapper 来调用 Tesseract OCR 引擎。你可以使用 Maven 或 Gradle 来管理依赖,或者直接下载 JAR 包。

如果你使用 Maven,可以在 pom.xml 中添加以下依赖:

net.sourceforge.tess4j tess4j 4.5.3 2. 编写验证码识别代码 以下是一个 Java 程序,展示了如何使用 Tesseract OCR 引擎识别验证码。我们使用 Tess4J(Tesseract Java Wrapper)来操作 Tesseract 引擎。

import net.sourceforge.tess4j.*;

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

public class CaptchaRecognition {

public static void main(String[] args) {
    // 设置 Tesseract 可执行文件路径
    File tessDataFolder = new File("C:/Program Files/Tesseract-OCR/tessdata");  // 修改为你的路径

    ITesseract instance = new Tesseract();  // 创建 Tesseract 实例
    instance.setLanguage("eng");  // 设置语言
    instance.setDatapath(tessDataFolder.getAbsolutePath());  // 设置语言数据路径

    try {
        // 读取验证码图像
        BufferedImage img = ImageIO.read(new File("captcha.png"));

        // 使用 Tesseract 识别图像中的文本
        String result = instance.doOCR(img);

        // 输出识别结果
        System.out.println("识别的验证码是: " + result.trim());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
3. 图像预处理
为了提高 OCR 识别的准确性,我们可以对验证码图像进行一些预处理。常见的预处理操作包括:

灰度化:将彩色图像转换为灰度图,减少颜色干扰。
二值化:将灰度图像转换为黑白图像,提高字符与背景的对比度。
去噪:通过滤波算法去除图像中的噪声,使文字更加清晰。
你可以使用 BufferedImage 类对图像进行处理,以下是一个简单的图像预处理示例:

import java.awt.Color;
import java.awt.image.BufferedImage;

public class ImagePreprocessing {

public static BufferedImage preprocessImage(BufferedImage img) {
    // 转为灰度图像
    BufferedImage grayImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
    for (int i = 0; i < img.getWidth(); i++) {
        for (int j = 0; j < img.getHeight(); j++) {
            Color color = new Color(img.getRGB(i, j));
            int gray = (int) (0.3 * color.getRed() + 0.59 * color.getGreen() + 0.11 * color.getBlue());
            grayImg.setRGB(i, j, new Color(gray, gray, gray).getRGB());
        }
    }

    // 二值化处理
    BufferedImage binarizedImg = new BufferedImage(grayImg.getWidth(), grayImg.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
    for (int i = 0; i < grayImg.getWidth(); i++) {
        for (int j = 0; j < grayImg.getHeight(); j++) {
            Color color = new Color(grayImg.getRGB(i, j));
            int threshold = 128;  // 阈值
            int binaryValue = (color.getRed() < threshold) ? 0 : 255;
            binarizedImg.setRGB(i, j, new Color(binaryValue, binaryValue, binaryValue).getRGB());
        }
    }

    return binarizedImg;
}

}
在主程序中,调用 preprocessImage() 函数对图像进行预处理:

BufferedImage img = ImageIO.read(new File("captcha.png"));
BufferedImage preprocessedImg = ImagePreprocessing.preprocessImage(img);
String result = instance.doOCR(preprocessedImg);
4. 提高识别准确率
尽管 Tesseract 是一个强大的 OCR 引擎,但在一些复杂的验证码场景下,识别可能并不完美。以下是一些常见的优化方法:

  1. 使用字符白名单
    如果验证码只包含数字或字母,可以通过设置字符白名单来限制 Tesseract 只识别这些字符,从而提高识别准确度:

instance.setTessVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
2. 调整 OCR 参数
Tesseract 提供了多种配置选项来优化识别过程。例如,你可以通过调整 psm(页面分割模式)来选择适合的页面布局模式:

psm 6:适用于单行文本。
psm 3:适用于标准文档布局。
设置参数的方法如下:

instance.setPageSegMode(ITesseract.PageSegMode.PSM_SINGLE_BLOCK);
3. 图像分割
对于包含多个字符的验证码,你可以将图像分割成多个小图像,分别进行 OCR 识别,然后组合结果。可以使用 OpenCV 或 Java 内置的图像处理工具来检测字符区域并分割图像。

  1. 去噪
    使用更强大的去噪算法,如高斯模糊,帮助去除背景噪声,突出字符部分。你也可以尝试更高级的去噪库来进行图像优化。

  2. 运行程序
    保存代码为 CaptchaRecognition.java,并确保你已经正确配置了 Tesseract 可执行文件的路径。将验证码图像(如 captcha.png)放在项目目录中。然后,在命令行中运行:

javac CaptchaRecognition.java
java CaptchaRecognition
成功运行后,输出类似于:

makefile

识别的验证码是: X9D2A

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