二值图像的轮廓跟踪

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档