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)
浙公网安备 33010602011771号