二值图像的轮廓跟踪
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function C = contour_following(BW)定义函数
% CONTOUR_FOLLOWING takes a binary array and returns the sorted row and
% column coordinates of contour pixels.CONTOUR_FOLLOWING一个二进制的数组,并返回排序的行和轮廓像素的列坐标
% C = CONTOUR_FOLLOWING(BW) takes BW as an input. BW is a binary array
% containing the image of an object ('1': foreground, '0': background). It % returns a circular list (N x 2, C(1,:)=C(end,:)) of the
% (row,column)-coordinates of the object's contour, in the order of
% appearence (This function was inspired from the freeman contour coding % algorithm).C = CONTOUR_FOLLOWING(BW)作为输入体重。BW是一个二进制的数组,包含一个对象的图像('1':前景,'0':背景)。它返回一个循环链表(为N×2,C级(1,:) =(年底,:))在appearence 秩序,对象的轮廓(行,列)坐标(此功能的启发弗里曼轮廓编码算法)
% Note:
% - if the object is less than 3 pixels, CONTOUR_FOLLOWING sends back [0 0].如果对象是小于3个像素,CONTOUR_FOLLOWING发回[0]。
% - the algorithm is quite robust: the object can have holes, and can also % be only one pixel thick in some parts (in this case, some coordinates
% pair will appear two times: they are counted "way and back").
算法是相当稳健的对象可以有洞,也可以是只有一个像素厚(在这种情况下,在一些地区,一些坐标对将出现两次:他们都算“回溯”)
[m,n]=size(BW); %
getting the image height and width
获取图像的高度和宽度
Itemp=zeros(m+2,n+2); % we create a '0' frame around the image to avoid border problems
创建0为图像帧,以避免边界问题
Itemp(2:(m+1),2:(n+1))=BW;
BW=Itemp;
BW = BW - imerode(BW,[0 1 0 ; 1 1 1 ; 0 1 0]); % gets the contour by substracting the erosion to the image
获得减去侵蚀图像轮廓
BW = bwmorph(BW,'thin',Inf); % to be sure to have strictly 8-connected contour
一定要有严格的八连轮廓
if (sum(sum(BW))<3), % we consider that less than 3 pixels cannot make a contour
我们认为不到三个像素不算一个轮廓
C=[0 0];
return;
end;
[row,col]=find(BW,1); %
takes the first encountered '1' pixel as the starting point of the contour 以第一次遇到1像素为轮廓起点
MAJ=[6 6 0 0 2 2 4 4]; % variable initialization 变量初始化
C=[0 0 ; 0 0];
k=0;
ended=0;
direction=4;
while(ended==0),
k=k+1;
found_next=0;
while(found_next==0),
switch mod(direction,8),
case 0,
if (BW(row, col+1)==1),
row=row;
col=col+1;
C(k,:)=[row col];
found_next=1;
end;
case 1;
if (BW(row+1, col+1)==1),
row=row+1;
col=col+1;
C(k,:)=[row col];
found_next=1;
end;
case 2;
if (BW(row+1, col)==1),
row=row+1;
col=col;
C(k,:)=[row col];
found_next=1;
end;
case 3;
if (BW(row+1, col-1)==1),
row=row+1;
col=col-1;
C(k,:)=[row col];
found_next=1;
end;
case 4;
if (BW(row, col-1)==1),
row=row;
col=col-1;
C(k,:)=[row col];
found_next=1;
end;
case 5;
if (BW(row-1, col-1)==1),
row=row-1;
col=col-1;
C(k,:)=[row col];
found_next=1;
end;
case 6;
if (BW(row-1, col)==1),
row=row-1;
col=col;
C(k,:)=[row col];
found_next=1;
end;
case 7;
if (BW(row-1, col+1)==1),
row=row-1;