基于matlab的交通限速标志识别系统 【标志识别】计算机视觉,数字图像处理常见实战项目。 过程:图像预处理,标志定位,数字分割,数字识别,结果展示。 输入生活中常见的限速标志图片,系统根据限速标志的位置进行定位识别,并且识别限速标志中的数字。 包远程调试,送报告(第062期)

img = imread('speed_limit_60.jpg');
imshow(img);

![限速标志原图]

第一步预处理必须够狠。红圈白底黑字是标准样式,但实际可能有反光、污渍干扰。先转灰度图加高斯滤波:

gray_img = rgb2gray(img);
filtered_img = imfilter(gray_img, fspecial('gaussian', [5 5], 2));

高斯滤波主要是为了去噪,避免后续步骤被杂讯干扰。这时候可以上二值化了,注意阈值要动态调整:

binary_img = imbinarize(filtered_img, 'adaptive', 'Sensitivity', 0.6);

定位标志的关键在于找红色区域。转换到HSV色彩空间更容易捕捉红色:

hsv_img = rgb2hsv(img);
red_mask = (hsv_img(:,:,1) > 0.95 | hsv_img(:,:,1) < 0.05) & hsv_img(:,:,2) > 0.6;
red_mask = imfill(red_mask, 'holes');

这里有个坑——红色在HSV里0度和360度附近都有分布,所以用了两个条件判断。填充空洞后,用区域属性筛选圆形:

stats = regionprops(red_mask, 'Area', 'Circularity');
valid_regions = find([stats.Area] > 500 & [stats.Circularity] > 0.8);

数字分割更刺激。截取标志区域后,先做反向二值化:

crop_img = imcrop(binary_img, bounding_box);
crop_img = ~crop_img;  % 白底黑字转黑底白字

这时候可能有残留噪声,上形态学处理:

clean_img = imopen(crop_img, strel('disk', 2));

数字识别直接调用Matlab的OCR但别指望太高,得训练自己的分类器:

ocr_results = ocr(clean_img, 'CharacterSet', '0123456789', 'TextLayout','Block');
speed_number = str2double(ocr_results.Text(1));

实测发现直接用默认OCR准确率约70%,需要上迁移学习。保存样本库后用这个骚操作:

trainingData = load('speed_chars_dataset.mat');
ocrModel = trainOCR(trainingData);

最后把结果怼到原图上展示:

output_img = insertObjectAnnotation(img, 'rectangle', bounding_box, ...
    ['Speed Limit: ' num2str(speed_number)]);
imshowpair(img, output_img, 'montage');

整套流程跑下来关键点就三个:红色圈定位要准、数字分割要干净、OCR得做针对性训练。遇到阴天拍摄的图片记得在预处理阶段加个CLAHE增强对比度,代码包里的调试工具能实时看各阶段效果,改两个参数就能适配不同场景。

Logo

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

更多推荐