视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于Matlab的车牌识别实现源码
2025-10-05 00:52:21 责编:小OO
文档
function[]=main(jpg)

close all

clc

t测定算法执行的时间

[fn,pn]=uigetfile('timg1,jpg','选择图片')  %读入图片

I=imread([pn,fn]);

figure,imshow(I);title('原始图像'显示原始图像

Im1=rgb2gray(I);

figure(2),

subplot(1,2,1),

imshow(Im1);

title('灰度图');

figure(2),

subplot(1,2,2),

imhist(Im1);

title('灰度图的直方图'显示图像的直方图

Tiao=imadjust(Im1,[0.19,0.78],[0,1]);  %调整图片

figure(3),

subplot(1,2,1),

imshow(Tiao);title('增强灰度图');

figure(3),

subplot(1,2,2),

imhist(Tiao);

title('增强灰度图的直方图');

Im2=edge(Tiao,'Roberts','both');  %使用sobel算子进行边缘检测

figure(4),

imshow(Im2);

title('sobel算子实现边缘检测')

se=[1;1;1];

Im3=imerode(Im2,se);

figure(5),

imshow(Im3);

title('腐蚀效果图');

se=strel('square',40);%'rectangle',[25,25]/'diamond',25/

Im4=imclose(Im3,se);

figure(6),

imshow(Im4);

title('平滑图像的轮廓');

Im5=bwareaopen(Im4,1500);

figure(7),

imshow(Im5);

title('移除小对象');

[y,x,z]=size(Im5);  %返回Im5各维的尺寸,并存储在变量y、x、z中

Im6=double(Im5); %将Im5换成双精度数值

 开始横向扫描

tic  %tic计时开始,toc结束,计算tic与toc之间程序的运行时间

Blue_y=zeros(y,1); %产生y*1的全0矩阵

for i=1:y %逐行扫描

 如果Im6图像中坐标为(i,j)的点值为1,即为移除小对象的白色区域, 

 则y*1列矩阵的相应像素点的元素值加1,

   end    

end

 [temp MaxY]=max(Blue_y);%temp为向量Blue_y的矩阵中的最大值,MaxY为该值的索引(最大值在向量中的位置)

%返回包含最大元素的列,即白色区域最宽的列

%Y方向车牌区域确定

figure(8),subplot(1,2,1),

plot(0:y-1,Blue_y),title('行方向白色像素点累计'),xlabel('行数'),ylabel('个数');

PY1=MaxY;

while ((Blue_y(PY1,1)>=120)&&(PY1>1))

end

PY2=MaxY;

while ((Blue_y(PY2,1)>=40)&&(PY2end

IY=I(PY1:PY2,:,:);

%IY为原始图像I中截取的纵坐标在PY1:PY2之间的部分

%横向扫描完成,开始纵向扫描

Blue_x=zeros(1,x);%进一步确定x方向的车牌区域

for j=1:x %逐列扫描

 根据Im5的x值确定

     end       

end

figure(8),subplot(1,2,2),

plot(0:x-1,Blue_x),title('列方向白色像素点累计'),xlabel('列数'),ylabel('个数');

PX1=1;

while ((Blue_x(1,PX1)<3)&&(PX1end

PX2=x;

while ((Blue_x(1,PX2)<3)&&(PX2>PX1))

end

 纵向扫描

PX1=PX1-2;%对车牌区域的校正

PX2=PX2+2;

dw=I(PY1:PY2,PX1:PX2,:);

t=toc;

figure(9),subplot(1,2,1),imshow(IY),title('垂直方向合理区域');

figure(9),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像')

将图像写入图形文件中

b=rgb2gray(a);

imwrite(b,'车牌灰度图像

figure(10);

subplot(3,2,1),

imshow(b),

title('1.车牌灰度图像')

g_max=double(max(max(b)));

g_min=double(min(min(b)));

T=round(g_max-(g_max-g_min)/3);  %T为设定的二值化的阈值,返回一个四舍五入的整数值

[m,n]=size(b);

d=(double(b)>=T); %d为二值图像

imwrite(d,'车牌二值图像

figure(10);

subplot(3,2,2),

imshow(d),

title('2.车牌二值图像')

figure(10),

subplot(3,2,3),

imshow(d),

title('3.均值滤波前')

h=fspecial('average',3);%建立预定义的滤波算子,average为均值滤波,模板尺寸为3*3

d=imbinarize(round(filter2(h,d))); %im2bw,使用指定的滤波器h对h进行d即均值滤波

imwrite(d,'均值滤波后

figure(10),

subplot(3,2,4),

imshow(d),

title('4.均值滤波后')

se=eye(2);%单位矩阵

[m,n]=size(d); %d为二值图像,返回信息矩阵

if bwarea(d)/m/n>=0.365%二值图像中对象的总面积与整个面积的比大于0.365

 进行腐蚀

elseif bwarea(d)/m/n<=0.235%二值图像中对象的总面积与整个面积的比值小于0.235

 进行膨胀

end

imwrite(d,'膨胀或腐蚀处理后

figure(10),

subplot(3,2,5),

imshow(d),

title('5.膨胀或腐蚀处理后

d=qiege(d); %切割,寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割

[m,n]=size(d);

k1=1;k2=1;s=sum(d);j=1;

while j~=n

end

d=qiege(d);

y1=10;y2=0.25;flag=0;word1=[];

while flag==0

 扫过的地方不全为黑色,向右移动,直到不是停止

 如果wide小于y1时,从数值判断没有切好,认为是左干扰 

 将此片区域全部转化为黑色,

 重新切割

 返回已经切割好的区域

 统计切割区域所有元素

 统计切割区域1/3至2/3行所有元素

end

[word2,d]=getword(d); %分割出第二个字符

[word3,d]=getword(d); %分割出第三个字符

[word4,d]=getword(d); %分割出第四个字符

[word5,d]=getword(d); %分割出第五个字符

[word6,d]=getword(d); %分割出第六个字符

[word7,d]=getword(d); %分割出第七个字符

word1=imresize(word1,[40 20]);%模板字符大小统一为40*20,为字符辨认做准备

word2=imresize(word2,[40 20]);

word3=imresize(word3,[40 20]);

word4=imresize(word4,[40 20]);

word5=imresize(word5,[40 20]);

word6=imresize(word6,[40 20]);

word7=imresize(word7,[40 20]);

figure(11);

subplot(2,7,1),imshow(word1),title('1');

subplot(2,7,2),imshow(word2),title('2');

subplot(2,7,3),imshow(word3),title('3');

subplot(2,7,4),imshow(word4),title('4');

subplot(2,7,5),imshow(word5),title('5');

subplot(2,7,6),imshow(word6),title('6');

subplot(2,7,7),imshow(word7),title('7');

liccode=char(['0':'9' 'A':'Z' '辽粤豫鄂鲁陕京津苏浙']);

%建立自动识别字符代码表,将t'0':'9' 'A':'Z' '鲁陕苏豫'多个字符串组成一个字符数组,每行对应一个字符串,字符数不足的自动补空格

SubBw2=zeros(40,20);%40*20的零矩阵

l=1;

for I=1:7

 整型转换字符串

 改变图片的大小

 将灰度图转化为二值图像,double产生0-255的灰度值

 第一位汉字识别

 模板中汉字所在的位置

 第二位字母识别

 字母位置

 第三位后字母或数字识别

 字符模板

 将模板转换为二值图,double产生0-255的灰度值

 相当于两幅图相减得第三幅图

 模板对应的字符模板进行匹配选择

end

msgbox(Code,'识别结果')

function [word,result]=getword(d) %定义分割字符用函数(1)

word=[];flag=0;y1=8;y2=0.5;

while flag==0

 用于返回图像的一个裁剪区域

 用于返回图像的一个裁剪区域

 宽度过小,或长大于宽的两倍

 中所有元素之和

 切割出最小范围

 划分出的temp进行切割

 切割完后该区域变为黑色

end

result=d;

f定义分割字符用函数(2)

[m,n]=size(d);

top=1;bottom=m;left=1;right=n; %inte

while sum(d(top,:))==0 && top<=m

end

while sum(d(bottom,:))==0 && bottom>=1

end

while sum(d(:,left))==0 && left<=n

end

while sum(d(:,right))==0 && right>=1

end

dd=right-left;

hh=bottom-top;

e=imcrop(d,[left top dd hh]);

//字符实别需要字符图库,没有对照图库是识别不了的下载本文

显示全文
专题