图像边界跟踪算法程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab程序.光栅扫描跟踪程序
I=imread(' circles.png ');
[m,n]=size(I); %计算图像的大小
imshow(I);
R=I(1,1); %图像第一个像素点的值
I0=zeros(m+2,n+2)+R; %图像周围增加一个与原图像第一个像素值相同的像素I0(2:(m+1),2:(n+1))=I;
x0=0;y0=0;
fsp=0; %是否找到起始点
for i=1:m
for j=1:n
if (I0(i,j)~=R)
x0=i; %记录起始点的纵坐标i
y0=j; %记录起始点的横坐标j
fsp=1;
break;
end
end
if fsp==1
break;
end
end
row=x0;
col=y0;
A=[]; %存储边界点坐标的矩阵
B=zeros(m,n); %边界跟踪的图像矩阵
ended=0;direction=4; %由起始点的左边开始查找
while(ended==0)
found_next=0;
b=[row,col];
A=[A;b];
B(row,col)=255;
while(found_next==0)
switch mod(direction,8)
case 0
if (I0(row, col+1)~=R)
row=row; %记录当前坐标
col=col+1;
direction=5; %下一点由方向5开始查找
found_next=1; %找到边界点
end;
case 1
if (I0(row-1, col+1)~=R)
row=row-1; %记录当前坐标
col=col+1;
direction=6; %下一点由方向6开始查找found_next=1; %找到边界点
end;
case 2
if (I0(row-1, col)~=R)
row=row-1; %记录当前坐标
col=col;
direction=7; %下一点由方向7开始查找found_next=1; %找到边界点
end;
case 3
if (I0(row-1, col-1)~=R)
row=row-1; %记录当前坐标
col=col-1;
direction=0; %下一点由方向0开始查找found_next=1; %找到边界点
end;
case 4
if (I0(row, col-1)~=R)
row=row; %记录当前坐标
col=col-1;
direction=1; %下一点由方向1开始查找found_next=1; %找到边界点
end;
case 5
if (I0(row+1, col-1)~=R)
row=row+1; %记录当前坐标
col=col-1;
direction=2; %下一点由方向2开始查找found_next=1; %找到边界点
end;
case 6
if (I0(row+1, col)~=R)
row=row+1; %记录当前坐标
col=col;
direction=3; %下一点由方向3开始查找found_next=1; %找到边界点
end;
case 7
if (I0(row+1, col+1)~=R)
row=row+1; %记录当前坐标
col=col+1;
direction=4; %下一点由方向4开始查找
found_next=1; %找到边界点
end
end
if (found_next==0)
direction=direction+1; %未找到边界点,继续在下一方向查找
end
end
if(and((x0==row),(y0==col)))
ended=1; %是否与起始点相同
end
end
imshow(B); %输出跟踪结果
%图像中心的查找
[k,l]=size(A);
sum_i=0; %记录边界点纵坐标相加的和
sum_j=0; %记录边界点横坐标相加的和
for i=1:k
sum_i=sum_i+A(i,1);
sum_j=sum_j+A(i,2);
end
i_point=sum_i/k; %图像中心的纵坐标
j_point=sum_j/k; %图像中心的横坐标