使用GTSDB训练集实现基于最大稳定极值区域和SVM的交通标志检测识别算法matlab仿真

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用GTSDB训练集实现基于最大稳定极值区域和SVM的交通标志检测识别算法matlab仿真相关的知识,希望对你有一定的参考价值。

目录

一、理论基础

二、核心MATLAB程序

三、MATLAB仿真测试结果


一、理论基础

       在计算机视觉领域,最大稳定极值区域 (MSER)(Maximally Stable Extremal Regions)是一种用于在图像中进行斑点检测的方法。这个方法由Matas等人提出,用于在两个不同视角的图片中寻找对应关系(correspondence problem)。这种方法从图像中提取全面的元素对应关系,有助于宽基线匹配(wide-baseline matching),以及更好的立体匹配和物体识别算法。

       特征检测是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。
       至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征检测最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。
       特征检测是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征检测的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。
       有时,假如特征检测需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征检测阶层,这样仅图像的部分被用来寻找特征。
       由于许多计算机图像算法使用特征检测作为其初级计算步骤,因此有大量特征检测算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。

        MSER算法中,其最大稳定极值区域的定义为极值区域随着设置的灰度阈值的增大而逐渐“长大”。这样的一组极值区域由小到大是相互嵌套的关系,分别用来表示这一系列相互嵌套的极值区域序列。如果为MSER,则其满足如下条件:

      

      变量表示的是像素差值。由于 Q 是一个像素点的集合,所以绝对值代表的是该集合的基数,表示这个极值区域的面积。需先要先找到所有的极值区域,然后通过上面的“稳定标准”来确定最终的 MSER。

二、核心MATLAB程序

clc;
clear;
close all;
warning off;
addpath 'func\\'
addpath 'func\\hog_catch\\'
addpath 'func\\func_SVM_toolbox\\'
addpath 'func\\func_SVM_toolbox\\java\\'
addpath 'func\\func_SVM_toolbox\\java\\libsvm\\'
addpath 'func\\func_SVM_toolbox\\matlab\\'
addpath 'func\\func_SVM_toolbox\\matlab-implement[by faruto]\\'
addpath 'func\\func_SVM_toolbox\\python\\'
addpath 'func\\func_SVM_toolbox\\svm-toy\\'
addpath 'func\\func_SVM_toolbox\\tools\\'
addpath 'func\\func_SVM_toolbox\\windows\\'


sel = 10;

%NAME = ['库\\1_tc.jpg'];
%NAME = ['库\\2_60.jpg'];
%NAME = ['库\\3_stop.jpg'];
%NAME = ['库\\4_80.jpg'];
%NAME = ['库\\5_70.jpg'];
%NAME = ['库\\6_blue.jpg'];
%NAME = ['库\\7_50.jpg'];
%NAME = ['库\\8_30.jpg'];
%NAME = ['库\\9_sg.jpg'];
%NAME = ['库\\10_lh.jpg'];

%*******************************************************************************************************************
%基本所有参数都统一了,就下面2个参数没办法,必须得有的时候变更,因为有些大小不一样,并且效果不好的,需要设置门限来判决
if sel == 1;
%1_tc
Smj   = 1800;
SCALE = 5;
I     = imread('database\\1_tc\\1.jpg');
end
if sel == 2;
%2_60
Smj   = 1200;
SCALE = 0;
I     = imread('database\\2_60\\1.jpg');
end
if sel == 3;
%3_stop
Smj   = 1000;
SCALE = 0;
I     = imread('database\\3_stop\\1.jpg');
end
if sel == 4;
%4_80
Smj   = 800;
SCALE = 0;
I     = imread('database\\4_80\\3.jpg');
end
if sel == 5;
%5_70
Smj   = 800;
SCALE = 5;
I     = imread('database\\5_70\\1.jpg');
end
if sel == 6;
%6_blue
Smj   = 700;
SCALE = 5;
I     = imread('database\\6_blue\\1.jpg');
end
if sel == 7;
%7_50
Smj   = 1000;
SCALE = 5;
I     = imread('database\\7_50\\1.jpg');
end
if sel == 8;
%8_30
Smj   = 900;
SCALE = 6;
I     = imread('database\\8_30\\1.jpg');
end
if sel == 9;
%9_sg
Smj   = 900;
SCALE = 6;
I     = imread('database\\9_sg\\2.jpg');
end
if sel == 10;
%10_lh
Smj   = 1500;
SCALE = 6;
I     = imread('database\\10_lh\\3.jpg');
end

%*******************************************************************************************************************

%读取测试图片

figure;
imshow(I);
%MSER交通标志提取
[R,C,K] = size(I);
I1 = zeros(R,C);
for i = 1:R
    for j = 1:C
        R=double(I(i,j,1));
        G=double(I(i,j,2));
        B=double(I(i,j,3));
        %公式1,但是论文中的公式1并不适用于所有的测试样本,一些效果不好的,我删除掉了
        I1(i,j) = (255*max([R/(R+G+B),B/(R+G+B)]));
    end
end
I1 = uint8(I1);
% figure;
% imshow(I1);
%MSER regions
regions = detectMSERFeatures(I1,'ThresholdDelta',2,'RegionAreaRange',[200 2000]);
figure; 
imshow(I1); 
hold on;
plot(regions,'showPixelList',true,'showEllipses',true);
hold on

%形态学识别提取最终的交通标志
%检测
XY = regions.PixelList;

ind= 0;
for i = 1:length(XY)
    Xmin = min(XYi(:,1));
    Xmax = max(XYi(:,1));
    Ymin = min(XYi(:,2));
    Ymax = max(XYi(:,2));    
    W1(i)= Ymax - Ymin;
    L1(i)= Xmax - Xmin;
    if abs(L1(i) - W1(i)) <= 5
       ind      = ind+1; 
       XY2ind = XYi; 
    end
end
figure; 
imshow(I1); 
hold on;
for i = 1:length(XY2)
    plot(XY2i(:,1),XY2i(:,2),'g.');
    hold on
end

%提取交通标志的中心点,判断是否为同一个标志
for i = 1:length(XY2)
    Xmin(i)= min(XY2i(:,1));
    Xmax(i)= max(XY2i(:,1));
    Ymin(i)= min(XY2i(:,2));
    Ymax(i)= max(XY2i(:,2));
    Xc(i)  = (Xmin(i)+Xmax(i))/2;
    Yc(i)  = (Ymin(i)+Ymax(i))/2;
%     plot(Xc(i),Yc(i),'r*');hold on
end
 
%重合点合并
Xmin2=[];
Xmax2=[];
Ymin2=[];
Ymax2=[];

if length(Xc)>1
    indx = 0;
    for i = 1:length(Xc)
        tmps=[];
        for j = 1:length(Xc)
            if sqrt(double((Xc(i) - Xc(j))^2 + (Yc(i) - Yc(j))^2))<=20
               tmps=[tmps,j];
            end
        end
        tmps
        Xmin2(i) = mean(Xmin(tmps));
        Xmax2(i) = mean(Xmax(tmps));
        Ymin2(i) = mean(Ymin(tmps));
        Ymax2(i) = mean(Ymax(tmps)); 
    end
    %根据XYi的相似性进行合并
else
    Xmin2= Xmin;
    Xmax2= Xmax;
    Ymin2= Ymin;
    Ymax2= Ymax; 
end


Smj
%%
index = 0;
for i = 1:length(Xmin2)
    SS    = abs(Ymin2(i)-Ymax2(i))*abs(Xmin2(i)-Xmax2(i))
    if SS>Smj
       index = index + 1; 
       Icindex = I(Ymin2(i)-SCALE:Ymax2(i)+SCALE,Xmin2(i)-SCALE:Xmax2(i)+SCALE,:);
        Xmin3(index) = (Xmin(i));
        Xmax3(index) = (Xmax(i));
        Ymin3(index) = (Ymin(i));
        Ymax3(index) = (Ymax(i)); 
    end
end

figure;


%HOG特征提取

F1=[];
for i = 1:length(Ic)
    I1      = imresize(Ici,[96,96]);
    F1      = [F1;func_feature1(I1)];
end


%SVM测试
load svm_trains.mat


for i = 1:length(Ic)
    [Predict1,error1] = svmpredict(1,[F1(i,:)],model);
    yout(i)=Predict1;
end
yout(find(yout==0))=[];



[Vs,Is]=unique(yout)


for i = 1:length(Vs)
    if i > 1
       I=I22; 
    end
    y = Vs(i);
    if  y == 1
        I0    = imread('库\\1_tc.jpg');
    end    
    if  y == 2
        I0    = imread('库\\2_60.jpg');
    end 
    if  y == 3
        I0    = imread('库\\3_stop.jpg');
    end 
    if  y == 4
        I0    = imread('库\\4_80.jpg');
    end 
    if  y == 5
        I0    = imread('库\\5_70.jpg');
    end 
    if  y == 6
        I0    = imread('库\\6_blue.jpg');
    end 
    if  y == 7
        I0    = imread('库\\7_50.jpg');
    end 
    if  y == 8
        I0    = imread('库\\8_30.jpg');
    end 
    if  y == 9
        I0    = imread('库\\9_sg.jpg');
    end 
    if  y == 10
        I0    = imread('库\\10_lh.jpg');
    end 
    I1    = imresize(I0,[96,96]);
    [R,C] = size(I);
    I(R-96+1:R,(i-1)*96 + 1:(i)*96,:) = I1;
    I22=I;
    hold on 
    imshow(I);
    hold on 
    

end
hold on 
for i = 1:length(Is)
    plot([Xmin3(Is(i)):Xmax3(Is(i))],double(Ymin3(Is(i)))*ones(size([Xmin3(Is(i)):Xmax3(Is(i))])),'g','linewidth',2);
    hold on
    plot([Xmin3(Is(i)):Xmax3(Is(i))],double(Ymax3(Is(i)))*ones(size([Xmin3(Is(i)):Xmax3(Is(i))])),'g','linewidth',2);
    hold on   
    plot(double(Xmin3(Is(i)))*ones(size([Ymin3(Is(i)):Ymax3(Is(i))])),[Ymin3(Is(i)):Ymax3(Is(i))],'g','linewidth',2);
    hold on
    plot(double(Xmax3(Is(i)))*ones(size([Ymin3(Is(i)):Ymax3(Is(i))])),[Ymin3(Is(i)):Ymax3(Is(i))],'g','linewidth',2);
    hold on  
end
for i = 1:length(Is)
    plot([(i-1)*96 + 48,(Xmin3(Is(i))+Xmax3(Is(i)))/2],[R-96,(Ymin3(Is(i))+Ymax3(Is(i)))/2],'g','linewidth',2);
    hold on
end
title('交通标志提取');







三、MATLAB仿真测试结果

GTSDB训练库

01-43 

以上是关于使用GTSDB训练集实现基于最大稳定极值区域和SVM的交通标志检测识别算法matlab仿真的主要内容,如果未能解决你的问题,请参考以下文章

m基于MSER最大稳定极值区域和SVM的交通标志检测识别算法的matlab仿真

OpenCV 例程 300篇247. 特征检测之最大稳定极值区域(MSER)

OpenCV 例程 300篇247. 特征检测之最大稳定极值区域(MSER)

最大稳定极值区域(MSER)检测

mser 最大稳定极值区域(文字区域定位)算法 附完整C代码

基于MSER的车牌提取和字符分割仿真