function [xc,yc]=contour(Ib)
%[xc,yc]=contour(Ib)
%
%Searches the boundary for an object in the binary image Ib.
%(where 1 is considered as object pixel), starting at the
%first object pixel by scanning downwards each column from
%the left.
%
%The search goes in counter-clockwise order.
%
%xc and yc are the output boundary coordinates.
%
% Mats Kvarström 010110 modified 020123
% Modified 030121 by John Gustafsson
% Modified 060120 by Anders Sjšgren to row/col indexation from single index style (help sub2ind)
%%% Notation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% (xc,yc): coordinates of boundary in image
% d : denotes direction in which we look/travel
% d = | 0 | 1 | 2 | 3
% -----------------------------------
% | right | up | left | down
%%% Main program %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% First Point
[ys,xs] = find(Ib==1);
x=xs(1); y=ys(1);
d=3; %the first point is found searching downwards
xc=x; yc=y; %add the first point to the result
% And iterate...
while size(xc,1)<=2 || ~(xc(1)==x & yc(1)==y)
d = rotateCW(d); %begin with checking 1 step clockwise
[newx,newy]=next(x,y,d);
while Ib(newy,newx)~=1
% If we would step out of the object, rotate counter-clockwise
d = rotateCCW(d);
[newx,newy]=next(x,y,d);
end
[x,y]=next(x,y,d);
xc=[xc;x]; yc=[yc;y]; %add the new locations to the contour
end
%%% Subfunctions %%%%%%%%%%%%%%%%%%%d%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%%%
function dnew = rotateCW(d)
%Rotate the direction one step clockwise
dnew = mod(d-1,4);
%%%
function dnew = rotateCCW(d)
%Rotate the direction one step counter-clockwise
dnew = mod(d+1,4);
%%%
function [xnew,ynew] = next(x,y,d)
% Gives the coordinate of the next pixel
% from x,y, travelling according to d
%
xnew=x; ynew=y;
if d==0 % going right
xnew = x+1;
elseif d==1 % going up
ynew = y-1;
elseif d==2 % going left
xnew = x-1;
else % going down
ynew = y+1;
end