ROI selection without overlap

2 views (last 30 days)
carlos Uribe
carlos Uribe on 26 Mar 2013
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?
Any help is appreciated.
  1 Comment
Image Analyst
Image Analyst on 26 Mar 2013
I'm not sure what you want to do.
Do you want to use plot() to plot all the old ROIs on the image so the users will know where they already drew and to not draw into those regions? Is that what " I want to select the ROIs with all the previous ROIs displayed on the image" means?
Then, after the user has (correctly or incorrectly) drawn an ROI, do you want to check each newly-drawn ROI and alert the user if it overlaps any of the prior ROI, and not add that ROI to the list of valid ROIs?
Please explain in more detail.

Sign in to comment.

Accepted Answer

Jeff E
Jeff E on 26 Mar 2013
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

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!