Creating a binary mask using imfreehand

  • Follow


Using
h = imfreehand(gca);
I would like to draw a freehand roi on an image and have a binary mask output, with pixels inside the freehand roi assigned 1 and outside 0. Any ideas? 
0
Reply eli 7/23/2010 12:09:04 AM

Anyone?
0
Reply eli 7/26/2010 4:05:08 PM


On Jul 26, 12:05=A0pm, "eli goodwin" <egood...@uoregon.edu> wrote:
> Anyone?

----------------------------------------------
See my demo:

% Change the current folder to the folder of this m-file.
% (The line of code below is from Brett Shoelson of The Mathworks.)
if(~isdeployed)
	cd(fileparts(which(mfilename)));
end
clc;	% Clear command window.
clear;	% Delete all variables.
close all;	% Close all figure windows except those created by imtool.
imtool close all;	% Close all figure windows created by imtool.
workspace;	% Make sure the workspace panel is showing.
fontSize =3D 20;

% Read in standard MATLAB gray scale demo image.
grayImage =3D imread('cameraman.tif');
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
message =3D sprintf('Left click and hold to begin drawing.\nSimply lift
the mouse button to finish');
uiwait(msgbox(message));
hFH =3D imfreehand();

% Create a binary image ("mask") from the ROI object.
binaryImage =3D hFH.createMask();
% Display the freehand mask.
subplot(2, 2, 2);
imshow(binaryImage);
title('Binary mask of the region', 'FontSize', fontSize);

% Calculate the area, in pixels, that they drew.
numberOfPixels1 =3D sum(binaryImage(:))
% Another way to calculate it that takes fractional pixels into
account.
numberOfPixels2 =3D bwarea(binaryImage)

% Get coordinates of the boundary of the freehand drawn region.
structBoundaries =3D bwboundaries(binaryImage);
xy=3DstructBoundaries{1}; % Get n by 2 array of x,y coordinates.
x =3D xy(:, 2);	% Columns.
y =3D xy(:, 1);	% Rows.
subplot(2, 2, 1); % Plot over original image.
hold on;	% Don't blow away the image.
plot(x, y, 'LineWidth', 2);

% Burn line into image by setting it to 255 wherever the mask is true.
burnedImage =3D grayImage;
burnedImage(binaryImage) =3D 255;
% Display the image with the mask "burned in."
subplot(2, 2, 3);
imshow(burnedImage);
title('New image with mask burned into image', 'FontSize', fontSize);

% Mask the image and display it.
% Will keep only the part of the image that's inside the mask, zero
outside mask.
maskedImage =3D grayImage;
maskedImage(~binaryImage) =3D 0;
subplot(2, 2, 4);
imshow(maskedImage);
title('Masked Image', 'FontSize', fontSize);

% Calculate the mean
meanGL =3D mean(maskedImage(binaryImage));

% Report results.
message =3D sprintf('Mean value within drawn area =3D %.3f\nNumber of
pixels =3D %d\nArea in pixels =3D %.2f', ...
    meanGL, numberOfPixels1, numberOfPixels2);
msgbox(message);

0
Reply ImageAnalyst 7/28/2010 4:00:41 PM

Eli.

Check the ROI methods at http://www.mathworks.com/help/toolbox/images/ref/imroi.html#addnewposcbk

Probably you need to use:

BW = createMask(h)


Hope you can solve it (if not yet...!!)

Carlos




"eli goodwin" <egoodwin@uoregon.edu> wrote in message <i2amj0$o8c$1@fred.mathworks.com>...
> Using
> h = imfreehand(gca);
> I would like to draw a freehand roi on an image and have a binary mask output, with pixels inside the freehand roi assigned 1 and outside 0. Any ideas? 
0
Reply carlos.parra (3) 9/13/2010 8:02:04 PM

3 Replies
967 Views

(page loaded in 0.059 seconds)




Reply: