matlab车牌识别系统,有图像预处理模块,图像倾斜矫正模块,图像分割模块,图像识别模块。 算法有均值滤波,灰度处理,边缘检测,形态学处理,垂直投影分割,字符模板识别。 附带ppt。

车牌识别系统在智能交通、停车场管理等领域应用广泛。今天咱们直接上干货,聊一个基于MATLAB实现的车牌识别系统。这套系统包含四个核心模块:预处理、倾斜矫正、字符分割和字符识别,咱们边看代码边分析实现逻辑。

预处理模块打头阵

车牌图片到手第一步就是降噪。直接上均值滤波代码:

filtered_img = imfilter(noisy_img, fspecial('average',3));

这个3x3的均值滤波器能有效去除高频噪声,但对椒盐噪声效果一般。这时候灰度化处理得跟上:

gray_img = rgb2gray(filtered_img);

这里有个细节:直接用rgb2gray可能丢失颜色信息,有些场景下用YUV通道分离效果更好。接着用Sobel算子做边缘检测:

edge_img = edge(gray_img, 'sobel', 0.15);

阈值设0.15是个经验值,太低了会检测过多伪边缘,太高可能漏掉车牌边框。

给车牌扶正的操作

倾斜车牌不矫正,后续分割绝对翻车。这里用霍夫变换找倾斜角:

[H,theta,rho] = hough(edge_img);
peaks = houghpeaks(H,5);
angle = mean(theta(peaks(:,2)));
corrected_img = imrotate(gray_img, angle, 'bilinear','crop');

注意imrotate的bilinear插值比默认的nearest效果好,但计算量稍大。实践中遇到极端倾斜(超过30度)时可能需要二次检测。

matlab车牌识别系统,有图像预处理模块,图像倾斜矫正模块,图像分割模块,图像识别模块。 算法有均值滤波,灰度处理,边缘检测,形态学处理,垂直投影分割,字符模板识别。 附带ppt。

字符分割的垂直投影法

分割模块最考验耐心,形态学处理先开胃:

se = strel('rectangle',[3,7]);
morph_img = imclose(bw_img, se);

这个3x7的结构体专门针对汉字和字母的竖笔画特征。垂直投影的核心代码:

vertical_proj = sum(morph_img, 1);
threshold = 0.2 * max(vertical_proj);
split_points = find(vertical_proj > threshold);

画个投影波形图会发现波峰对应字符区域。分割时注意处理粘连字符,有时候需要加入水平投影做二次校验。

模板匹配的终极对决

最后识别模块用最朴素的模板匹配反而见效快:

function char = recognize(character_img, templates)
    corr_values = zeros(1, numel(templates));
    for i = 1:numel(templates)
        corr_values(i) = corr2(character_img, templates{i});
    end
    [~, idx] = max(corr_values);
    char = template_chars(idx);
end

虽然比不过深度学习,但在固定摄像头场景下准确率能到90%以上。模板库建议包含不同字体,实测宋体和新罗马体混用效果最佳。

整个系统跑下来,发现三个性能瓶颈:倾斜矫正的霍夫变换耗时、垂直投影的参数调优、模板匹配的速度。附带的PPT里详细列出了各模块的时间复杂度分析,实际部署时可以考虑用C++重写核心算法。完整代码已打包,需要调试的重点关注imclose结构体尺寸和投影分割阈值这两个参数。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐