Matlab图像处理——蓝色车牌的提取

在现代社会中,车牌识别已经成为交通管理和安全监控中一个重要的工具。车牌提取是车牌识别中的一个关键步骤,通过提取车牌可以去除非车牌区域带来的干扰,从而更加快速准确的识别车牌。这篇文章将介绍如何使用Matlab来提取蓝色车牌。

6410e37f312951a17281de545ed32fb5.jpeg

1. 车牌颜色提取原理

车牌区域具有明显的特点,因此根据车牌底色、字色等有关知识,可采用彩色像素点统计的方法分割出合理的车牌区域。本案例以蓝底白字的普通车牌为例说明彩色像素点统计的分割方法,假设经摄像头拍摄采集得到了包含车牌的 RGB 彩色图像,水平方向记为y,垂直方向记为x。首先,确定车牌底色 RGB 各分量分别对应的颜色范围;其次,在y方向统计此颜色范围内的像素点数量,设定合理的阈值,确定车牌在 y方向的合理区域。然后,在分割出的y方向区域内统计X方向此颜色范围内的像素点数量,设定合理的阈值进行定位。最后,根据x、y方向的范围来确定车牌区域,实现定位。

2. Matlab代码实现

clear
clc
I = imread('1.jpg'); 
%% 根据图像宽度设置处理参数,对应蓝色区域
if size(I, 2) > 900
    parm = [0.35 0.9 90 0.35 0.7 90 2];
end
if size(I, 2) > 700 && size(I, 2) < 900
    parm = [0.6 0.9 90 0.6 0.8 90 0.5];
end
if size(I, 2) > 500 && size(I, 2) < 700
    parm = [0.5 0.54 50 0.6 0.7 50 3];
end
if size(I, 2) < 500
    parm = [0.8 0.9 150 0.8 0.9 150 3];
end
%% 行(Y)过滤结果
[y, x, z] = size(I); %读取yxz三个方向的深度
myI = double(I); 
Blue_y = zeros(y, 1);
%for循环对满足条件的像素点的行对应的个数进行统计
for i = 1 : y
    for j = 1 : x
        rij = myI(i, j, 1)/(myI(i, j, 3)+eps);
        gij = myI(i, j, 2)/(myI(i, j, 3)+eps);
        bij = myI(i, j, 3);
        %蓝色RGB的灰度范围
        if (rij < parm(1) && gij < parm(2) && bij > parm(3)) ...
                || (gij < parm(1) && rij < parm(2) && bij > parm(3))
            Blue_y(i, 1) = Blue_y(i, 1) + 1; %蓝色像素点统计
        end
    end
end
%Y方向车牌区域确定
[~, MaxY] = max(Blue_y);
Th = parm(7);
%向上追溯,直到车牌区域上边界
PY1 = MaxY;
while ((Blue_y(PY1,1)>Th) && (PY1>1))
    PY1 = PY1 - 1;
end
%向下追溯,直到车牌区域下边界
PY2 = MaxY;
while ((Blue_y(PY2,1)>Th) && (PY2<y))
    PY2 = PY2 + 1;
end
%对车牌区域进行修正
PY1 = PY1 - 2;
PY2 = PY2 + 2;
if PY1 < 1
    PY1 = 1;
end
if PY2 > y
    PY2 = y;
end
IY = I(PY1:PY2, :, :); %车牌区域
figure
imshow(IY); title('行过滤结果', 'FontWeight', 'Bold');
%% 列(X)过滤结果
Blue_x = zeros(1,x);
for j = 1:x
    for i = PY1:PY2
        rij = myI(i, j, 1)/(myI(i, j, 3)+eps);
        gij = myI(i, j, 2)/(myI(i, j, 3)+eps);
        bij = myI(i, j, 3);
        %蓝色RGB的灰度范围
        if (rij < parm(4) && gij < parm(5) && bij > parm(6)) ...
                || (gij < parm(4) && rij < parm(5) && bij > parm(6))
            Blue_x(1,j) = Blue_x(1,j) + 1; 
        end
    end
end
%向右追溯,直到车牌区域左边界
PX1 = 1;
while (Blue_x(1,PX1)<Th) && (PX1<x)
    PX1 = PX1 + 1;
end
%向左追溯,直到车牌区域右边界
PX2 = x;
while (Blue_x(1,PX2)<Th) && (PX2>PX1)
    PX2 = PX2 - 1;
end
%对车牌区域进行修正
PX1 = PX1 - 2;
PX2 = PX2 + 2;
if PX1 < 1
    PX1 = 1;
end
if PX2 > x
    PX2 = x;
end
%得到车牌区域
IX = I(:, PX1:PX2, :);
figure
imshow(IX); title('列过滤结果', 'FontWeight', 'Bold');
%%
Plate = I(PY1:PY2, PX1:PX2, :);
Loc.row = [PY1 PY2];
Loc.col = [PX1 PX2];
%%
figure;    
imshow(I); title('原图像', 'FontWeight', 'Bold'); 
hold on;
row = Loc.row;
col = Loc.col;
plot([col(1) col(2)], [row(1) row(1)], 'r-', 'LineWidth', 3);
plot([col(1) col(2)], [row(2) row(2)], 'r-', 'LineWidth', 3);
plot([col(1) col(1)], [row(1) row(2)], 'r-', 'LineWidth', 3);
plot([col(2) col(2)], [row(1) row(2)], 'r-', 'LineWidth', 3);
hold off;
figure
imshow(Plate); title('分割结果', 'FontWeight', 'Bold');

3、运行结果

f6c9c3375b0e3a24d04a01cdd983ab91.png

4. 总结

本文介绍了如何使用Matlab来提取蓝色车牌。通过设置阈值,我们可以快速、简单地实现车牌颜色的提取。这对于车牌识别等应用具有重要意义。需要注意的是,在实际应用中,由于光照、车速等因素的干扰,车牌的图像可能存在一定的形变、旋转等问题,因此需要进行图像校正和处理,以保证分割的准确性和稳定性。关于图像校正可参考下面的文章:

https://blog.csdn.net/qq_41301570/article/details/131615671

最后:

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

4155aaade9384c8d9b935f62c059d43a.png

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MatpyMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值