用 Go 解锁验证码:OCR 识别实践指南

验证码常常出现在登录、注册或评论系统中,旨在阻止自动化操作。然而,在某些自动化流程(如自动化测试或爬虫开发)中,我们需要“读懂”这些验证码。这篇文章将带你使用 Go 语言结合 Tesseract OCR 实现一个简单但实用的验证码识别工具。

🛠️ 环境配置
安装 Go 开发环境
请从 https://go.dev/dl/ 下载并安装最新版本的 Go,安装后通过命令行验证是否成功:

go version
安装 Tesseract OCR 引擎
Linux (Ubuntu):
更多内容访问ttocr.com或联系1436423940
sudo apt update
sudo apt install tesseract-ocr
macOS (Homebrew):

brew install tesseract
Windows:
从 Tesseract Releases 页面下载适用于 Windows 的安装包并安装。

安装完毕后,使用命令验证:

tesseract --version
添加 Go 的 Tesseract 绑定
我们使用 gosseract 第三方库,它为 Tesseract 提供了 Go 接口:

go get github.com/otiai10/gosseract/v2
💡 核心实现:识别验证码图片
以下是完整的验证码识别代码,涵盖图像加载、预处理和 OCR 步骤:

package main

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

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

)

func main() {
input := "captcha.png" // 验证码原图路径
output := "cleaned_captcha.png" // 处理后的图像输出路径

// 加载图像
file, err := os.Open(input)
if err != nil {
	log.Fatalf("图像文件打开失败: %v", err)
}
defer file.Close()

srcImg, _, err := image.Decode(file)
if err != nil {
	log.Fatalf("图像解析失败: %v", err)
}

// 转灰度
gray := imaging.Grayscale(srcImg)

// 二值化
binary := image.NewRGBA(gray.Bounds())
for y := 0; y < gray.Bounds().Dy(); y++ {
	for x := 0; x < gray.Bounds().Dx(); x++ {
		pixel := color.GrayModel.Convert(gray.At(x, y)).(color.Gray)
		if pixel.Y > 130 {
			binary.Set(x, y, color.White)
		} else {
			binary.Set(x, y, color.Black)
		}
	}
}

// 图像放大(可选)
resized := resize.Resize(300, 0, binary, resize.Lanczos3)

// 输出处理后的图像
outFile, err := os.Create(output)
if err != nil {
	log.Fatalf("图像保存失败: %v", err)
}
defer outFile.Close()
imaging.Encode(outFile, resized, imaging.PNG)

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

client.SetImage(output)

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

fmt.Println("识别结果:", text)

}
🧠 小贴士:优化识别效果
Tesseract 的识别精度和图像质量紧密相关。以下是几种增强识别准确率的技巧:

✅ 白名单字符
只让 Tesseract 识别特定字符,例如验证码只包含数字时:

client.SetVariable("tessedit_char_whitelist", "0123456789")
✅ 设置分割模式
使用特定页面结构模式让识别更精准,例如 PSM 7(单行文本):

client.SetPageSegMode(gosseract.PSM_SINGLE_LINE)
✅ 加强图像对比度
灰度化 + 二值化是关键,如果验证码模糊,可以尝试图像锐化或滤波降噪。

🧪 实战验证
准备一张验证码图片命名为 captcha.png

将上面的 Go 程序保存为 main.go

在终端中运行程序:

go run main.go
你将看到输出结果类似于:

识别结果: 7K8HD
🔍 进阶建议
对于含有旋转、扭曲或噪声的验证码,Tesseract 效果可能有限,可以考虑使用深度学习 OCR(如 EasyOCR、PaddleOCR)。

对图像做中值滤波(中值滤波器)能有效去除干扰线。

可将多个验证码图片组成数据集,训练定制模型提升识别率。

posted @ 2025-04-08 17:56  ttocr、com  阅读(66)  评论(0)    收藏  举报