使用 Node.js 实现英文数字验证码识别完整指南
验证码是常见的防机器人机制,尤其是在登录、注册、评论等功能中。虽然许多验证码使用图像扭曲和干扰线来阻止 OCR 识别,但对于常见的英文数字验证码,我们仍可以通过合适的图像处理技术和 OCR 引擎实现识别。
本文将以 Node.js 为基础,配合 Tesseract OCR 引擎和图像处理库,搭建一个英文数字验证码识别系统。你将学习如何读取图像、处理验证码、调用 OCR 引擎并提取验证码字符。
一、安装环境和依赖
安装 Node.js
请确保你已经安装了 Node.js。可以从官网 https://nodejs.org 下载并安装最新版本。
安装 Tesseract OCR
macOS:
brew install tesseract
Ubuntu / Debian:
sudo apt install tesseract-ocr
Windows:从 https://github.com/tesseract-ocr/tesseract 安装程序并配置环境变量。
安装项目依赖库
进入你的项目目录,运行以下命令:
npm init -y
npm install tesseract.js jimp
tesseract.js 是 Tesseract 的 JavaScript 封装,可在 Node.js 中直接调用
jimp 是图像处理库,用于对验证码图像进行灰度、缩放、滤波等处理
二、编写验证码识别脚本
创建 captcha_ocr.js 文件,并编写以下代码:
const Tesseract = require("tesseract.js");
const Jimp = require("jimp");
// 图像路径
const imagePath = "captcha.png";
// 图像预处理函数
async function preprocessImage(imagePath) {
const image = await Jimp.read(imagePath);
// 转为灰度图
image.grayscale();
// 提高对比度(可选)
image.contrast(1);
// 去噪(使用模糊模拟降噪)
image.blur(1);
// 保存预处理后的图像(可选)
await image.writeAsync("processed_captcha.png");
return image;
}
// OCR 识别函数
async function recognizeCaptcha() {
const image = await preprocessImage(imagePath);
const { data: { text } } = await Tesseract.recognize(
await image.getBufferAsync(Jimp.MIME_PNG),
'eng',
{
tessedit_char_whitelist: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
psm: 8,
}
);
console.log("识别结果:", text.trim());
}
recognizeCaptcha();
三、说明与原理解析
图像预处理流程
我们使用 Jimp 进行了以下图像处理:
灰度化:去除颜色干扰,仅保留亮度信息
对比增强:让字符与背景的对比更明显
模糊降噪:模糊可以抹平边缘噪点,帮助提升 OCR 准确率
OCR 配置参数说明
tessedit_char_whitelist:限制识别字符范围为大写字母和数字
psm: 8:指定图片是一个单词,有助于提高验证码场景下的识别准确率
四、运行识别脚本
将目标验证码图像命名为 captcha.png,放在脚本同一目录下,执行以下命令:
node captcha_ocr.js
控制台会输出类似如下结果:
识别结果: C4NBZ
浙公网安备 33010602011771号