?? mycarlocal.m
字號:
%程序功能:實現(xiàn)車牌自動定位
%作者:重慶大學(xué) 田建國 QQ:363966533
%編寫時間:2007.04.10
%修改時間:2007.07.06;修改內(nèi)容:增加合并區(qū)域操作,第88行開始
clear;clc;close all
filename='2.jpg';
I=im2gray(filename);%調(diào)用自編函數(shù)讀取圖像,并轉(zhuǎn)化為灰度圖象;
tic %計時開始
[height,width]=size(I);
%預(yù)處理
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)));
[I_edge,y1]=select(I_edge,height,width); %%%%%%調(diào)用select函數(shù)
BW2 = I_edge;%
%%%%%%%%%%%%%%%%一些形態(tài)學(xué)處理
SE=strel('rectangle',[10,10]);
IM2=imerode(BW2,SE);
IM2=bwareaopen(IM2,20);
IM3=imdilate(IM2,SE);
%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%投影以粗略估計車牌位置
p_h=projection(double(IM3),'h'); %調(diào)用projection函數(shù)
if(p_h(1)>0)
p_h=[0,p_h];
end
p_v=projection(double(IM3),'v'); %調(diào)用projection函數(shù)
if(p_v(1)>0)
p_v=[0,p_v];
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;
%%%%%%%%%%%
%%%%%%%%%%%%%%%%%粗略計算車牌候選區(qū)
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));
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;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%進一步縮小車牌候選區(qū)
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_ratio(i)=(p{i}(4)-p{i}(3))/(p{i}(2)-p{i}(1));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%對上面參數(shù)和變量的說明:p為一胞元,用于存放每個圖像塊的左上和右下兩個點的坐標(biāo);
%存放格式為:p{k}=[x1,x2,y1,y2];x1,x2分別為行坐標(biāo),y1,y2為列坐標(biāo)
%p_center為一胞元,用于存放每個圖像塊的中心坐標(biāo),p_center{k}=[x,y];x,y分別為行,列坐標(biāo)
%p_ratio為一矩陣,用來存放圖像塊的長寬比例
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%合并臨近區(qū)域%%%%%%%
%如果有多個區(qū)域則執(zhí)行合并
if k>1
n=0;
ncount=zeros(1,k);
for i=1:k-1
%%%需要調(diào)整if條件中的比例
%%%需要調(diào)整
%檢查是否滿足合并條件
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
%如果有合并,求出合并后最終區(qū)域
if(n>0)
d_ncount=ncount(2:n+1)-ncount(1:n);%避免重復(fù)記錄臨近的多個區(qū)域。
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)};
%重新記錄合并區(qū)域的比例
pp_ratio(i)=(pp{i}(4)-pp{i}(3))/(pp{i}(2)-pp{i}(1));
end
p=pp;%更新區(qū)域記錄
p_ratio=pp_ratio; %更新區(qū)域比例記錄
clear pp;clear pp_ratio; %清除部分變量
end
end
k=length(p); %更新區(qū)域個數(shù)
%%%%%%%%%%%%%%合并結(jié)束%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%根據(jù)區(qū)域比例判斷是否為車牌區(qū)域%%%%%%%%%%%%
m=1;T=0.6*max(p_ratio);%0.8參數(shù)需要調(diào)整
for i=1:k
if(p_ratio(i)>=T&p_ratio(i)<20)
p1{m}=p{i};
m=m+1;
end
end
p=p1;clear p1;
k=m-1; %更新區(qū)域數(shù)
%%%%%%%%%%%判定結(jié)束%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%d=zeros(k+1,k+1);
%for i=1:k+1
% for j=i+1:k+1
%d(i,j)=sqrt((p_center{i}(1)-p_center{j}(1))^2+(p_center{i}(2)-p_center{j}(2))^2);
% end
%end
%說明:d用于存放第i,j個圖像塊中心點的距離;
%T=sqrt(height^2+width^2)/10;%閾值
%[x,y]=find(d>0&d<T);
%for i=1:length(x)
% p{x(i)}(1)=min(p{x(i)}(1),p{y(i)}(1));
% p{x(i)}(2)=max(p{x(i)}(2),p{y(i)}(2));
% p{x(i)}(3)=min(p{x(i)}(3),p{y(i)}(3));
% p{x(i)}(4)=max(p{x(i)}(4),p{y(i)}(4));
%end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
toc %計時結(jié)束
clear edge_IM3;clear x; clear y; % 清空部分變量
%%%%%%%%%%%%%%%%顯示
figure;
subplot(221);imshow(I);
subplot(222);imshow(BW2);
subplot(223);imshow(IM2);
subplot(224);imshow(IM3);
%%%%%%%%%%%%%%%%%顯示
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');
end
%存儲車牌圖像
%%%%%%%%%%%%%%%%
%figure;
%I1=I.*uint8(IM3);imshow(I1)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -