Is there a way in MATLAB to compute which discrete image regions enclose or are enclosed by another region?

前端 未结 1 1651
时光取名叫无心
时光取名叫无心 2021-01-13 12:10

Given the following image:

\"Regions\"

I\'d like to identify which colored regions are enclosed by or

相关标签:
1条回答
  • 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
    

    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!

    0 讨论(0)
提交回复
热议问题