验证码图像常通过添加背景纹理、彩色干扰图案、渐变背景等方式,增强抗识别能力。这类验证码视觉上看似清晰,但机器识别往往受背景干扰显著。本文将介绍如何在 Julia 中分离字符前景与干扰背景,提高最终 OCR 的准确率。
一、环境准备
更多内容访问ttocr.com或联系1436423940
using Pkg
Pkg.add(["Images", "ImageIO", "ImageFiltering", "ColorVectorSpace", "Tesseract"])
二、读取图像并转换为亮度通道
我们将图像转为灰度或亮度通道以突出字符与背景的差异。
using Images, ImageIO
img = load("captcha_with_texture.png")
gray = Gray.(img)
save("gray.png", gray)
三、应用高通滤波抑制大尺度背景变化
高通滤波能有效抑制背景纹理和渐变,保留字符边缘信息。
using ImageFiltering
使用高通滤波器突出字符
kernel = [-1 -1 -1; -1 8 -1; -1 -1 -1]
highpass = imfilter(gray, kernel)
save("highpass.png", highpass)
四、增强对比并进行二值化
简单阈值切分,保留字符结构
binary = map(x -> x > 0.2 ? 1.0 : 0.0, highpass)
save("binary.png", Gray.(binary))
五、字符清洗(去孤立点)
function clean_isolated(img)
h, w = size(img)
cleaned = copy(img)
for y in 2:h-1, x in 2:w-1
neighbors = sum(img[y-1:y+1, x-1:x+1]) - img[y, x]
if img[y, x] == 1.0 && neighbors < 2.0
cleaned[y, x] = 0.0
end
end
return cleaned
end
cleaned = clean_isolated(binary)
save("cleaned.png", Gray.(cleaned))
六、OCR 识别
using Tesseract
ocr = TesseractOcr("eng")
set_image(ocr, "cleaned.png")
text = strip(get_text(ocr))
println("识别结果:", text)