问题
I'd like to manually draw multiple regions on an image to create a binary mask of the drawn regions (ground truth).
I attached the code to do it using imfreehand that does the job for one region, but once in release the mouse button, binary mask for that single region is displayed. Is there a way to draw multiple regions and then display the binary mask? (Calling imfreehand multiple times may not work because the number of regions varies with each image).
h= imfreehand();
h = imfreehand(gca);
setColor(h,'red');
position = wait(h);
BW = createMask(h);
figure,imshow(BW);
axis on;
Thanks.
回答1:
You can loop until you get an empty mask - this will indicate that the user finished drawing all masks.
Let sz
be the desired size of the output mask, then
totMask = false( sz ); % accumulate all single object masks to this one
h = imfreehand( gca ); setColor(h,'red');
position = wait( h );
BW = createMask( h );
while sum(BW(:)) > 10 % less than 10 pixels is considered empty mask
totMask = totMask | BW; % add mask to global mask
% you might want to consider removing the old imfreehand object:
delete( h ); % try the effect of this line if it helps you or not.
% ask user for another mask
h = imfreehand( gca ); setColor(h,'red');
position = wait( h );
BW = createMask( h );
end
% show the resulting mask
figure; imshow( totMask ); title('multi-object mask');
回答2:
As a complement to the answer given by @Shai, you can also use the input()
function in Matlab to prompt the user for the total number of masks needed or simply as a yes/no question in a while loop.
That is, either:
imshow(img,[]) %display image to determine number of masks needed
n = input('How many masks are needed? ') %Ask user for number of masks needed
for i=1:n
create multiple masks...
end
or
n=1;
while(n==1)
create mask ...
n = input('Need more masks? [0=No, 1=Yes] ')
end
来源:https://stackoverflow.com/questions/23463516/draw-multiple-regions-on-an-image-imfreehand