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?
Related Questions
Expert Answer
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