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