Go 实现验证码识别:从图像预处理到结果输出

一、前言
验证码识别虽然是图像识别的一个基础应用场景,但其背后涉及图像处理、特征提取和模式识别等多个环节。Go 语言虽然不是图像处理的主力军,但其高效的并发和良好的生态也能胜任轻量级验证码识别任务。本文将使用 Go 来实现一个从图像预处理到字符分割的基础验证码识别工具。

二、开发环境与依赖库
使用以下依赖:

image, image/color, image/png:标准图像处理库
更多内容访问ttocr.com或联系1436423940
github.com/disintegration/imaging:简化图像处理操作

os, fmt, log:标准库

安装 imaging 库:

go get github.com/disintegration/imaging
三、识别思路
验证码识别的主要流程如下:

加载图像

转换为灰度图

二值化处理

水平方向切割字符

模拟识别(或输出字符图像)

四、核心代码实现

  1. 加载图像并灰度化

func loadAndGray(path string) (*image.Gray, error) {
src, err := imaging.Open(path)
if err != nil {
return nil, err
}

gray := imaging.Grayscale(src)
bounds := gray.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++ {
		grayImg.Set(x, y, gray.At(x, y))
	}
}
return grayImg, nil

}
2. 简单二值化

func binarize(img *image.Gray, threshold uint8) *image.Gray {
bounds := img.Bounds()
dst := image.NewGray(bounds)

for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		c := img.GrayAt(x, y).Y
		if c < threshold {
			dst.SetGray(x, y, color.Gray{Y: 0})
		} else {
			dst.SetGray(x, y, color.Gray{Y: 255})
		}
	}
}
return dst

}
3. 字符切割(固定宽度)

func splitFixed(img *image.Gray, count int) []image.Image {
bounds := img.Bounds()
width := bounds.Dx() / count
height := bounds.Dy()

var result []image.Image
for i := 0; i < count; i++ {
	rect := image.Rect(0, 0, width, height)
	charImg := image.NewGray(rect)

	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			srcX := i*width + x
			charImg.SetGray(x, y, img.GrayAt(srcX, y))
		}
	}
	result = append(result, charImg)
}
return result

}
4. 主函数

func main() {
img, err := loadAndGray("captcha.png")
if err != nil {
log.Fatal(err)
}

bin := binarize(img, 150)
chars := splitFixed(bin, 4)

for i, ch := range chars {
	filename := fmt.Sprintf("char_%d.png", i)
	err := imaging.Save(ch, filename)
	if err != nil {
		log.Printf("保存失败: %v", err)
	} else {
		fmt.Println("已保存:", filename)
	}
}

}

posted @ 2025-06-05 13:48  ttocr、com  阅读(29)  评论(0)    收藏  举报