基于Matlab的车牌号识别

车牌号识别

题目

在这里插入图片描述

思路

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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值