From: Mathew Thomas on
Hey all !!!

I'm using imfreehand on an image and I save the coordinate points obtained. Using 'plot' command, I am able to reproduce the imfreehand shape on an image. But this does not stay on the image. Is there any way I can keep the shape on the image, so that I can include it in measurements ??

Note : I tried creating a binary mask by turning the coordinate points obtained from freehand to '1', but the pixels values have to be rounded up since they have decimal values, which creates a slight change in the output and the pixels are not longer connected.
From: ImageAnalyst on
Mathew Thomas:
Try this demo I wrote:

% 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 = 20;

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

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

% Get coordinates of the boundary of the freehand drawn region.
structBoundaries = bwboundaries(binaryImage);
xy=structBoundaries{1}; % Get n by 2 array of x,y coordinates.
x = xy(:, 2); % Columns.
y = 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 = grayImage;
burnedImage(binaryImage) = 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 = grayImage;
maskedImage(~binaryImage) = 0;
subplot(2, 2, 4);
imshow(maskedImage);
title('Masked Image', 'FontSize', fontSize);

From: Mathew Thomas on
Hey ImageAnalyst,

Thanks yet again. I'll try it out and let you know how it goes.

Mathew
From: Mathew Thomas on
Hey IA,

I'm getting the following error when trying your demo code.

??? Attempt to reference field of
non-structure array.

Error in ==> delete at 25
binaryImage = hFH.createMask();

I did try the createMast procedure earlier also, but kept getting the same error. Let me know what you think.

Thanks,

Mathew
From: Mathew Thomas on
Hey ImageAnalyst,

I'm getting the following error when trying your demo code.

??? Attempt to reference field of
non-structure array.

Error in ==> delete at 25
binaryImage = hFH.createMask();

I did try the createMast procedure earlier also, but kept getting the same error. Let me know what you think.

Thanks,

Mathew