4

Given the following image:

Regions

I'd like to identify which colored regions are enclosed by or enclose which other colored regions. How might this be computed? Is there a way to create a sort of tree or table that shows this information?

Example: All the red pixels are within the yellow region.

gnovice
  • 123,396
  • 14
  • 248
  • 352

1 Answers1

4

There's no built-in function I know of that can perform this calculation, but here's an idea for how you might get at the information you want...

First, you'll want to take your RGB image from above and turn it into an indexed image and a color map. Here's one way to do it:

img = double(imread('nested_regions.png'))./255;  % Load the RGB image
map = unique(reshape(img, [], 3), 'rows');        % Find the unique colors
labelImage = rgb2ind(img, map);                   % Get a labeled (i.e. indexed) image
nColors = size(map, 1);

Next, you'll want to loop over each labeled region, create a mask, then fill any "holes" in that mask using imfill. If the filled regions contain label values that the rest of the image doesn't, then those regions are completely contained by the region you filled. The code below does this using the setdiff function:

contains = cell(nColors, 1);              % Storage for the contained region labels
str=' # | contains\n---+------------\n';  % String for displaying output

for iColor = 1:nColors

  maskImage = (labelImage == iColor-1);      % Mask of the current region
  filledImage = imfill(maskImage, 'holes');  % Mask with holes filled
  holeImage = (filledImage & ~maskImage);    % Mask of the filled holes
  contains{iColor} = setdiff(unique(labelImage(holeImage)), ...
                             unique(labelImage(~holeImage))).';  %.'
  str = [str ' ' num2str(iColor-1) ' | ' num2str(contains{iColor}) '\n'];

end

imshow(labelImage, map, 'InitialMagnification', 60);  % Display image
colorbar();                                           %   with a colorbar
fprintf(str);  % Create some formatted text output

After running the above, you will get the following:

 # | contains
---+------------
 0 | 1  2  3  4  5  6  7  8  9
 1 | 3  4  5  7  9
 2 | 3  4  5  7  9
 3 | 
 4 | 3
 5 | 3  4
 6 | 
 7 | 3  4  5
 8 | 
 9 | 3  4  5  7

enter image description here

For example, the red pixels (labeled as region 7) surround all the pixels in labeled regions 3, 4, and 5 (gray-blue, purple, and lime, respectively). Some regions don't form closed contours, like 6 (light purple) and 8 (orange). Region 1 (green) actually isn't fully contained by region 2 (blue) since a spurious pixel or two of green is outside the blue region.

Hope this gives you some ideas!

gnovice
  • 123,396
  • 14
  • 248
  • 352