使用 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)

posted @ 2025-07-12 21:54  ttocr、com  阅读(12)  评论(0)    收藏  举报