车牌定位分割识别程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录A
%主函数
function [d]=main(jpg)
close all
clc
I=imread('car1.jpg');
figure(1),imshow(I);title('原图')
I1=rgb2gray(I); %将RGB图形或色图矩阵转换成灰度图
figure(2),subplot(1,2,1),imshow(I1);title('灰度图');
figure(2),subplot(1,2,2),imhist(I1);title('灰度图直方图');
I2=edge(I1,'robert',0.15,'both');%提取I1的边缘,利用robert算子
figure(3),imshow(I2);title('robert算子边缘检测')
se=[1;1;1]; %结构矩阵,用于图像的腐蚀
I3=imerode(I2,se);%以图像I2和结构元素SE为参数调用imerode函数进行腐蚀操作
figure(4),imshow(I3);title('腐蚀后图像');
se=strel('rectangle',[25,25]);
I4=imclose(I3,se); %形态学中的闭运算,se为结构元素
figure(5),imshow(I4);title('平滑图像的轮廓');
I5=bwareaopen(I4,2000);
figure(6),imshow(I5);title('从对象中移除小对象');
[y,x,z]=size(I5); %读取I5的大小,行列页
myI=double(I5); %将I5元素转为double型
tic %计时开始
Blue_y=zeros(y,1); %给蓝色像素个数赋初始值0
for i=1:y
for j=1:x % 这两行是循环,先行,再列
if(myI(i,j,1)==1) % 如果I5第一页中的元素为1的话,则是蓝色像素
Blue_y(i,1)= Blue_y(i,1)+1;%蓝色像素点统计
end
end
end
[temp MaxY]=max(Blue_y);%Y方向车牌区域确定,temp为最大值,MaxY为最大值位置
PY1=MaxY; %最大值的位置赋给PY1
while ((Blue_y(PY1,1)>=5)&&(PY1>1))
PY1=PY1-1;
end % 这个循环是在Y方向,向上求离最大值最近的像素小于5的点的位置,存在PY1中
PY2=MaxY;
while ((Blue_y(PY2,1)>=5)&&(PY2 PY2=PY2+1; end %这个循环是在Y方向,向下求离最大值最近的像素小于5的点的位置,存在PY2中 IY=I(PY1:PY2,:,:); %截取PY1和PY2之间的像素矩阵,X方向暂不限制。 %因为车牌是个矩形,%是原图像中矩阵的一部分,所以要将其提取出来, %先确定Y方向上取值的区间,再确定X方向。 %%%%%% X方向%%%%%%%%% Blue_x=zeros(1,x);%进一步确定x方向的车牌区域 for j=1:x for i=PY1:PY2 %简单起见,只取PY1到PY2,减少计算量 if(myI(i,j,1)==1) Blue_x(1,j)= Blue_x(1,j)+1; end end end PX1=1; while ((Blue_x(1,PX1)<3)&&(PX1 PX1=PX1+1; end PX2=x; while ((Blue_x(1,PX2)<3)&&(PX2>PX1)) PX2=PX2-1; end %这里和求Y方向的方法一样 PX1=PX1-1;%对车牌区域的校正 PX2=PX2+1; dw=I(PY1:PY2-8,PX1:PX2,:); %车牌矩阵存在变量dw中 t=toc; % 计时结束,输出运行时间 figure(7),subplot(1,2,1),imshow(IY),title('行方向合理区域'); figure(7),subplot(1,2,2),imshow(dw),title('定位剪切后的彩色车牌图像') imwrite(dw,'dw.jpg'); [filename,filepath]=uigetfile('dw.jpg','输入一个定位裁剪后的车牌图像'); jpg=strcat(filepath,filename); a=imread('dw.jpg'); b=rgb2gray(a); imwrite(b,'1.车牌灰度图像.jpg'); figure(8);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,'2.车牌二值图像.jpg'); figure(8);subplot(3,2,2),imshow(d),title('2.车牌二值图像') figure(8),subplot(3,2,3),imshow(d),title('3.均值滤波前') % 滤波 h=fspecial('average',3); d=im2bw(round(filter2(h,d))); imwrite(d,'4.均值滤波后.jpg'); figure(8),subplot(3,2,4),imshow(d),title('4.均值滤波后') % 某些图像进行操作 % 膨胀或腐蚀 % se=strel('square',3); % 使用一个3X3的正方形结果元素对象对创建的图像进行膨胀 % 'line'/'diamond'/'ball'... se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵 [m,n]=size(d); if bwarea(d)/m/n>=0.365 d=imerode(d,se);