使用 Julia 实现验证码字符间距不均的精准识别
验证码系统通常会扰乱字符之间的标准间距,例如字符粘连或过度分散,从而干扰 OCR 引擎的整体识别能力。常规的端到端 OCR 对这类图像常出现误判或合并字符错误。本文将介绍一种经典而有效的方法:垂直投影分割法,结合 Julia 语言实现精准的字符提取与识别。
一、安装所需依赖
更多内容访问ttocr.com或联系1436423940
using Pkg
Pkg.add(["Images", "ImageIO", "ImageMorphology", "Tesseract"])
二、读取图像并二值化处理
using Images, ImageIO
img = load("uneven_spacing_captcha.png")
gray = Gray.(img)
简单二值化:黑底白字
binary = map(x -> x > 0.5 ? 0.0 : 1.0, gray)
save("binary.png", binary)
三、垂直投影分析
字符的竖向投影(每一列的白色像素数量)能帮助判断字符边界:
function vertical_projection(img)
h, w = size(img)
proj = zeros(Int, w)
for x in 1:w
proj[x] = sum(img[:, x] .> 0.5)
end
return proj
end
proj = vertical_projection(binary)
四、寻找字符边界
通过检测投影值从 0 到正值、正值到 0 的变化来确定字符区域:
function find_boundaries(proj)
in_char = false
bounds = []
for (x, val) in enumerate(proj)
if !in_char && val > 0
start = x
in_char = true
elseif in_char && val == 0
stop = x - 1
push!(bounds, (start, stop))
in_char = false
end
end
return bounds
end
bounds = find_boundaries(proj)
五、逐字符切割 + OCR 识别
using Tesseract
function recognize_characters(binary, bounds)
h, _ = size(binary)
result = ""
for (i, (x1, x2)) in enumerate(bounds)
char_img = binary[:, x1:x2]
fname = "char_$i.png"
save(fname, char_img)
ocr = TesseractOcr("eng")
set_image(ocr, fname)
char = strip(get_text(ocr))
result *= char
end
return result
end
text = recognize_characters(binary, bounds)
println("识别结果:", text)
浙公网安备 33010602011771号