您的位置:首页 > 其它

图像处理之边界跟踪

2017-11-10 21:00 316 查看
matlab函数:B=bwboundaries(img);

使用栈实现代码:

close all;clear all;
img = imread('G:/bound.jpg');
img = rgb2gray(img);
img = im2bw(img);
img=im2bw(img);
B=bwboundaries(img);%库函数结果

[m,n]=size(img);
k=1;
flag=0;
for i=1:m %找到第一个不为0元素位置
for j=1:n
if img(i,j)>0
stack(k,1)=i;
stack(k,2)=j;
starti=i; %标记第一个点
startj=j;
dir=7;
k=k+1;
flag=1; %表示已经找到了第一个元素
break;
end
end
if flag==1
break;
end
end

while 1
if mod(dir,2)==0
dir=mod(dir+7,8); %偶数处理方式
else
dir=mod(dir+6,8); %奇数的处理方式
end
i=stack(k-1,1);
j=stack(k-1,2);
while 1
flag=1;
switch dir
case 0
if j+1<n+1&&img(i,j+1)>0%右方
stack(k,1)=i;
stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 1
if i-1>0&&j+1<n+1&&img(i-1,j+1)>0%右上方
stack(k,1)=i-1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 2
if i-1>0&&img(i-1,j)>0%上方
stack(k,1)=i-1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 3
if i-1>0&&j-1>0&&img(i-1,j-1)>0%左上方
stack(k,1)=i-1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 4
if j-1>0&&img(i,j-1)>0%左方
stack(k,1)=i;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 5
if i+1<m+1&&j-1>0&&img(i+1,j-1)>0%左下方
stack(k,1)=i+1;stack(k,2)=j-1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 6
if i+1<m+1&&img(i+1,j)>0%下方
stack(k,1)=i+1;stack(k,2)=j;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
case 7
if i+1<m+1&&j+1<n+1&&img(i+1,j+1)>0%右下方
stack(k,1)=i+1;stack(k,2)=j+1;
k=k+1;
flag=0;%找到下一个元素位置
else
dir=mod(dir+1,8);
end
otherwise
end
if flag==0%找到下一个点退出当前循环
break;
end
end
if k-1>2&&stack(k-2,1)==starti&&stack(k-2,2)==startj&&stack(k-1,1)==stack(2,1)&&stack(k-1,2)==stack(2,2)%退出循环条件
break;
end
end
stack(k-1,:)=[];

figure;
subplot(1,2,1);
imshow(img);
subplot(1,2,2);
imshow(img);
hold on;
for i=1:length(stack)
hold on; plot(stack(:,2),stack(:,1),'r');
end
使用递归实现:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: