使用 Go 语言结合 Tesseract OCR 进行验证码识别

E_topia

关注

阅读 27

04-04 18:00

验证码(CAPTCHA)是一种常见的安全机制,主要用于防止自动化脚本的恶意操作。然而,在自动化测试、数据采集等合法需求下,我们可能需要自动解析验证码。本教程将介绍如何使用 Go 语言和 Tesseract OCR 解析验证码,并探讨提高识别准确率的方法。

  1. 环境配置 在开始编写代码前,我们需要安装 Go 语言和 Tesseract OCR 引擎。

1.1 安装 Go 语言 如果尚未安装 Go,可前往 Go 官网 下载并安装最新版本。安装完成后,可运行以下命令检查安装情况:

go version 1.2 安装 Tesseract OCR 不同操作系统的安装方式如下:

Windows:从 Tesseract GitHub 下载并安装。

Linux(Ubuntu):

sudo apt update sudo apt install tesseract-ocr macOS(Homebrew 安装):

brew install tesseract 安装完成后,执行以下命令确认安装成功:

tesseract --version 1.3 安装 Go 语言 Tesseract 库 为了在 Go 代码中使用 Tesseract,我们需要安装 gosseract 库:

go get -u github.com/otiai10/gosseract/v2 2. 实现验证码解析 2.1 代码示例

package main

import ( "fmt" "log" "os" "image" "image/color"

"github.com/otiai10/gosseract/v2"
"github.com/nfnt/resize"
"github.com/disintegration/imaging"

)

func main() { // 指定验证码图片路径 imagePath := "captcha.png"

// 打开图片文件
imgFile, err := os.Open(imagePath)
if err != nil {
	log.Fatalf("无法打开图片: %v", err)
}
defer imgFile.Close()

// 解析图片
img, _, err := image.Decode(imgFile)
if err != nil {
	log.Fatalf("解析图片失败: %v", err)
}

// 转换为灰度图
grayImg := imaging.Grayscale(img)

// 进行二值化处理
binaryImg := image.NewRGBA(grayImg.Bounds())
for y := 0; y < grayImg.Bounds().Dy(); y++ {
	for x := 0; x < grayImg.Bounds().Dx(); x++ {
		pixel := color.GrayModel.Convert(grayImg.At(x, y)).(color.Gray)
		if pixel.Y > 140 { // 适当调整阈值
			binaryImg.Set(x, y, color.White)
		} else {
			binaryImg.Set(x, y, color.Black)
		}
	}
}

// 适当调整图片大小,提高 OCR 识别率
resizedImg := resize.Resize(200, 0, binaryImg, resize.Lanczos3)

// 保存处理后的图片(可选)
outputPath := "processed_captcha.png"
outFile, err := os.Create(outputPath)
if err != nil {
	log.Fatalf("无法创建输出图片: %v", err)
}
defer outFile.Close()
imaging.Encode(outFile, resizedImg, imaging.PNG)

// OCR 识别
client := gosseract.NewClient()
defer client.Close()

client.SetImage(outputPath)

// 获取识别结果
text, err := client.Text()
if err != nil {
	log.Fatalf("OCR 识别失败: %v", err)
}

// 输出识别结果
fmt.Printf("验证码内容: %s\n", text)

} 3. 代码解析 3.1 预处理图片 为了提高识别率,我们对验证码图片进行如下优化处理:

灰度化:将彩色图片转换为灰度,减少颜色干扰。

二值化:根据像素亮度,将图像转换为黑白,提高字符对比度。

调整大小:放大字符,帮助 Tesseract 更准确地识别内容。

3.2 OCR 识别 gosseract.NewClient() 创建 OCR 识别客户端。

client.SetImage() 设置处理后的验证码图片。

client.Text() 获取识别出的验证码字符串。

  1. 运行程序 将代码保存为 captcha_reader.go,并确保 captcha.png 文件位于同一目录。运行命令:

go run captcha_reader.go 程序会解析验证码并输出识别结果。

  1. 如何提高验证码识别准确率 对于复杂验证码,可以尝试以下优化方案:

5.1 选择合适的 OCR 识别模式 Tesseract 提供多种页面分割模式(PSM),针对验证码推荐使用 PSM 6(假设输入是单行文本):

client.SetVariable("tessedit_pageseg_mode", "6") 5.2 限制识别字符集 如果验证码仅包含数字,可让 Tesseract 只识别数字,提高准确率:

client.SetLanguage("eng") client.SetVariable("tessedit_char_whitelist", "0123456789") 5.3 进一步优化图片 降噪:使用滤波算法去除背景干扰。

字符切割:对于粘连字符,可进行单字符切割,提高识别率。

5.4 结合深度学习模型 如果 Tesseract 识别效果不佳,可尝试基于深度学习的 OCR 方案,如:

EasyOCR

PaddleOCR

这些模型通常可以处理扭曲、复杂背景的验证码。

精彩评论(0)

0 0 举报