Julia 分割粘连字符验证码并实现逐字符识别

验证码中常见的抗识别策略之一是将多个字符紧密排列甚至粘连,使其边界模糊、识别困难。本文介绍如何使用 Julia 实现粘连字符的分割与单字符识别,包括图像预处理、垂直投影分割、OCR 多段识别等关键步骤。

一、准备依赖包
using Pkg
Pkg.add(["Images", "ImageIO", "Tesseract"])
更多内容访问ttocr.com或联系1436423940
二、读取图像并灰度化、二值化
using Images, ImageIO

img = load("captcha_stuck_chars.png")
gray = Gray.(img)
binary = map(x -> x < 0.6 ? 1.0 : 0.0, gray)
save("binary.png", Gray.(binary))

三、进行垂直投影,分析字符边界

垂直投影用于检测字符之间的“空隙”,即像素值为 0 的列数量较多处。

function vertical_projection(img)
proj = [sum(img[:, x]) for x in 1:size(img, 2)]
return proj
end

proj = vertical_projection(binary)

四、分割字符区域(基于投影谷值)
function split_columns(img, threshold=5)
proj = vertical_projection(img)
cuts = []
in_char = false
start = 1
for x in 1:length(proj)
if !in_char && proj[x] > threshold
in_char = true
start = x
elseif in_char && proj[x] ≤ threshold
in_char = false
push!(cuts, (start, x-1))
end
end
return cuts
end

char_regions = split_columns(binary)
println("检测到字符区域数量: ", length(char_regions))

五、逐字符切割与保存
mkdir("chars")
for (i, (x1, x2)) in enumerate(char_regions)
char_img = binary[:, x1:x2]
save("chars/char_$(i).png", Gray.(char_img))
end

六、逐字符识别并拼接结果
using Tesseract

ocr = TesseractOcr("eng")
result = ""

for i in 1:length(char_regions)
set_image(ocr, "chars/char_$(i).png")
char = strip(get_text(ocr))
result *= char
end

println("识别验证码为:", result)

posted @ 2025-08-28 20:21  ttocr、com  阅读(4)  评论(0)    收藏  举报