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)&&(PY2 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)&&(PX1 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]); //字符实别需要字符图库,没有对照图库是识别不了的下载本文