Matlab提取车牌信息
分析:
1)当我们得到带有汽车车牌号信息的图片时,会发现,大面积的背景都是需要去除的,此时,想到顶帽操作。
顶帽操作的作用:去背景,使白色边界更清晰。
顶帽操作作用对象是灰度图,首先把原图转化为灰度图后顶帽操作。
顶帽操作是原图减去开运算,开运算是先腐蚀后膨胀,被原图减去过之后,就是我们的目标部分。Strel()函数参数的选择根据即为顶帽操作的原理,参照标准为目标图像。
若目标图像上出现小坑洞说明值disk值太小;
若目标图像上出现光晕说明disk值取大了。
顶帽操作最终效果为:想要的部分很清晰,其他部分很少且小。
轻微去除小对象后,提取边缘信息。再去除小对象。
提取边缘信息:汉字和数字的边缘信息丰富
经测试不进行边缘信息提取最终会发现有粘连,个人认为多调调去除小对象也是会得到目标图像的。建议进行边缘信息提取。
%分析:要汽车车牌号,其他部分都是背景,去背景采用顶帽操作(原图-开运算(先腐蚀后膨胀))
clear,clc,close all;
f=imread('c4.jpg');
g=rgb2gray(f);%顶帽操作作用对象是灰度图
figure,imshow(g);
gth=imtophat(g,strel('disk',6));%顶帽操作去背景,strel以想要的东西为参照进行取值
%若得到的图出现小坑洞,说明值太小;出现光晕说明值太大;当想要的东西很清晰,零星的东西很少时,转换成二值图
% bw=im2bw(gth);figure,imshow(bw);
bw=im2bw(gth,0.3);figure,imshow(bw);%白色更明显
%去除小对象
bwao=bwareaopen(bw,20);%调制的时候注意目标部分不要受损
figure,imshow(cat(2,bw,bwao));
%PS:数字和汉字的边缘信息最多,进行边缘信息提取
bwedge=edge(bwao);figure,imshow(bwedge);
%再去除小对象
bwao=bwareaopen(bwedge,20);
figure,imshow(bwao),title('提取边缘信息再去除小对象');
%数字中的竖线信息最多,用小短线进行腐蚀,腐蚀掉非数字部分
bwerode=imerode(bwao,strel('line',5,90));
figure,imshow(bwerode),title('小短线腐蚀后的图像');
%通过膨胀使咱们的车牌连起来,再去除小对象
bwdilate=imdilate(bwerode,strel('disk',25));
figure,imshow(bwdilate),title('进行边缘提取后膨胀后的图像');
bwao=bwareaopen(bwdilate,20000);
figure,imshow(bwao),title('再一次去除小对象');
%最后通过找到车牌行列坐标,进行截取,然后就完成了呢。
[r,c]=find(bwao);
result=f(min(r):max(r),min(c):max(c));
figure,imshow(result);
figure,imshow(cat(2,bw,result));
PS:cat函数只能连接维度相同的图像