使用 Julia 实现验证码中倾斜字符的自动校正与识别
为了提升安全性,许多验证码图像会对每个字符进行一定角度的旋转。这种“个体倾斜”会干扰传统 OCR 工具的识别效果,特别是字符之间相互接近、变形不一时。本文将使用 Julia 实现一个流程:逐字符分割 → 倾斜检测 → 仿射校正 → OCR识别,解决这一难题。
一、安装所需包
using Pkg
Pkg.add(["Images", "ImageIO", "ImageMorphology", "ImageTransformations", "Tesseract"])
二、图像加载与二值化
using Images, ImageIO
img = load("rotated_chars_captcha.png")
gray = Gray.(img)
简单阈值处理,黑底白字
binary = map(x -> x > 0.5 ? 0.0 : 1.0, gray)
三、字符区域分割
我们使用连通区域提取字符块。
using ImageMorphology
labels = label_components(binary)
num_labels = maximum(labels)
segments = [labels .== i for i in 1:num_labels]
四、倾斜角度估算与仿射矫正
我们使用最小外接矩形的主方向来估算每个字符的倾斜角度,并进行旋转修复。
using ImageTransformations
function correct_rotation(char_img)
ys, xs = findall(char_img) |> Tuple
x_center = mean(xs)
y_center = mean(ys)
# 使用 PCA 估计主方向
X = hcat(xs, ys)
X_centered = X .- mean(X, dims=1)
U, S, V = svd(X_centered)
angle = atan(V[2,1], V[1,1]) # 主成分方向
rotated = imrotate(char_img, -angle, axes=Centered)
return rotated
end
五、逐字符识别
using Tesseract
function recognize_chars(segments)
result = ""
for (i, mask) in enumerate(segments)
# 裁剪最小外接区域
ys, xs = findall(mask) |> Tuple
roi = binary[minimum(ys):maximum(ys), minimum(xs):maximum(xs)]
# 校正旋转
corrected = correct_rotation(roi)
fname = "char_$i.png"
save(fname, corrected)
ocr = TesseractOcr("eng")
set_image(ocr, fname)
c = strip(get_text(ocr))
result *= c
end
return result
end
text = recognize_chars(segments)
println("识别结果:", text)
浙公网安备 33010602011771号