Matlab图像处理——蓝色车牌的提取 (qq.com)
在现代社会中,车牌识别已经成为交通管理和安全监控中一个重要的工具。车牌提取是车牌识别中的一个关键步骤,通过提取车牌可以去除非车牌区域带来的干扰,从而更加快速准确的识别车牌。这篇文章将介绍如何使用Matlab来提取蓝色车牌。
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、运行结果
4. 总结
本文介绍了如何使用Matlab来提取蓝色车牌。通过设置阈值,我们可以快速、简单地实现车牌颜色的提取。这对于车牌识别等应用具有重要意义。需要注意的是,在实际应用中,由于光照、车速等因素的干扰,车牌的图像可能存在一定的形变、旋转等问题,因此需要进行图像校正和处理,以保证分割的准确性和稳定性。关于图像校正可参考下面的文章:Matlab图像处理——文档图像倾斜角检测及校正
小英熊学长会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!有任何matlab和python相关的问题都可以在后台滴滴小英熊学长欧~