matlab——红绿灯颜色及数字识别(二)

实验总结:红绿灯颜色以及数字识别(二):提取信号灯区域

一、知识背景

这里放一些链接来供查阅参考:

1.连通量函数;
Matlab中bwlabel函数的使用
2.膨胀、腐蚀;
形态学操作:膨胀与腐蚀;
matlab中的腐蚀与膨胀,MATLAB中腐蚀、膨胀、开运算和闭运算;
3.imcrop函数;
MATLAB中imcrop函数

二、代码实现及注释

1.对有效部分的提取(大小过滤);
这里为红绿灯颜色以及数字识别(一)颜色识别的代码的续写:进一步实现对信号灯进行提取。
lightsrc0提取到的颜色部分可能不止存在于信号灯范围,周围环境可能也存在在信号灯筛选范围内的像素点,因此需要对信号灯部分进行一步筛选。
对提取的部分信号灯对应颜色部分进行二值化、膨胀、腐蚀处理。二值化将图像变为黑白使后续处理变得更加简单。膨胀、腐蚀处理让提取的部分比较散落的点相连通(信号灯实际提取有点像芝麻饼,信号灯上的像素点是离散的,芝麻饼上的芝麻也并不是都连在一起的)。

%lightsrc0是前面(一)的链接中用来对三色范围像素点进行存储

lightsrc=rgb2gray(lightsrc0);% 颜色部分二值化、膨胀、腐蚀(不同结构元)(闭运算)
T=graythresh(lightsrc);
lightsrc=im2bw(lightsrc,T);
se1=strel('disk',4);
lightsrc=imdilate(lightsrc,se1);
se2=strel('disk',4);
lightsrc=imerode(lightsrc,se2);
figure;
subplot 121;
imshow(lightsrc0);
title('提取对应颜色部分');
subplot 122;
imshow(lightsrc);
title('提取颜色部分并进行二值化、闭运算后的图像');

效果如下:(放大能看到右边有一个小白点,即周围环境在信号提取范围内的点)

matlab——红绿灯颜色及数字识别(二)
2.连通域判断提取;
信号灯仍是提取后图像的主体,通过对连通量的像素点大小进行约束能够筛选出信号灯部分(这个约束范围也是需要根据图像进行调整)。
lightsrc1=lightsrc;%进行对比比较存档
[L1,n1]=bwlabel(lightsrc);% 信号灯提取,采用连通分量,n1为连通分量个数
lightx=zeros();%为下一步的信号灯区域裁剪做准备
lighty=zeros();
width=zeros();
height=zeros();
j=1;
for k=1:n1%对连通分量的范围进行约束
    [r,c]=find(L1==k);
    if size(r,1)<300 || size(r,1)>6000% 信号灯范围是300-6000
        for i=1:size(r,1)
            lightsrc(r(i),c(i))=0;%在信号灯范围之外,则将该连通分量置黑
        end
    else
        lightx(j)=min(c);
        lighty(j)=min(r);
        width(j)=max(c)-min(c);
        height(j)=max(r)-min(r);
        j=j+1;
    end
end
[L2,n2]=bwlabel(lightsrc);% 约束后的连通分量(信号灯)

figure;
subplot 121;
imshow(lightsrc1);
title('范围约束前');
subplot 122;
imshow(lightsrc);
title('范围约束后');

效果如下:(能看到右边的小白点消失)

matlab——红绿灯颜色及数字识别(二)
3.信号灯部分截取;
因为后续会对信号灯进行形态识别(数字、方向),所以需要对每一个信号灯部分进行单独的截取。
(如果前面约束没有做好,后续的裁剪也会将非信号灯部分裁剪出来,提高后续的难度)
for k=1:n2%遍历连通域,对每个连通域都进行裁剪)
    correct=0;
    light=imcrop(src,[lightx(k) lighty(k) width(k) height(k)]);% 分割
    lightgray=imcrop(lightsrc,[lightx(k) lighty(k) width(k) height(k)]);% 分割
    [a,b]=size(lightgray);
        figure;
        subplot 131;
        imshow(src);
        title('原始图像');
        subplot 132;
        imshow(lightgray);
        title('对连通区域进行分割');
        subplot 133;
        imshow(light);
        title('分割图像在原图所对应图像');

效果如下:

matlab——红绿灯颜色及数字识别(二)

三、作者有话说

1.完成红绿灯识别关键点个人认为在于对HSV分量进行合适的范围约束(与拍摄环境有一定关系);

2.HSV分量的约束范围,暂时未找到能够自适应的方法,所以我设计的是针对于我所拍摄的照片所使用的范围;

3.到这里已经完成信号灯红绿灯颜色识别以及信号灯提取,后续将会对红绿灯的形状进行进一步识别,随缘佛系更;

4.后续:matlab——红绿灯颜色及数字识别(三)

Original: https://blog.csdn.net/foxisantu/article/details/119507315
Author: 佛系三土
Title: matlab——红绿灯颜色及数字识别(二)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/633363/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球