%% 读取图像
i=imread('1.0.bmp');figure,imshow(i,[]),title('原图');
j=imread('1.1.bmp');figure,imshow(j,[]),title('背景')
%% 图像预处理
%灰度化
i1=rgb2gray(i);
j1=rgb2gray(j);
%中值滤波
i2=medfilt2(i1,[3,3]);
j2=medfilt2(j1,[3,3]);
%相减后取边界
s=imsubtract(j2,i2);
s=double(s);
%腐蚀
se=strel('disk',2);
s1=imerode(s,se);
%车辆图像提取
s2=bwareaopen(s1,5000);
figure,imshow(s2,[]),title('预处理结果');
%% 填充目标图像
%横向填充
Ssize=size(s2);
for i=1:Ssize(1)
n=0;
x=zeros(1,400);
y=1;
for j=1:Ssize(2)
if(s2(i,j)==1)
x(1,y)=j;
y=y+1;
n=n+1;
lie_biao=j;
end
end
if((n>=10)&&(lie_biao-x(1,1)>150))
for m=x(1,1):lie_biao
s2(i,m)=1;
end
end
end
figure,imshow(s2,[]),title('横向填充');
%% 纵向填充
for j=1:Ssize(2)
n=0;
x=zeros(600,1);
y=1;
for i=1:Ssize(1)
if(s2(i,j)==1)
x(y,1)=i;
y=y+1;
n=n+1;
hang_biao=i;
end
end
if((n>=10)&&(hang_biao-x(1,1)>50))
for m=x(1,1):hang_biao
s2(m,j)=1;
end
end
end
imshow(s2,[]),title('车辆轮廓') ;
%% 目标提取和轮廓裁剪
%扫描汽车顶部
for i=1:Ssize(1)
n=0;
y=1;
x=zeros(1,500);
for j=1:Ssize(2)
if(s2(i,j)==1)
x(1,y)=j;
y=y+1;
n=n+1;
lie_biao=j;
end
end
if((lie_biao-x(1,1)==(n-1))&&(n>60))
a1=i;
b1=x(1,1);
b2=lie_biao;
break;
end
end
%扫描汽车底部
for i=Ssize(1):-1:1
n=0;
y=1;
x=zeros(1,500);
for j=1:Ssize(2)
if(s2(i,j)==1)
x(1,y)=j;
y=y+1;
n=n+1;
lie_biao=j;
end
end
if((lie_biao-x(1,1)==(n-1))&&(n>80))
a2=i;
break;
end
end
for k=Ssize(1):-1:(a2+1)
for j=1:Ssize(2)
s2(k,j)=0;
end
end
%扫描汽车最左边
for j=1:Ssize(2)
n=0;
y=1;
x=zeros(500,1);
for i=1:Ssize(1)
if(s2(i,j)==1)
x(y,1)=i;
y=y+1;
n=n+1;
hang_biao=i;
end
end
if ((hang_biao-x(1,1)==(n-1))&&(n>30))
a3=x(1,1);
b3=j;
break;
end
end
for k=1:(b3-1)
for i=1:Ssize(1)
s2(i,k)=0;
end
end
%扫描汽车最右边
for j=Ssize(2):-1:1
n=0;
y=1;
x=zeros(500,1);
for i=1:Ssize(1)
if(s2(i,j)==1)
x(y,1)=i;
y=y+1;
n=n+1;
hang_biao=i;
end
end
if ((hang_biao-x(1,1)==(n-1))&&(n>20))
b4=j;
a4=x(1,1);
break;
end
end
for k=Ssize(2):-1:(b4+1)
for i=1:Ssize(1)
s2(i,k)=0;
end
end
figure,imshow(s2),title('对轮廓修剪后的图形')
%% 识别判断车型
d=b2-b1;
f=b4-b3;
t=b1+d/2;
t1=t-b3;
t2=b4-t;
c1=min(t1,t2);
c2=max(t1,t2);
h1=a2-a3;
h2=a2-a4;
hmin=min(h1,h2);
hmax=max(h1,h2);
disp('该车的车型是:')
if((hmin/hmax)>0.82)
if((d/f)>0.75)
disp([char(6),'客车'])
else
disp([char(6),'小轿车'])
end
else
if((c1/c2)>0.6)
disp([char(6),'面包车'])
else
disp([char(6),'货车'])
end
end
- 1
- 2
- 3
- 4
前往页