当前位置: 华文星空 > 新闻

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

2024-01-30新闻

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相关的问题都可以在后台滴滴小英熊学长欧~