Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Identify adjacent superpixels iteratively

Let A be:

 1 1 1 1 1 1
 1 2 2 3 3 3
 4 4 2 2 3 4
 4 4 4 4 4 4
 4 4 5 5 6 6
 5 5 5 5 5 6

I need to identify a particular superpixel's adjacent pixels,

e.g.

The 1st adjacency of 2 is 1, 3, 4

The 2nd adjacency of 2 is 5, 6

The 3rd adjacency of 2 is ...

What is the FASTEST way to do it?

like image 871
user570593 Avatar asked Apr 14 '26 14:04

user570593


2 Answers

Assume you have a function adj(value), that has the code from your previous question.

sidenote: you probably would like that adj() function not to return the value of the pixel you are analyzing. you can make that easily.

you could do:

img=[your stuff];
imgaux=img;
ii=1;
val=2; %whatever value you want
while numel(unique(imgaux))>1 % Stop if the whole image is a single superpixel
   adjacent{ii}=adj(val);
   % expand the superpixel to the ii order of adjacency
   for jj=1:size(adjacent{ii},1)
       imgaux(imgaux==adjacent{ii}(jj))==val; 

   end
   ii=ii+1;
end

Now size(adjacent,2) will be the amount of adjacency levels for that superpixel.

I am guessing this code is optimizable, I welcome any try for it!

like image 113
Ander Biguri Avatar answered Apr 16 '26 03:04

Ander Biguri


Following Dan's suggestion on the comments, here is a possible implementation:

% Parameters pixVal = 2;

adj = {};
prevMask = A == pixVal;
for ii = 1:length(A)
    currMask = imdilate(prevMask, ones(2 * ii + 1));
    adj{ii} = setdiff(unique(A(currMask & ~prevMask))', [adj{:}]);
    if isempty(adj{ii})
        break
    end
    prevMask = currMask;
end

Where pixVal is the pixel you want to look at.

Result:

>> adj{:}

ans =

     1     3     4


ans =

     5     6


ans =

   Empty matrix: 1-by-0
like image 37
Rafael Monteiro Avatar answered Apr 16 '26 03:04

Rafael Monteiro



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!