下面这段代码,是要批量读取图片,并提取符合要求的像素坐标,最后计算出角度并作图。运行时,提示检测后保存坐标的数组A,超出索引,A的维数为0,难道是我的检测坐标点的程序错了,还是保存的方法不对?
mm=[];nn=[];mm(1)=0;nn(1)=0;t=1;%用来记录上一次循环的某些数值
for i=15:1:92 %准备处理第15到92号二值图像
I=imread([num2str(i),'.png']); %顺序读取第i张图片
I_size=size(I); %图片矩阵大小
H=I_size(1);
W=I_size(2);
A=[];s=1; %空向量,用来记录白色像素点x坐标
B=[];d=1;
C=[];f=1;
for j=1:H %扫描图片1到H行
if j==round(0.47*H) %找到第round(0.47*H)行
for k=1:W %然后扫描此行像素
if I(j,k)==255 %找出白色像素点
A=[A k] ; s=s+1; %记下各点x坐标,放入向量A
end
end
elseif j==round(0.715*H) %同上 , 第round(0.715*H)行
for k=1:W
if I(j,k)==255
B=[B k]; d=d+1;
end
end
elseif j== round(0.961*H) %同上,第round(0.961*H) 行
for k=1:W
if I(j,k)==255
C=[C k]; f=f+1;
end
end
else
end
end
switch d %判断白色像素点个数
case d==5 %有4个,那么分别赋值给b1到b4,b1到b4是用于后面坐标计算
b1=B(1); b2=B(2); b3=B(3); b4=B(4);
case d==4 %有3个,分别赋值
b1=B(1); b2=B(2); b3=B(2); b4=B(3);
case d==3 %有2个,赋值给b1和b4,b2和b3用上一次循环的值插入
m=mm(t); %插值数组,用索引t找到上次循环的插值赋值给m
b1=B(1);b4=B(2);b2=b1+m;b3=b4-m;
otherwise
end
if f==5 %另一行检测出的坐标,判别原理同上
c1=C(1); c2=C(2); c3=C(3); c4=C(4);
elseif f==4
c1=C(1); c2=C(2); c3=C(2); c4=C(4);
elseif f==3
n=nn(t);
c1=C(1);c4=C(2);c2=c1+n;c3=c4-n;
else
end
t=t+1; %插值数组的索引,每次循环+1
a1=A(1);a2=A(2); %把向量A的第1,2个坐标赋值给a1和a2
x3=a1+(a2-a1)*0.5; y3=0.47*H; %坐标计算
mm(t)=b4-b3; %把插值存到数组mm
q1=b1+(b2-b1)*0.5; q2=b3+(b4-b3)*0.5; %计算出坐标q1,q2
y24=0.715*H; %纵坐标
nn(t)=c4-c3; %同上
e1=c1+(c2-c1)*0.5; e2=c3+(c4-c3)*0.5;
y15= 0.961*H;
if (i>=21&&i<=42)||(i>=61&&i<=81) % if语句是根据图片的序号,分配坐标
x2=q1;x4=q2;
else
x2=q2;x4=q1;
end
if (i>=25&&i<=44)||(i>=65&&i<=84)
x1=e1;x5=e2;
else
x1=e2;x5=e1;
end
z1=atan((x2-x1)/(y24-y15)); %分配后的坐标运算,得到角度
z2=atan((x3-x2)/(y3-y24));
z3=atan((x4-x3)/(y24-y3));
z4=atan((x5-x4)/(y15-y24));
l=[z1 z2 z3 z4]; %存放角度到行向量l
L(:,i-14)=l'; %把向量l转置并存到矩阵L
end
x=1:1:87; %以图片顺序为X轴
y=L; %矩阵元素为Y轴
plot([x;x;x;x]',y'); %画出每一列对应的角度变化曲线