使用 Julia 自动定位并裁剪验证码字符图像进行识别

在复杂验证码图像中,字符往往不再居中、等宽或对齐,位置随机、角度倾斜甚至大小不一。直接使用 OCR 很难准确识别。这时,先对图像进行字符定位、区域裁剪,再将单字符送入 OCR 引擎,是一种更稳健的识别思路。本文将使用 Julia 语言,展示如何完成这一字符自动检测与识别流程。

一、所需依赖安装
更多内容访问ttocr.com或联系1436423940
using Pkg
Pkg.add(["Images", "ImageIO", "ImageMorphology", "ImageFiltering", "Tesseract"])
二、图像读取与预处理
读取图像,转为灰度图并二值化:

using Images, ImageIO

img = load("random_position_captcha.png")
gray = Gray.(img)

简单阈值处理

binary = map(x -> x > 0.5 ? 1.0 : 0.0, gray)
save("binary.png", binary)
三、形态学操作增强字符边缘

using ImageMorphology

轻微膨胀连接笔画

enhanced = imdilate(binary, ones(2,2))
save("enhanced.png", enhanced)
四、连通区域提取字符块
识别图像中所有独立字符区域(连通域):

labeled, count = label_components(enhanced)

println("检测到字符块数量:", count)
五、按位置排序字符块并识别
从左到右提取字符区域,分别保存识别:

using Tesseract

function extract_characters_and_recognize(labeled, count)
regions = []

# 获取每个区域的边界框
for i in 1:count
    ys, xs = findall(labeled .== i) |> Tuple
    if length(xs) < 20 || length(ys) < 5
        continue  # 跳过小块干扰
    end
    xmin, xmax = minimum(xs), maximum(xs)
    ymin, ymax = minimum(ys), maximum(ys)
    push!(regions, (xmin, xmax, ymin, ymax))
end

# 按 x 坐标排序
sorted = sort(regions, by = r -> r[1])
result = ""

for (i, (x1, x2, y1, y2)) in enumerate(sorted)
    char_img = labeled[y1:y2, x1:x2] .== labeled[y1, x1]
    filename = "char_$i.png"
    save(filename, char_img)

    ocr = TesseractOcr("eng")
    set_image(ocr, filename)
    c = strip(get_text(ocr))
    result *= c
end

return result

end

text = extract_characters_and_recognize(labeled, count)
println("识别结果:", text)

posted @ 2025-07-10 22:32  ttocr、com  阅读(13)  评论(0)    收藏  举报