车牌号识别
题目
思路
1.读取车牌图片,转为灰度图
2.经过图像膨胀、腐蚀并转为二值图
3.黑白对调并除去多余的部分
4.切割出车牌部分
5.把每一个字符切割出来
6.与模板库图片对比识别出结果
代码
%读取车牌图片
im=imread("CarLicensePlate.jpg");
imshow(im),title('车牌');
%转为灰度图
im=rgb2gray(im);
imshow(im);title('灰度图');
%图像膨胀
D=strel('square',12);
L=strel('square',13);
[M,N]=size(im);
im=imdilate(im,D);
imshow(im);title('图像膨胀');
%除去上边框
for i=1:15
for j=1:N
im(i,j)=256;
end
end
imshow(im);title('除去上边框');
%转为二值图
im=imbinarize(im);
imshow(im);title('二值图');
%图像腐蚀
im=imerode(im,L);
imshow(im);title('图像腐蚀');
%将黑白对调
for i=1:M
for j=1:N
if im(i,j)==0
im(i,j)=1;
else
im(i,j)=0;
end
end
end
imshow(im);title('黑白对调');
%除去多余部分
im=bwareaopen(im,1500);
imshow(im);title('除去多余部分');
%切割车牌字符部分
im=remove_extra_region(im);
imshow(im);title('切割车牌字符部分');
%切割出每一个字符(垂直投影法)
imh=sum(im,1);
imL=size(imh,2);
s=zeros(1,imL);
for i=1:imL
if imh(1,i)>0
s(1,i)=1;
end
end
diff_s=diff(s,1,2);
diff_s=abs(diff_s);
su=0;
for i=1:imL-1
if diff_s(1,i)==1
su=su+1;
end
end
cut=zeros(1,su);
j=1;
for i=1:imL-1
if diff_s(1,i)==1
cut(1,j)=i;
j=j+1;
end
end
Im=zeros(133,55,6);
for i=1:6
Im(:,:,i)=imresize(im(:,cut(1,2*i-1)+2:cut(1,2*i)-1),[133,55]);
end
figure(1);
subplot(171);imshow(Im(:,:,1));
title('切割单个字符');
subplot(172);imshow(Im(:,:,2));
subplot(173);imshow(Im(:,:,3));
subplot(174);imshow(Im(:,:,4));
subplot(175);imshow(Im(:,:,5));
subplot(176);imshow(Im(:,:,6));
%识别并显示
for i=1:6
I(i)=identify(Im(:,:,i));
end
disp(I)
msgbox({'识别结果';I})
function I=remove_extra_region(I2)%切割出车牌部分
projection_h = sum(I2,1);
projection_v = sum(I2,2);
for i=1:size(projection_v,1)
if projection_v(i,1) >= 1
new.rowa = i;
break;
end
end
for i=1:size(projection_v,1)
j = size(projection_v,1) - i+1;
if projection_v(j,1) >= 1
new.rowb = j;
break;
end
end
for i=1:size(projection_h ,2)
if projection_h(1,i) >= 1
new.cola = i-1;
break;
end
end
for i=1:size(projection_h ,2)
j = size(projection_h ,2)-i+1;
if projection_h(1,j) >= 1
new.colb = j+1;
break;
end
end
I = I2(new.rowa:new.rowb, new.cola:new.colb);
end
%识别
function result=identify(ch)
flag=0;
c = {'津','鄂','京','辽','鲁','陕','豫','粤','浙'};
Chinese = LoadChinese();
Letter = LoadLetter();
DigitLetter = LoadDigitLetter();
[height,width, num] = size(Chinese);
for n=1:num
sums = 0;
for h=1:height
for w=1:width
if ch(h,w)==Chinese(h,w,n)
sums = sums + 1;
end
end
end
if sums>=5000
result = cell2mat(c(n));
flag=1;
break
end
end
if flag==0
[height,width, num] = size(Letter);
for n=1:num
sums = 0;
for h=1:height
for w=1:width
if ch(h,w)==Letter(h,w,n)
sums = sums + 1;
end
end
end
if sums>=5800
base = 64;
result = char(base + n);
flag=1;
break
end
end
end
if flag==0
[height,width, num] = size(DigitLetter);
for n=1:num
sums = 0;
for h=1:height
for w=1:width
if ch(h,w)==DigitLetter(h,w,n)
sums = sums + 1;
end
end
end
if sums>=5300
if n<=10
base = 47;
result = char(base + n);
else
base = 64;
result = char(base + n);
end
end
end
end
end
%加载模板库
function Chinese = LoadChinese()%加载汉字
i=imbinarize(imread('模板库/汉字/津.jpg'));
i=i(:,:,1);Chinese(:,:,1) = imresize(i,[133,55],'bilinear'); % 津
i=imbinarize(imread('模板库/汉字/鄂.jpg'));
i=i(:,:,1);Chinese(:,:,2) = imresize(i,[133,55],'bilinear'); % 鄂
i=imbinarize(imread('模板库/汉字/京.jpg'));
i=i(:,:,1);Chinese(:,:,3) = imresize(i,[133,55],'bilinear'); % 京
i=imbinarize(imread('模板库/汉字/辽.jpg'));
i=i(:,:,1);Chinese(:,:,4) = imresize(i,[133,55],'bilinear'); % 辽
i=imbinarize(imread('模板库/汉字/鲁.jpg'));
i=i(:,:,1);Chinese(:,:,5) = imresize(i,[133,55],'bilinear'); % 鲁
i=imbinarize(imread('模板库/汉字/陕.jpg'));
i=i(:,:,1);Chinese(:,:,6) = imresize(i,[133,55],'bilinear'); % 陕
i=imbinarize(imread('模板库/汉字/豫.jpg'));
i=i(:,:,1);Chinese(:,:,7) = imresize(i,[133,55],'bilinear'); % 豫
i=imbinarize(imread('模板库/汉字/粤.jpg'));
i=i(:,:,1);Chinese(:,:,8) = imresize(i,[133,55],'bilinear'); % 粤
i=imbinarize(imread('模板库/汉字/浙.jpg'));
i=i(:,:,1);Chinese(:,:,9) = imresize(i,[133,55],'bilinear'); % 浙
end
function letter = LoadLetter()%加载字母
i=imbinarize(imread('模板库/字母/A.jpg'));
i=i(:,:,1);letter(:,:,1)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/B.jpg'));
i=i(:,:,1);letter(:,:,2)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/C.jpg'));
i=i(:,:,1);letter(:,:,3)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/D.jpg'));
i=i(:,:,1);letter(:,:,4)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/E.jpg'));
i=i(:,:,1);letter(:,:,5)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/F.jpg'));
i=i(:,:,1);letter(:,:,6)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/G.jpg'));
i=i(:,:,1);letter(:,:,7)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/H.jpg'));
i=i(:,:,1);letter(:,:,8)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/I.jpg'));
i=i(:,:,1);letter(:,:,9)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/J.jpg'));
i=i(:,:,1);letter(:,:,10)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/K.jpg'));
i=i(:,:,1);letter(:,:,11)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/L.jpg'));
i=i(:,:,1);letter(:,:,12)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/M.jpg'));
i=i(:,:,1);letter(:,:,13)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/N.jpg'));
i=i(:,:,1);letter(:,:,14)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/O.jpg'));
i=i(:,:,1);letter(:,:,15)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/P.jpg'));
i=i(:,:,1);letter(:,:,16)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/Q.jpg'));
i=i(:,:,1);letter(:,:,17)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/R.jpg'));
i=i(:,:,1);letter(:,:,18)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/S.jpg'));
i=i(:,:,1);letter(:,:,19)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/T.jpg'));
i=i(:,:,1);letter(:,:,20)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/U.jpg'));
i=i(:,:,1);letter(:,:,21)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/V.jpg'));
i=i(:,:,1);letter(:,:,22)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/W.jpg'));
i=i(:,:,1);letter(:,:,23)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/X.jpg'));
i=i(:,:,1);letter(:,:,24)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/Y.jpg'));
i=i(:,:,1);letter(:,:,25)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/字母/Z.jpg'));
i=i(:,:,1);letter(:,:,26)=imresize(i,[133,55],'bilinear');
end
function digit = LoadDigitLetter()%加载数字
i=imbinarize(imread('模板库/数字/0.jpg'));
i=i(:,:,1);digit(:,:,1)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/1.jpg'));
i=i(:,:,1);digit(:,:,2)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/2.jpg'));
i=i(:,:,1);digit(:,:,3)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/3.jpg'));
i=i(:,:,1);digit(:,:,4)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/4.jpg'));
i=i(:,:,1);digit(:,:,5)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/5.jpg'));
i=i(:,:,1);digit(:,:,6)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/6.jpg'));
i=i(:,:,1);digit(:,:,7)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/7.jpg'));
i=i(:,:,1);digit(:,:,8)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/8.jpg'));
i=i(:,:,1);digit(:,:,9)=imresize(i,[133,55],'bilinear');
i=imbinarize(imread('模板库/数字/9.jpg'));
i=i(:,:,1);digit(:,:,10)=imresize(i,[133,55],'bilinear');
end