基于HSV颜色定位的交通标志识别实现
基于HSV颜色定位的交通标志识别实现
一、系统核心架构
graph TD
A[图像输入] --> B[HSV颜色分割]
B --> C[形态学处理]
C --> D[区域标记与筛选]
D --> E[目标定位]
E --> F[模板匹配/OCR识别]
F --> G[结果输出]
二、HSV颜色定位原理
交通标志的颜色特征显著(如禁令标志红圈、警告标志黄三角),HSV模型对光照变化鲁棒性强:
- H(色调):区分颜色类别(红/黄/蓝)
- S(饱和度):过滤低饱和度背景(如灰暗路面)
- V(明度):抵抗阴影干扰
颜色阈值范围(参考值):
| 标志类型 | H范围 | S范围 | V范围 |
|---|---|---|---|
| 红色禁令标志 | [0, 0.1] ∪ [0.9, 1] | >0.4 | >0.3 |
| 黄色警告标志 | [0.1, 0.2] | >0.5 | >0.5 |
| 蓝色指示标志 | [0.55, 0.7] | >0.4 | >0.4 |
三、步骤
1. HSV颜色分割
img = imread('traffic_sign.jpg');
hsvImg = rgb2hsv(img);
% 红色分割(注意HSV红色在0°和360°两端)
redMask = (hsvImg(:,:,1) >= 0.9 | hsvImg(:,:,1) <= 0.1) ...
& hsvImg(:,:,2) > 0.4 & hsvImg(:,:,3) > 0.3;
% 黄色分割
yellowMask = (hsvImg(:,:,1) > 0.1 & hsvImg(:,:,1) < 0.2) ...
& hsvImg(:,:,2) > 0.5 & hsvImg(:,:,3) > 0.5;
关键点:红色需处理色调环断裂问题(0.91.0和00.1)。
2. 形态学优化
se = strel('disk', 5);
cleanMask = imopen(redMask | yellowMask, se); % 开运算去噪
fillMask = imfill(cleanMask, 'holes'); % 填充空洞
作用:消除树叶、车牌等红色干扰物。
3. 区域标记与筛选
[L, num] = bwlabel(fillMask);
stats = regionprops(L, 'Area', 'BoundingBox', 'Solidity');
% 筛选条件:面积>500px,实心度>0.7
validIdx = find([stats.Area] > 500 & [stats.Solidity] > 0.7);
boundingBoxes = cat(1, stats(validIdx).BoundingBox);
4. 目标定位与裁剪
for i = 1:length(validIdx)
roi = imcrop(img, boundingBoxes(i,:));
figure, imshow(roi); title(sprintf('候选区域%d', i));
end
四、识别模块
1. 模板匹配法
% 加载模板库(预先处理为二值图)
templates = dir('templates/*.png');
maxCorr = 0; bestMatch = '';
for j = 1:length(templates)
template = imread(fullfile('templates', templates(j).name));
corr = normxcorr2(template(:,:,1), roi_gray);
if max(corr(:)) > maxCorr
maxCorr = max(corr(:));
bestMatch = templates(j).name;
end
end
适用场景:标志形状固定(如限速牌)。
2. OCR数字识别
roi_gray = rgb2gray(roi);
ocrResult = ocr(roi_gray, 'CharacterSet', '0123456789', 'TextLayout', 'Block');
disp(['识别数字:', ocrResult.Text]);
适用场景:含数字的标志(如限速值)。
五、工作流示例
% 步骤1:HSV颜色分割
img = imread('highway.jpg');
hsvImg = rgb2hsv(img);
redMask = (hsvImg(:,:,1) >= 0.9 | hsvImg(:,:,1) <= 0.1) & hsvImg(:,:,2) > 0.4;
% 步骤2:形态学优化
cleanMask = bwareaopen(redMask, 500); % 移除小噪点
% 步骤3:定位并裁剪
stats = regionprops(cleanMask, 'BoundingBox');
roi = imcrop(img, stats(1).BoundingBox);
% 步骤4:模板匹配识别
load('speed_limit_templates.mat');
matchScores = zeros(1, numel(templates));
for k = 1:numel(templates)
matchScores(k) = max(normxcorr2(templates{k}, rgb2gray(roi), 'coeff'));
end
[~, idx] = max(matchScores);
fprintf('识别结果:限速%d km/h', str2double(templateNames{idx}));
资源推荐:
- 交通标志识别系统 标准完全模板 HSV定位基础版 www.youwenfan.com/contentcnf/23532.html
- 交通标志模板库 github.com/opencv/opencv_contrib/tree/master/modules/traffic
核心总结:HSV定位是交通标志识别的高效初筛手段,结合形态学处理与先验知识(形状/位置),可快速排除90%以上干扰区域,为后续精细识别奠定基础。

浙公网安备 33010602011771号