Go 识别验证码:Tesseract OCR 的实践与优化

验证码(CAPTCHA)广泛用于网站和应用中,以防止恶意机器人自动提交数据。然而,在自动化测试、数据处理等场景下,我们可能需要自动识别验证码。本文介绍如何使用 Go 语言 结合 Tesseract OCR 解析验证码,并优化识别的准确度。

  1. 环境准备

在开始编码前,我们需要安装 Go 语言 和 Tesseract OCR,并配置 OCR 库 gosseract。

1.1 安装 Go 语言

如果未安装 Go,可前往 Go 官方网站
下载并安装最新版本。安装完成后,运行以下命令检查是否安装成功:
更多内容访问ttocr.com或联系1436423940
go version

1.2 安装 Tesseract OCR

Tesseract 是一个强大的开源 OCR 引擎,支持多种语言和字符识别。

Windows 用户

访问 Tesseract 官方 GitHub
下载 Windows 安装包。

按照安装向导完成安装,并配置环境变量,使 tesseract 命令可在终端中运行。

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

  1. 编写验证码识别代码

下面的 Go 代码示例展示了如何读取验证码图像,进行预处理,并使用 Tesseract OCR 进行解析。

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 > 128 {
			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)

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

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

}

  1. 代码解析
    3.1 图像预处理

为了提高 OCR 识别准确率,我们对验证码进行了以下优化处理:

转换为灰度图像:去除颜色干扰,使 OCR 识别更加稳定。

二值化处理:将图像转换为黑白,提高字符清晰度,减少背景噪声。

调整大小(可选):通过 resize.Resize() 放大图像,使 OCR 更容易识别小字符。

3.2 OCR 解析

通过 gosseract.NewClient() 创建 OCR 客户端。

使用 client.SetImage() 指定待识别的验证码图像。

调用 client.Text() 进行 OCR 解析,并返回识别的验证码内容。

  1. 运行程序

将代码保存为 captcha_reader.go,并确保 captcha.png 图片位于同一目录,然后运行:

go run captcha_reader.go

程序将自动加载验证码图片,进行预处理,并输出识别的验证码文本。

  1. 提高 OCR 识别准确率

如果验证码较复杂,Tesseract 可能无法精准识别,可以尝试以下优化方法:

5.1 设置 Tesseract PSM 模式

Tesseract 提供不同的页面分割模式(PSM),验证码通常是一行文本,因此可以使用 PSM 6:

client.SetVariable("tessedit_pageseg_mode", "6")

5.2 选择合适的 OCR 语言

如果验证码只包含英文字母和数字,可以指定 eng(英语)或 osd(光学字符方向检测):

client.SetLanguage("eng", "osd")

5.3 进一步优化图像

去除噪点:可使用 高斯模糊 或 形态学处理 过滤背景干扰。

字符分割:如果验证码字符相互粘连,可以尝试分割算法,提高单字符识别率。

5.4 使用深度学习 OCR 方案

如果 Tesseract 识别效果不佳,可以考虑深度学习 OCR,例如:

EasyOCR

PaddleOCR

posted @ 2025-09-07 09:44  ttocr、com  阅读(28)  评论(0)    收藏  举报