%function g=boundary_trace(f)
%g=boundary_trace(f)跟踪目标的外边界,f为输入的二值图像,g为输出的二值图像
%此处f g都是认为是二维矩阵 【行 列】==【y x】
%此算法只适用于二值图像
%f=imread('result1.bmp');
%去掉整幅图像四周围的像素点,保证图像目标的连通性
function g=boundary_trace(im2)
[YS,XS]=size(im2);
im2(1,1:XS)=0;
im2(YS,1:XS)=0;
im2(1:YS,1)=0;
im2(1:YS,XS)=0;
f=im2bw(im2);
imshow(im2);
offsetr=[-1,0,1,0];
offsetc=[0,1,0,-1];
next_search_dir_table=[4 1 2 3];%搜索方向查找表
next_dir_table=[2 3 4 1];%搜索顺序查找表
start=-1;
boundary=-2;
%找出起始点
[rv,cv]=find((f(2:end-1,:)>0)&(f(1:end-2,:)==0));
%此处可以简化处理,只用找出一个初始点即可。
rv=rv+1;
startr=rv(1);
startc=cv(1);
f=im2double(f);
f(startr,startc)=start;
cur_p=[startr,startc];
init_dir=-1;
done=0;
next_dir=2; %初始搜索方向
flag=1;
while~done
dir=next_dir;
found_neighbour=0;
for i=1:length(offsetr) %四邻域上的寻找下一个边缘点
offset=[offsetr(dir),offsetc(dir)];
neighbour=cur_p+offset;
if(f(neighbour(1),neighbour(2)))~=0 %找到新的边缘点
if(f(cur_p(1),cur_p(2))==start)&(init_dir==-1)
init_dir=dir; %记下离开初始点时的方向
%当前点为初始点且新的边缘点的离开方向为初始离开方向,表明跟踪过程已饶了一圈
elseif(f(cur_p(1),cur_p(2))==start)&(init_dir==dir)
done=1;
found_neighbour=1;
break;
end
next_dir=next_search_dir_table(dir); %下一个搜索方向
found_neighbour=1;
if f(neighbour(1),neighbour(2))~=start
f(neighbour(1),neighbour(2))=boundary;
end
cur_p=neighbour;
break;
end
dir=next_dir_table(dir);
end
end
bi=find(f==boundary);
f(:)=0;
f(bi)=1;
f(startr,startc)=1;
g=im2bw(f);
figure,imshow(g);
%title('边缘追踪后图像');
%imwrite(g,'result4.bmp');
%[Y,X]=find(g);
%corr=zeros(2,length(X));
%corr(1,:)=X;
%corr(2,:)=Y;
%frac_dim = boxcount(corr, 10,1);
- 1
- 2
- 3
- 4
- 5
- 6
前往页