本文地址:http://blog.csdn.net/shanglianlm/article/details/78005815
本文主要处理汽车车牌的识别过程,包括三个步骤,一:车牌区域检测,本文利用车牌的颜色和形状特征确认并获取汽车的车牌位置,二:字符分割,将获取到的汽车车牌按不同字符进行切割,三:车牌识别,最后利用神经网络对切割的字符进行识别达到最终的车牌识别。
一 车牌区域检测
1 首先读入我们要识别的车辆图片,灰度化后,我们使用robert算子对其进行边缘检测;如下图
代码如下:
file='2.jpg';
I=imread(file);
I1=rgb2gray(I);
I2=edge(I1,'roberts',0.08,'both');
2 接着我们对图像进行腐蚀,除去图像中一些不必要的信息,然后我们再对图像进行闭合操作使其区域平滑。
se=[1;1;1];
I3=imerode(I2,se);
se=strel('rectangle',[40,40]);%生成一个矩阵
I4=imclose(I3,se); %闭运算
由此,我们根据图像的形状可以获取到这些信息。
3 这里我们主要处理小型汽车,即车牌规格为: 440×140 蓝底白字白框线,因此我们获取图像中的蓝色区域,同时腐蚀再闭合,与我们第二步中得到的图像求并,但是我们可以还留存一些小的无用区域,我们还需要对获得的图像进行过滤,去掉小的结构,即得到我们所要获取的车牌区域,如下图
代码如下:
I5=removeByColor(I4,I,'12');
I6=bwareaopen(I5,2000);
代码如下:
[a,b]=find(I6>0);
I7 = I1(unique(a),unique(b));
I8 = I(unique(a),unique(b),:);
5 获取到的图像可能会有一定的倾斜,我们还需要对其校正,我们可以使用Radon transform在0-180度上找到图像可能最大的倾斜角度, 然后对图像校正,如上图。
其他代码如下:
获取颜色线索
function im = removeByColor(image,I,removedColor)
% image: 灰度图 x*y
% I: 原始图像 x*y*3
% removedColor:要移除的颜色 1 蓝色、2 黄色、3 白色、4 黑色 默认蓝黄 12
if nargin < 3
removedColor = '12';
end
%大型汽车 440×140 黄底黑字黑框线
%小型汽车 440×140 蓝底白字白框线
diff_Y=0; diff_B=0;
%获取蓝色
Image_B=I;
IR = Image_B(:,:,1);IG = Image_B(:,:,2);IB = Image_B(:,:,3);
XYB=~((IB-IR)>diff_B&(IB-IG)>diff_B); % 提取蓝色条件是B分量与G、R分量差值大于设定
IR(XYB)=255; IG(XYB)=255; IB(XYB)=255; % 使得非蓝色区域变为灰色
Image_B(:,:,1)=IR; Image_B(:,:,2)=IG; Image_B(:,:,3)=IB;
Image_B_gray=rgb2gray(Image_B);
stre=[1;1;1];
Image_B_erode=imerode(Image_B_gray,stre);
stre=strel('rectangle',[20,20]);%生成一个矩阵
Image_B_new=imclose(Image_B_erode,stre); %闭运算
thresh = graythresh(Image_B_new); %自动确定二值化阈值
bw_Image_B = im2bw(Image_B_new,thresh); %对图像二值化
im = (~bw_Image_B)ℑ
end
最后显示
figure(1),
subplot(3,3,1),imshow(I),title('原图');hold on;
subplot(3,3,2),imshow(I1),title('灰度图');hold on;
subplot(3,3,3),imshow(I2),title('robert算子边缘检测');hold on;
subplot(3,3,4),imshow(I3),title('腐蚀后图像');hold on;
subplot(3,3,5),imshow(I4),title('平滑图像的轮廓');hold on;
subplot(3,3,6),imshow(I5),title('加入颜色线索');hold on;
subplot(3,3,7),imshow(I6),title('从对象中移除小对象');hold on;
subplot(3,3,8),imshow(I7),title('车牌对象');hold on;
subplot(3,3,9),imshow(I8),title('获取到的车牌');hold on;