Search code examples
matlabmatrixcoordinatessubsetmatrix-indexing

Correspondence label and coordinates' points


How to obtain the coordinates of the first and the last appearances (under column-major ordering) of each label present in a matrix?

Example of a label matrix (where labels are 1 to 4):

L = [    
     1 1 1 1 0 0 0 0
     0 0 0 0 2 2 0 0
     0 0 0 0 0 0 2 0
     0 0 0 0 0 0 0 0
     0 0 0 0 0 3 0 0
     0 0 0 0 0 0 3 3
     0 0 0 4 0 0 0 0
     4 4 4 0 0 0 0 0
    ];

For the above example L, I would like to obtain a matrix of coordinates like:

M = [
    1 1 1
    1 4 1
    2 5 2
    3 7 2
    5 6 3
    6 8 3
    8 1 4
    7 4 4 ];

Where the 1st column of M contains horizontal coordinates, the 2nd contains vertical coordinates, and the 3rd column contains the label. There should be 2 rows for each label.


Solution

  • With for-loop you can do it like that:

    M=zeros(2*max(L(:)),3);
    for k=1:max(L(:))
       [r,c]=find(L==k);
       s=sortrows([r c],2);
       M(k*2-1:k*2,:)=[s(1,:) k; s(end,:) k];
    end
    
    M =
     1     1     1
     1     4     1
     2     5     2
     3     7     2
     5     6     3
     6     8     3
     8     1     4
     7     4     4
    

    Maybe somehow with regionprops options you can do it without the loop...