PDA

查看完整版本 : 车型识别---特征提取程序出错


lingyu
2008-04-25, 08:52
差运算:
b=imread('f:tuxiang\kechebeijing.jpg');%//读取背景图像
c=imread('f:tuxiang\keche.jpg'); % //读取车辆图像
D=imsubtract(b,c); %//进行差运算,D为输出结果
imshow(D) %//显示图像
%中值滤波:
[m,n] = size(D); %//或取待处理图像的大小
k = floor(7/2);
A2 = zeros(m+2*k,n+2*k);
A2(k+1:m+k,k+1:n+k) = D; % //把原始的图像放在中心位置
%//延伸边界的映像点,下面是4个角落的延伸
A2(1:k,1:k) = D(1,1); %//左上
A2(1:k,n+k+1:n+2*k) = D(1,n); %//右上
A2(m+k+1:m+2*k,n+k+1:n+2*k) = D(m,n); %//右下
A2(m+k+1:m+2*k,1:k) = D(m,1); %//左下
%//处理边,需要对行和列进行复制
for i = 1:k
A2(i,k+1:n+k) =D(1,1:n); % //上部
A2(k+1:m+k,n+k+i) = D(1:m,n);% //右侧
A2(m+k+i,k+1:n+k) = D(m,1:n); %//下部
A2(k+1:m+k,i) = D(1:m,1); %//左侧
end;
B=zeros(m,n);
pixel_block = zeros(1,7^2);% //确定映像点块
for i = 1:m
for j = 1:n
k = floor(7/2);
pixel_block = reshape(A2(i:i+2*k,j:j+2*k),7^2,1);
sorted_block = sort(pixel_block);% //按升序排列
median_position = ceil(7^2 / 2);
block_median = sorted_block (median_position); %//取中间位置的像素值
B(i,j) = block_median;
end;
end;
B=uint8(B); %//转化成8位存储方式
imshow(B);
%边缘检测:
C=zeros(m,n);
%//将B的象素左移一列,B为滤波后的图像
for i = 1:m
for j = 1:(n-1)
C(i,j)=B(i,j+1);
end;
end;
%//右侧边界补零
for i = 1:m
C(i,n)=0;
end;
C = uint8(C);

CC=imsubtract(C,B); %//差运算
imshow(CC);
%//阈值分割
T=10;
for i = 1:m
for j = 1:n
if CC(i,j)>T
CC(i,j)=255;
else CC(i,j)=0;
end;
end;
end;

DD=imsubtract(B,C);
for i = 1:m
for j = 1:n
if DD(i,j)>T
DD(i,j)=255;
else DD(i,j)=0;
end;
end;
end;
I=imadd(CC,DD);%//求和,横向的边缘检测结果和一个矩阵里

%//把原图向上偏移一行
E=zeros(m,n);
for i = 1:(m-1)
for j = 1:n
E(i,j)=B(i+1,j);
end;
end;
%//底部边界补零
for j = 1:n
E(m,j)=0;
end;
E = uint8(E);
EE=imsubtract(E,B);
for i = 1:m
for j = 1:n
%//阈值分割
if EE(i,j)>T
EE(i,j)=255;
else EE(i,j)=0;
end;
end;
end;
FF=imsubtract(B,E);
%//阈值分割
for i = 1:m
for j = 1:n
if FF(i,j)>T
FF(i,j)=255;
else FF(i,j)=0;
end;
end;
end;
J=imadd(EE,FF);%//纵向的边缘检测和一个矩阵里
P=imadd(I,J);%//求出车辆整个边缘检测线
figure,imshow(P);
%边缘细化:
[m,n]=size(P);
W=zeros(m,n);
for i=2:m-1
for j=2:n-1
count2=0;count3=0;count4=0;count5=0;count6=0;count7=0;count8=0;count9=0;
p1=P(i,j);p2=P(i-1,j);p3=P(i-1,j+1);p4=P(i,j+1);p5=P(i+1,j+1);p6=P(i+1,j);
p7=P(i+1,j-1);p8=P(i,j-1);p9=P(i-1,j-1);
if p1==255 % //这里背景图像点标记为255
if p2==255
count2=1;
else count2=0;
end;
if p3==255
count3=1;
else count3=0;
end;
if p4==255
count4=1;
else count4=0;
end;
if p5==255
count5=1;
else count5=0;
end;
if p6==255
count6=1;
else count6=0;
end;
if p7==255
count7=1;
else count7=0;
end;
if p8==255
count8=1;
else count8=0;
end;
if p9==255
count9=1;
else count9=0;
end;
else W(i,j)=P(i,j);
end;
count=count2+count3+count4+count5+count6+count7+count8+count9;%//求N(p1)
if count<2|count>6%//条件(1.1)
W(i,j)=P(i,j);
else
Q(1:8)=[p2,p3,p4,p5,p6,p7,p8,p9];
a=0;
for k=1:7
if Q(k)<Q(k+1)
a=a+1;
end;
end; %//求S(p1)
if a~=1 %//条件(1.2)
W(i,j)=P(i,j);
else
if p2*p4*p6~=0|p4*p6*p8~=0%//条件(1.3)与(1.4)

W(i,j)=P(i,j);
else W(i,j)=0;
end;
end;
end;
end;
end;
%//步骤2
[m,n]=size(W);
R=zeros(m,n);
for i=2:m-1
for j=2:n-1
p1=W(i,j);p2=W(i-1,j);p3=W(i-1,j+1);p4=W(i,j+1);p5=W(i+1,j+1);
p6=W(i+1,j);p7=W(i+1,j-1);p8=W(i,j-1);p9=W(i-1,j-1);
if p1==255
if p2==255
count2=1;
else count2=0;
end;
if p3==255
count3=1;
else count3=0;
end;
if p4==255
count4=1;
else count4=0;
end;
if p5==255
count5=1;
else count5=0;
end;
if p6==255
count6=1;
else count6=0;
end;
if p7==255
count7=1;
else count7=0;
end;
if p8==255
count8=1;
else count8=0;
end;
if p9==255
count9=1;
else count9=0;
end;
else R(i,j)=W(i,j);
end;

count=count2+count3+count4+count5+count6+count7+count8+count9;
if count<2|count>6
R(i,j)=W(i,j);
else
Q(1:8)=[p2,p3,p4,p5,p6,p7,p8,p9];
a=0;
for k=1:7
if Q(k)<Q(k+1)
a=a+1;
end;
end;
if a~=1
R(i,j)=W(i,j);
else
if p2*p4*p8~=0|p2*p6*p8~=0
R(i,j)=W(i,j);
else R(i,j)=0;
end;
end;
end;
end;
end;
%图像填充:
[m,n]=size(R);
U=zeros(m,n);
for i=1:m
for j=1:n
x1=1;y1=1;
if R(i,j)==255
U(i,j)=R(i,j);
x1=j;
break;
end;
end;
for j=n:-1:1
if R(i,j)==255
U(i,j)=R(i,j);
y1=j;
break;
end;
end;
for j=x1:y1
if x1~=1&y1~=x1
U(i,j)=255;
end;
end;
end;
for j=1:n
for i=1:m
x2=1;y2=1;
if R(i,j)==255
U(i,j)=R(i,j);
x2=i;
break;
end;
end;
for i=m:-1:1
if R(i,j)==255
U(i,j)=R(i,j);
y2=i;
break;
end;
end;
for i=x2:y2
if x2~=1&y2~=x2
U(i,j)=255;
end;
end;
end;
%轮廓线的提取:
[m,n]=size(U); %// U为上一步图像U滤波的结果
yy=zeros(m,n);
for i=1:m
for j=1:n
if U(i,j)==255
yy(i,j)=U(i,j);
break;
end;
end;
end;
for i=1:m
for j=n:-1:1
if U(i,j)==255
yy(i,j)=U(i,j);
break;
end;
end;
end;
for j=1:n
for i=1:m
if U(i,j)==255
yy(i,j)=U(i,j);
break;
end;
end;
end;
for j=1:n
for i=m:-1:1
if U(i,j)==255
yy(i,j)=U(i,j);
break;
end;
end;
end;
figure,imshow(yy);
%特征提取:
[m,n]=size(yy);
ZZ=zeros(m,n);
for i=1:m
for j=1:n
if ZZ(i,j)==255
ZD=i;
break;
end;
end;
end;
for i=m:-1:1
for j=1:n
if ZZ(i,j)==255
ZG=i;
break;
end;
end;
end;
jiahigh=ZD-ZG
t=ceil(0.24*jiahigh); u=ceil(t/6);
W=zeros(1,t+t+1);
for i=ZG-t:ZG+t
P=0;
for i0=i-u:i+u
for j0=1:n
if ZZ(i0,j0)==255
P=P+1;
break;
end;
end;
end;
W(i-ZG+t+1)=P;
end;
Y=max(W);
for i=1:t+t+1
if W(i)==Y
U=i;
break;
end;
end;
for i=ZG+U-t+u-1:-1:ZG+U-t-u-1
for j=1:n
if ZZ(i,j)==255
ZG1=i;
break;
end;
end;
end;
high=ZD-ZG1
for j=1:n
for i=ZG+U-t-u-1:ZG+U-t+u-1
if ZZ(i,j)==255
DZY=j;
break;
end;
end;
end;
DZY
for j=n:-1:1
for i=ZG+U-t-u-1:ZG+U-t+u-1
if ZZ(i,j)==255
DZZ=j;
break;
end;
end;
end;
DZZ
for j=1:n
for i=1:(ZD-high/3)
if ZZ(i,j)==255
ZY=j;
break;
end;
end;
end;
for j=n:-1:1
for i=1:(ZD-high/3)
if ZZ(i,j)==255
ZZ1=j;
break;
end;
end;
end;
length=ZY-ZZ1
Dlength=DZY-DZZ
QHB=(((DZZ+DZY)/2)-ZZ1)/(ZY-((DZZ+DZY)/2))
DCB=Dlength/length
DGB=DZY-DZZ/ZD-ZG1??? Undefined function or variable "ZD".

Error in ==> Untitled at 345
jiahigh=ZD-ZG
哪位哥哥姐姐帮%
帮我啊,看看问题在哪儿

futao1009
2009-03-04, 22:53
大哥,你把格式弄好点儿,看着累眼啊!