Go 语言与 Tesseract OCR 实现验证码识别

验证码(CAPTCHA)广泛用于验证用户身份,防止自动化攻击。然而,在合法的自动化测试、数据采集等场景下,我们可能需要对验证码进行自动识别。本教程将介绍如何使用 Go 语言与 Tesseract OCR 进行验证码解析,并探讨优化识别效果的方法。

  1. 环境搭建
    在开始编写代码之前,我们需要安装 Go 语言和 Tesseract OCR 引擎,并配置相关依赖。

1.1 安装 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 是否正确安装:

tesseract --version
1.3 安装 Go 语言 OCR 依赖
在 Go 语言中,我们可以使用 gosseract 这个库来调用 Tesseract OCR。安装方式如下:

go get -u github.com/otiai10/gosseract/v2
2. 编写验证码识别程序
下面,我们将使用 Go 语言编写一个简单的验证码解析程序。

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 > 130 { // 适当调整阈值
			binaryImg.Set(x, y, color.White)
		} else {
			binaryImg.Set(x, y, color.Black)
		}
	}
}

// 适当放大图片,提高 OCR 识别精度
resizedImg := resize.Resize(250, 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 预处理图片
为了提高验证码的识别准确率,我们对图像进行了如下处理:

灰度化:将彩色验证码转换为灰度图,减少干扰信息。

二值化:通过阈值处理,将图像转换为黑白,提高字符对比度。

调整尺寸:适当放大图像,便于 OCR 识别字符。

3.2 OCR 识别流程
gosseract.NewClient():创建 Tesseract OCR 客户端。

client.SetImage():指定待识别的图片路径。

client.Text():调用 OCR 识别文本内容。

  1. 运行程序
    确保 captcha.png 验证码图片位于程序目录下,然后运行:

go run captcha_solver.go
执行后,程序将输出识别出的验证码内容。

  1. 提高验证码识别准确率的方法
    5.1 选择适合的 Tesseract 识别模式
    Tesseract 提供多种页面分割模式(PSM),适用于不同类型的文本布局。对于验证码,我们可以使用 PSM 6(假设验证码是单行文本):

client.SetVariable("tessedit_pageseg_mode", "6")
5.2 限制识别字符集
如果验证码只包含数字,可以让 Tesseract 只识别数字,从而减少干扰:

client.SetVariable("tessedit_char_whitelist", "0123456789")
5.3 进一步优化图像
去除噪点:可以使用中值滤波等方法减少背景干扰。

字符切割:如果验证码字符粘连,可以尝试分割字符,提高识别率。

5.4 结合深度学习 OCR
对于复杂验证码,Tesseract 可能无法准确识别,可以尝试使用基于深度学习的 OCR 方案,如:

EasyOCR

PaddleOCR

这些模型通常可以处理扭曲、干扰较多的验证码。

posted @ 2025-04-05 22:02  ttocr、com  阅读(61)  评论(0)    收藏  举报