首页 > 其他分享 >《数字图像处理》课程设计——MATLAB车牌识别

《数字图像处理》课程设计——MATLAB车牌识别

时间:2024-12-18 16:57:58浏览次数:6  
标签:课程设计 end title I1 数字图像处理 灰度 MATLAB 图像 车牌

本文使用MATLAB实现了车牌识别功能并设计了GUI界面便于人机交互。

是以其他作者代码为蓝本编写,原始出处查询不到了,如有侵权请告知。

下面是部分代码:

首先,载入原始图片,这里采用的是[filename,filepath],可用于直接弹出对话框的选择图片,比较方便。

%自动弹出提示框读入图像
 [filename,filepath]=uigetfile('.jpg','输入一个需要识别的车牌图像');% 直接自动读入%
 file=strcat(filepath,filename); %strcat函数:连接字符串;把filepath的字符串与filename的连接,即路径/文件名
 I=imread(file);
 figure('name','原图'),imshow(I);title('原图')

接下来就是对图像进行处理阶段,主要经过灰度变换,中值滤波等手段。

彩色图像包含着大量的颜色信息,不但在存储上开销很大,而且在处理上也会降低系统的执行速度,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。由彩色转换为灰度的过程叫做灰度化处理。选择的标准是经过灰度变换后,像素的动态范围增加,图像的对比度扩展,使图像变得更加清晰、细腻、容易识别。

I1=rgb2gray(I); % RGB图像转灰度图像
 % %figure('name','灰度处理前'),subplot(1,2,1),imshow(I1);title('灰度处理前的灰度图');
% % subplot(1,2,2),imhist(I1);title('灰度处理前的灰度图直方图');
%线性灰度变换
 I1=imadjust(I1,[0.3,0.7],[]);
 figure('name','灰度处理后'),subplot(1,2,1),imshow(I1);title('灰度处理后的灰度图');
 subplot(1,2,2),imhist(I1);title('灰度处理后的灰度图直方图');
%进行中值滤波
 I1=medfilt2(I1);
 figure,imshow(I1);title('中值滤波');

边缘检测

%边缘检测:sobel,roberts,canny,prewitt等
 I2=edge(I1,'roberts',0.25,'both'); %边缘检测算法,强度小于阈值0.15的边缘被省略掉,'both'两个方向检测(缺省默认)
figure('name','边缘检测'),imshow(I2);title('robert算子边缘检测') 

对牌照进行定位和切割。这里采用的是对蓝色像素点的采集判断,因为就中国地区而言绝大部分车牌的底色的蓝色的,虽然算法很快很识别出大区域蓝色,但缺点在于对蓝色车辆的车牌识别不是很好。

Blue_y=zeros(y,1);% zeros(M,N) 表示的是M行*N列的全0矩阵
 for i=1:y
     for j=1:x
          if(myI(i,j,1)==1) %% 判断蓝色像素
            Blue_y(i,1)= Blue_y(i,1)+1;% 蓝色像素点统计 
          end  
      end       
 end
 [temp MaxY]=max(Blue_y);% Y方向车牌区域确定 [temp MaxY]临时变量MaxY
 PY1=MaxY;  % 以下为找车牌Y方向最小值
 while ((Blue_y(PY1,1)>=5)&&(PY1>1))%% 为什么判断蓝色像素点>=5(才算蓝色)????
         PY1=PY1-1;
 end    
 PY2=MaxY; % 以下为找车牌Y方向最大值 ???难道最大值不是MaxY????
 while ((Blue_y(PY2,1)>=5)&&(PY2<y))
         PY2=PY2+1;
 end
 % IY=I(PY1:PY2,:,:);
 %%%%%%%%%%%%%%%%% X方向 %%%%%%%%%
 Blue_x=zeros(1,x);% 进一步确定x方向的车牌区域
 for j=1:x
      for i=PY1:PY2  % 只需扫描的行
          if(myI(i,j,1)==1) %% 判断蓝色像素
             Blue_x(1,j)= Blue_x(1,j)+1; % 蓝色像素点统计             
          end 
      end   
 end
 
 PX1=1;% 以下为找车牌X方向最小值
 while ((Blue_x(1,PX1)<5)&&(PX1<x))%% 为什么判断蓝色像素点<3(不算蓝色?)
        PX1=PX1+1;
 end    
 PX2=x;% 以下为找车牌X方向最大值
 while ((Blue_x(1,PX2)<3)&&(PX2>PX1))
         PX2=PX2-1;
 end
 PY1=PY1-2;% 对车牌区域的校正 
 PX1=PX1-2;
 PX2=PX2+3;
 PY2=PY2+10;

对图像进行裁剪,切割出牌照的彩色图像。

对牌照字符进行预处理,和对整体图像的处理相同,进行一系列灰度,中值滤波和膨胀腐蚀处理,使车牌的字符更加明显,有利于下一步的分割处理。

对牌照字符进行分割,其中的分割子程序的原理,寻找连续有文字的字块,若长度大于阈值,则认为有两个字符组成,需要切割,反之,则认为只有一个字符。

function e=qiege(d)
[m,n]=size(d);
top=1;bottom=m;left=1;right=n;   % init
while sum(d(top,:))==0 && top<=m
    top=top+1;
end
while sum(d(bottom,:))==0 && bottom>=1
    bottom=bottom-1;
end
while sum(d(:,left))==0 && left<=n
    left=left+1;
end
while sum(d(:,right))==0 && right>=1
    right=right-1;
end
dd=right-left;
hh=bottom-top;
e=imcrop(d,[left top dd hh]);

在主函数中调用切割子程序如下所示。

d=qiege(d);% 调用qiege()子程序
 [m,n]=size(d);
 figure,subplot(2,1,1),imshow(d),title(n)
 k1=1;k2=1;
 j=1;
 s=sum(d);%sum(x)

这里对字符的识别采用了模板相减的方法;对分割出的字符挨个与字符库中的字符进行模板对比,选择差别最小的进行确认,这种方法优点是简单快捷,缺点是识别率比较差。

 Dmax=0; % 与模板不同的点个数
             for k1=1:40
                 for l1=1:20
                     if  ( SubBw2(k1,l1) > 5 | SubBw2(k1,l1) < -5 ) % "|"/"||" 或操作 (>2 15)20以上无区别
                         Dmax=Dmax+1;
                     end
                 end
             end
             Error(k2)=Dmax; % 记录下字符与模板k2不同的点个数
         end      
         Error1=Error(kmin:kmax);
         MinError=min(Error1); % 差别最小的
         findc=find(Error1==MinError); % 找出差别最小的模板

最后将所得的车牌号码以文本形式写入excel表格中待后续的操作步骤。

xlswrite('C:\Users\MrLevo\Desktop\模式识别大作业_徐凯\车牌记录.xls',Code,'A1:M1');

标签:课程设计,end,title,I1,数字图像处理,灰度,MATLAB,图像,车牌
From: https://blog.csdn.net/Li8384/article/details/144547297

相关文章