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