ROI selection without overlap

carlos Uribe · Feb 25, 2022 · 1.9K views
Question
I'm trying to select several ROI's from an image using the following code:   for i=1:nbrois roi3d{i}=roipoly(A); end Which works OK...I however, need to be sure that those ROIs don't overlap with each other. Is there a way of selecting the first ROI, have the program show the polygon on top of the image to select the second ROI and so on? In other words, I want to select the ROIs with all the previous ROIs displayed on the image, is that possible?
Expert Answer
Profile picture of Prashant Kumar
Prashant Kumar PhD Expert
Answered Aug 24, 2026
There is no built-in function of ROIPOLY, that I know of, that will do this. So, you'll need to alter your raw image to outline/overlay the regions you have selected. I've pasted below a simple loop using my outlining function MASKOUT. You might have better success using a more robust function from the File Exchange like IMOVERLAY.
 
You won't be able to run this "as is". You'll need to point it to your raw image.
 
reply = input('Circle regions to [a]dd, [n]ext image? a/n [n]: ', 's');
    if isempty(reply)
        reply = 'n';
    end

      %loop for each ROI created
      while reply == 'a' 

              im2 = imread(char(filenames(1, x)));  %raw image
              brtemp = false(size(im2, 1), size(im2, 2));   %binary mask of ROIs         
              timg = maskout(im2, brtemp, 2); 

          if reply == 'a'

              brtemp = roipoly(timg) | brtemp;  %manual interaction to create ROI, add to BRTEMP
              timg = maskout(im2, brtemp, 2);  %display outline of all masks created

              reply = input('Circle regions to [a]dd, [r]emove, [n]ext? a/r/n [n]: ', 's');
              if isempty(reply)  %default reply is N
                  reply = 'n';
              end

          end
      end

function [imgout] = maskout(imgin, maskin, thickness)
% MASKOUT  displays the outline of a binary mask on an image.
% 

imgout = imgin;

if exist('thickness', 'var')
    bwout = bwmorph(bwperim(maskin), 'dilate', thickness);
    imgout(bwout) = 255;
else
    bwout = bwperim(maskin);
    imgout(bwout) = 255;
end

imshow(imgout);
end

 

Have a different question? Ask here

Get a Free Consultation or a Sample Assignment Review!