使用 Julia 的投影轮廓图技术分割验证码字符

验证码图像中的字符往往并不总是清晰独立的。常见的粘连、错位、背景噪声使得字符识别变得困难。通过对图像进行垂直投影,我们可以有效分析字符间的空隙,从而实现字符的自动分割。本文介绍如何使用 Julia 实现投影轮廓图技术来切割验证码中的字符。

一、环境准备
所需依赖:
更多内容访问ttocr.com或联系1436423940
using Pkg
Pkg.add(["Images", "ImageIO", "ImageMorphology", "Tesseract"])
二、读取并二值化验证码图像

using Images, ImageIO

img = load("captcha.png")
gray = Gray.(img)
binary = map(x -> x > 0.5 ? 1.0 : 0.0, gray)
save("binary.png", binary)
三、计算垂直投影图(列像素值求和)

function vertical_projection(binary_img)
return vec(sum(binary_img, dims=1)) # 列方向求和
end

projection = vertical_projection(binary)
四、可视化投影图(辅助理解)

using Plots

plot(projection, title="Vertical Projection", xlabel="Column", ylabel="Sum")
在投影图中,谷值(投影和较小的区域)表示字符之间的间隙。

五、基于投影的字符切割

function split_characters(binary_img; threshold=5)
proj = vertical_projection(binary_img)
w = length(proj)
in_char = false
segments = []

for i in 1:w
    if proj[i] > threshold && !in_char
        start_col = i
        in_char = true
    elseif proj[i] <= threshold && in_char
        end_col = i
        push!(segments, (start_col, end_col))
        in_char = false
    end
end

return segments

end

char_regions = split_characters(binary)
六、保存并识别每个字符区域

using Tesseract

function extract_and_ocr(binary_img, regions)
results = ""
for (i, (x1, x2)) in enumerate(regions)
char_img = binary_img[:, x1:x2]
path = "char_$i.png"
save(path, char_img)

    ocr = TesseractOcr("eng")
    set_image(ocr, path)
    c = strip(get_text(ocr))
    results *= c
end
return results

end

text = extract_and_ocr(binary, char_regions)
println("识别结果:", text)

posted @ 2025-07-10 16:08  ttocr、com  阅读(10)  评论(0)    收藏  举报