用 Go 语言识别英文数字验证码图像

验证码识别是自动化领域的一个经典问题,本文将演示如何使用 Go 语言结合 Tesseract OCR 来识别英文数字验证码。我们将使用图像处理库和调用 Tesseract 命令行工具,完成图像加载、处理和文本提取。

一、准备工作

  1. 安装 Tesseract OCR
    你需要先在系统中安装 Tesseract OCR。

Linux(Ubuntu/Debian)

sudo apt-get install tesseract-ocr
macOS(Homebrew)
更多内容访问ttocr.com或联系1436423940
brew install tesseract
Windows

https://github.com/tesseract-ocr/tesseract 下载并安装,确保将 Tesseract 可执行路径加入系统环境变量。

二、安装 Go 图像处理依赖
我们需要使用 Go 的图像处理标准库和一些工具包进行预处理。

创建项目文件夹并初始化模块:

mkdir go-captcha-ocr
cd go-captcha-ocr
go mod init go-captcha-ocr
创建 main.go 文件,并使用以下代码。

三、识别验证码图像

package main

import (
"fmt"
"image"
"image/color"
"image/png"
"os"
"os/exec"
)

func toGray(input string, output string) error {
// 打开图像文件
file, err := os.Open(input)
if err != nil {
return err
}
defer file.Close()

img, _, err := image.Decode(file)
if err != nil {
	return err
}

// 创建灰度图
bounds := img.Bounds()
grayImg := image.NewGray(bounds)

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		originalColor := img.At(x, y)
		grayColor := color.GrayModel.Convert(originalColor)
		grayImg.Set(x, y, grayColor)
	}
}

// 保存为新图像
outFile, err := os.Create(output)
if err != nil {
	return err
}
defer outFile.Close()

return png.Encode(outFile, grayImg)

}

func recognizeWithTesseract(imagePath string) (string, error) {
cmd := exec.Command("tesseract", imagePath, "stdout", "-l", "eng", "--psm", "7")
output, err := cmd.Output()
if err != nil {
return "", err
}
return string(output), nil
}

func main() {
inputPath := "captcha.png"
grayPath := "gray_captcha.png"

fmt.Println("预处理图像...")
err := toGray(inputPath, grayPath)
if err != nil {
	fmt.Println("图像处理失败:", err)
	return
}

fmt.Println("识别中...")
text, err := recognizeWithTesseract(grayPath)
if err != nil {
	fmt.Println("识别失败:", err)
	return
}

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

}
四、运行程序
确保当前目录中有一个 captcha.png 文件,然后运行程序:

go run main.go
输出可能如下:

预处理图像...
识别中...
识别结果: A7X3F
五、优化建议
可以使用开源 Go 图像处理库(如 github.com/disintegration/imaging)进行更复杂的操作(锐化、去噪等)。

对验证码背景复杂的情况,可结合边缘检测或二值化方法进行改进。

可将识别结果集成到 Web API,结合 Gin 或 Fiber 框架提供接口服务。

posted @ 2025-06-07 18:52  ttocr、com  阅读(19)  评论(0)    收藏  举报