⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 contour_following.m

📁 counter following code can be used in other projects
💻 M
字号:
function C = contour_following(BW)% CONTOUR_FOLLOWING takes a binary array and returns the sorted row and% column coordinates of contour pixels.%% 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).%% Note: % - if the object is less than 3 pixels, CONTOUR_FOLLOWING sends back [0 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 widthItemp=zeros(m+2,n+2);                                                      % we create a '0' frame around the image to avoid border problemsItemp(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 imageBW = bwmorph(BW,'thin',Inf);                                               % to be sure to have strictly 8-connected contourif (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 contourMAJ=[6 6 0 0 2 2 4 4];                                                     % variable initializationC=[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;                    col=col+1;                    C(k,:)=[row col];                    found_next=1;                end;                        end        if (found_next==0), direction=direction+1; end;            end        if(and((length(C)>3),(([C(1,:) C(2,:)]==[C((end-1),:) C(end,:)])))),        ended=1;     end;        direction = MAJ((mod(direction,8)+1));endC=C(1:(end-1),:);                                                          % the first and last points in the list are the same (circular list)C=C-1;                                                                     % to go back to the original coordinates (without the '0' frame)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -