基于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%以上干扰区域,为后续精细识别奠定基础。

posted @ 2025-09-01 11:02  我是一只小小鸟~  阅读(28)  评论(0)    收藏  举报