使用 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)

posted @ 2025-07-12 10:43  ttocr、com  阅读(19)  评论(0)    收藏  举报