在许多验证码图像中,存在大量有意添加的干扰线条、弯曲波纹或背景噪声,这些设计是为了阻止自动识别。传统空间域的二值化方法往往无法彻底去除这些干扰,导致 OCR 误识别或识别失败。频域滤波提供了另一种强大的解决思路:通过傅里叶变换,将图像转换到频率空间,精准去除频率特征明显的干扰成分。
一、安装依赖库
using Pkg
Pkg.add(["Images", "ImageIO", "FFTW", "ImageFiltering", "Tesseract"])
更多内容访问ttocr.com或联系1436423940
二、读取并灰度化图像
using Images, ImageIO
img = load("captcha_with_lines.png")
gray = Gray.(img)
三、执行傅里叶变换进入频域
using FFTW
将灰度图转换为矩阵并中心化
gray_array = Float64.(gray)
F = fftshift(fft(gray_array))
四、构建高通滤波器去除线条干扰
function highpass_filter(size, cutoff)
rows, cols = size
center_r, center_c = div(rows, 2), div(cols, 2)
mask = ones(Float64, rows, cols)
for r in 1:rows, c in 1:colsd = sqrt((r - center_r)^2 + (c - center_c)^2)if d < cutoffmask[r, c] = 0.0 # 抑制低频(背景、粗线)end
end
return mask
end
filter = highpass_filter(size(F), 20)
filtered_freq = F .* filter
五、反变换回空间域
filtered_spatial = abs.(ifft(ifftshift(filtered_freq)))
norm_img = filtered_spatial ./ maximum(filtered_spatial)
binary = map(x -> x > 0.4 ? 1.0 : 0.0, norm_img)
save("filtered_binary.png", binary)
六、使用 Tesseract OCR 识别
using Tesseract
ocr = TesseractOcr("eng")
set_image(ocr, "filtered_binary.png")
text = strip(get_text(ocr))
println("识别出的验证码:", text)