Filter löschen
Filter löschen

ROI selection without overlap

2 Ansichten (letzte 30 Tage)
carlos Uribe
carlos Uribe am 26 Mär. 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 Kommentar
Image Analyst
Image Analyst am 26 Mär. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jeff E
Jeff E am 26 Mär. 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

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by