📄 mycarlocal.asv
字号:
clear;clc;close all
filename='126.jpg';
I=im2gray(filename);%调用自编函数读取图像,并转化为灰度图象;
tic %计时开始
[height,width]=size(I);
%预处理
I_edge=zeros(height,width);
for i=1:width-1
I_edge(:,i)=abs(I(:,i+1)-I(:,i));
end
I_edge=(255/(max(max(I_edge))-min(min(I_edge))))*(I_edge-min(min(I_edge)));%(255/max(I)-min(I))*(I-min(I))
imshow(I_edge)
[I_edge,y1]=select(I_edge,height,width); %%%%%%调用select函数
BW2 = I_edge;%
% I_edge = edge(I,'canny');
% imshow(I_edge)
% BW2 = I_edge;
%%%%%%%%%%%%%%%%一些形态学处理%%%%%%%%%%%%%%%%
SE=strel('rectangle',[10,10]);
IM2=imerode(BW2,SE);%imerode函数实现图像腐蚀
IM2=bwareaopen(IM2,20);%除去像素点少于20的区域
IM3=imdilate(IM2,SE);%函数实现膨胀
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%投影以粗略估计车牌位置
p_h=projection(double(IM3),'h'); %调用projection函数
if(p_h(1)>0)
p_h=[0,p_h]; %把水平投影的第1个值置0
end
p_v=projection(double(IM3),'v'); %调用projection函数
if(p_v(1)>0)
p_v=[0,p_v]; %把水平投影的第1个值置0
end
%%%%%%
p_h=double((p_h>5));
p_h=find(((p_h(1:end-1)-p_h(2:end))~=0)); %获取图中各个区域的边界横坐标
len_h=length(p_h)/2;
%%%%%
p_v=double((p_v>5));
p_v=find(((p_v(1:end-1)-p_v(2:end))~=0));%获取图中各个区域的边界纵坐标
len_v=length(p_v)/2;
%%%%%%%%%%%
%%%%%%%%%%%%%%%%%粗略计算车牌候选区
k=1;
for i=1:len_h
for j=1:len_v
s=IM3(p_h(2*i-1):p_h(2*i),p_v(2*j-1):p_v(2*j)); %对图象的各个区域求中值,如果中值大于0.01,则判定为车牌候选区
if(mean(mean(s))>0.1)
p{k}=[p_h(2*i-1),p_h(2*i)+1,p_v(2*j-1),p_v(2*j)+1];
k=k+1;
end
end
end
k=k-1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%进一步缩小车牌候选区,获取区域中心坐标和长宽比例%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:k
edge_IM3=double(edge(double(IM3(p{i}(1):p{i}(2),p{i}(3):p{i}(4))),'canny'));
[x,y]=find(edge_IM3==1);
p{i}=[p{i}(1)+min(x),p{i}(2)-(p{i}(2)-p{i}(1)+1-max(x)),...
p{i}(3)+min(y),p{i}(4)-(p{i}(4)-p{i}(3)+1-max(y))];
p_center{i}=[fix((p{i}(1)+p{i}(2))/2),fix((p{i}(3)+p{i}(4))/2)];%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标
p_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1)); %p_ratio为一矩阵,用来存放图像块的长宽比例
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%对上面参数和变量的说明:p为一胞元,用于存放每个图像块的左上和右下两个点的坐标;
%存放格式为:p{k}=[x1,x2,y1,y2];x1,x2分别为行坐标,y1,y2为列坐标
%p_center为一胞元,用于存放每个图像块的中心坐标,p_center{k}=[x,y];x,y分别为行,列坐标
%p_ratio为一矩阵,用来存放图像块的长宽比例
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%合并临近区域%%%%%%%
%如果有多个区域则执行合并
if k>1
n=0;
ncount=zeros(1,k);
for i=1:k-1
%%%需要调整if条件中的比例
%%%需要调整
%检查是否满足合并条件
if(abs(p{i}(1)+p{i}(2)-p{i+1}(1)-p{i+1}(2))<=height/30&&abs(p{i+1}(3)-p{i}(4))<=width/15)
p{i+1}(1)=min(p{i}(1),p{i+1}(1));
p{i+1}(2)=max(p{i}(2),p{i+1}(2));
p{i+1}(3)=min(p{i}(3),p{i+1}(3));
p{i+1}(4)=max(p{i}(4),p{i+1}(4)); %向后合并
n=n+1;
ncount(n)=i+1;
end
end
%如果有合并,求出合并后最终区域
if(n>0)
d_ncount=ncount(2:n+1)-ncount(1:n);%避免重复记录临近的多个区域。
index=find(d_ncount~=1);
m=length(index);
for i=1:m
pp{i}=p{ncount(index(i))};
%pp_center{i}=p_center{ncount(i)};
%重新记录合并区域的比例
pp_ratio(i)=(pp{i}(4)-pp{i}(3))/(pp{i}(2)-pp{i}(1));
end
p=pp;%更新区域记录
p_ratio=pp_ratio; %更新区域比例记录
clear pp;clear pp_ratio; %清除部分变量
end
end
k=length(p); %更新区域个数
%%%%%%%%%%%%%%合并结束%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%根据区域比例判断是否为车牌区域%%%%%%%%%%%%
m=1;T=0.6*max(p_ratio);%0.8参数需要调整
for i=1:k %车牌比例为40:14
if(p_ratio(i)>=T&p_ratio(i)<20) % 或者|Xmin-Xmax|<|Ymin-Ymax|,或者|Xmin-Xmax|/|Ymin-Ymax|>3。那么这个区域为非车牌区域
p1{m}=p{i};
m=m+1;
end
end
p=p1;clear p1;
k=m-1; %更新区域数
%%%%%%%%%%%判定结束%%%%%%%%%%%%%%%%%%%%%
toc %计时结束
clear edge_IM3;
clear x;
clear y; % 清空部分变量
%%%%%%%%%%%%%%%%显示
figure;
subplot(221);imshow(I);title('灰度图');
subplot(222);imshow(BW2);title('粗定位');
subplot(223);imshow(IM2);title('进一步定位');
subplot(224);imshow(IM3);title('形态学处理');
%%%%%%%%%%%%%%%%%对图象车牌区域的切割%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure;
for i=1:k
subplot(1,k,i);
index=p{i};
imshow(I(index(1)-2:index(2),index(3):index(4)));
end
if(k==1)
imwrite(I(index(1)-2:index(2),index(3):index(4)),'cp.jpg');title('车牌精确定位');
end
%%%%%%%%%%%%%%%%%存储车牌图像 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
f=imread('cp.jpg');
f=im2bw(f,0.4); %二值化车牌区域
subplot(1,2,1)
imshow(f);title('二值化');
%%%%%%%%%%%%%%%%车牌区域%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[a,b]=size(f);
for i=1:a
for j=1:b
if i<=3|i>=(a-1)
f(i,j)=1;
end
if j<=6|j>=(b-5) %去除车牌四周边界
f(i,j)=1;
end
if f(i,j)==1 %为了使后面的投影曲线更直观,把字符灰度变为1,
f(i,j)=0; %非字符变为0
else
f(i,j)=1;
end
end
end
subplot(1,2,2)
imshow(f);title('灰度取反');
%%%%%%%%%%%%%%%%%%%%形态学处理%%%%%%%%%%%%%%%%%%%%%%
% SE1=strel('disk',1)
% f=imdilate(f,SE1);%函数实现膨胀
% f=imerode(f,SE1);%imerode函数实现图像腐蚀
% % f=imopen(f,SE1);
% figure
% imshow(f)
%%%%%%%%%%%%%%%%车牌区域投影%%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
PVD=projection(double(f),'v');
for i=1:b
if PVD(i)<3 %从投影曲线去掉噪声点
PVD(i)=0;
end
end
plot(PVD);title('灰度投影曲线');
%%%%%%%%%%%%%%%%%%%%%%%字符分割%%%%%%%%%%%%%%%%%%%%%%%%%
figure
a=[]; j=1;
for i=1:b-1
if abs(PVD(i+1)-PVD(i))==max(PVD(i+1),PVD(i))&abs(PVD(i+1)-PVD(i))~=0 %切割点的判断(如果前一个数减后一个数的绝对值)
a(j)=i; j=j+1; % 等于这两个数的最大值,则记录一个坐标值
end
end
a
k=j-1;
for c=1:7
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,7,c);
b= f(:,a(2*c-1):a(2*c)); %获取七个需要切割出来的字符的起点和终点坐标
b=imresize(b,[39 21],'bilinear'); %对每个输出的图象作尺寸大小的归一化
BW1=bwmorph(b,'skel',Inf);%骨架化
imshow(b);
K1=mean(b);
R1=cov(K1);
[V1,D1]=eig(R1);
TBB=b;
tbb=bwarea(TBB);%求面积
XunDatabasePath = 'H:\车牌识别定位程序\模版0\';
p=[];
g=7;
for j=1:40
Aa=int2str(j);
XunImage = strcat(XunDatabasePath,Aa,'.jpg');
XB=imread(XunImage);
xb=im2bw(XB);
BW2=bwmorph(xb,'skel',Inf);
xbb=bwarea(xb);
% if((tbb-xbb<5)&(tbb-xbb>-5))
pp=corr2(b,xb);%匹配度
p(j)=pp;
end
r=find(p==max(max(p))); %%%找到最大值的坐标
Aa=int2str(r);
XunImage = strcat(XunDatabasePath,Aa,'.jpg');
XB=imread(XunImage);
subplot(2,7,c+7);
imshow(XB);
end
% end
%%%%%%%%%%%%%%%%%%模版匹配%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% K1=mean(b);
% R1=cov(K1);
% [V1,D1]=eig(R1);
% TBB=b;
% tbb=bwarea(TBB);%求面积
% XunDatabasePath = 'I:\车牌识别定位程序\模版0\';
% p=[];
% g=7;
% for j=1:40
% Aa=int2str(j);
% XunImage = strcat(XunDatabasePath,Aa,'.jpg');
% XB=imread(XunImage);
% xb=im2bw(XB);
% % BW2=bwmorph(xb,'skel',Inf);
% xbb=bwarea(xb);%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % if((tbb-xbb<5)&(tbb-xbb>-5))
% pp=corr2(b,xb);%匹配度
% p(j)=pp;
% MAX=max(p(j));
% if p(j)==MAX
% Aa=int2str(j);
% XunImage = strcat(XunDatabasePath,Aa,'.jpg');
% XB=imread(XunImage);
% end
% % for j=1:
% % max(p(j))
% subplot(1,7,k);
% imshow(XB);
% % imshow()
% j=j+1;
% end
% end
% if(xiangguan==1)
% figure,subplot(121);imshow(TB);
% subplot(122);imshow(XB);title(strcat(XunDatabasePath,Aa,'.jpg'));
% if(j==37)
% out(i)='渝';
% else if(j==36)
% out(i)='川';
% else
% out(i)=' ';
% end
% end
% if(j>=0&j<10)
% out(i)=int2str(j);
% else if(j>=10&j<36)
% k=j+55;
% out(i)=char(k);
% k=0;
% end
% end
%
% end
% %end
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -