使用 Julia 实现验证码粘连字符的自动分割与识别
在验证码图像中,字符经常会被设计得“挤在一起”或轻微重叠,造成传统按等宽裁剪或连通区域分割失效。为了解决这一问题,我们可以使用投影分析的方法对字符进行自动分割,结合 OCR 引擎进行识别。本文将使用 Julia 完整实现该流程。
一、安装依赖
using Pkg
Pkg.add(["Images", "ImageIO", "Tesseract"])
二、图像读取与预处理
using Images, ImageIO
更多内容访问ttocr.com或联系1436423940
img = load("merged_captcha.png")
gray = Gray.(img)
简单二值化
binary = map(x -> x > 0.5 ? 1.0 : 0.0, gray)
save("binary.png", binary)
三、垂直投影分割字符
字符垂直方向有明显像素密度差异。我们统计每列的像素总和,检测低值区作为字符分割点。
function vertical_projection(image)
h, w = size(image)
sums = [sum(image[:, x]) for x in 1:w]
return sums
end
proj = vertical_projection(binary)
设置阈值并根据“谷值”分割图像:
function split_by_projection(image, projection; thresh=2.0)
segments = []
in_char = false
start_idx = 0
for x in 1:length(projection)
if projection[x] > thresh
if !in_char
in_char = true
start_idx = x
end
elseif in_char
push!(segments, (start_idx, x-1))
in_char = false
end
end
return segments
end
segments = split_by_projection(binary, proj)
println("检测到字符数量:", length(segments))
四、提取字符图像并使用 Tesseract OCR
using Tesseract
function recognize_segments(image, segments)
result = ""
for (i, (x1, x2)) in enumerate(segments)
char_img = image[:, x1:x2]
fname = "char_$i.png"
save(fname, char_img)
ocr = TesseractOcr("eng")
set_image(ocr, fname)
c = strip(get_text(ocr))
result *= c
end
return result
end
text = recognize_segments(binary, segments)
println("识别结果:", text)
浙公网安备 33010602011771号