how to find volume in the region of interst made by imfreehand

Dearc All
Hope you are keeping good. i can made a region of interst (ROI) by imfreehand. can anybody help me to suggest that how can i find the volume of that region made by imfreehand???? i am giving a code here too
if true
% % --- Executes just before JP is made visible.
function JP_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
handles.files=dir(fullfile('C:', 'Users','khanm', 'Desktop','image files\*.jpg'));
for i = 1 : length(handles.files)
handles.X{i}= imread(fullfile('C:', 'Users','khanm', 'Desktop','image files',handles.files(i).name));
end
imshow(handles.X{1},[]);
handles.index = 1;
Cek(hObject, eventdata, handles);
guidata(hObject, handles);
% UIWAIT makes JP wait for user response (see UIRESUME) % uiwait(handles.figure1);
% --- Outputs from this function are returned to the command line. function varargout = JP_OutputFcn(hObject, eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Get default command line output from handles structure varargout{1} = handles.output;
% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) handles.output = hObject; handles.index = handles.index - 1; Cek(hObject, eventdata, handles); imshow(handles.X{handles.index},[]); guidata(hObject, handles);
% --- Executes on button press in pushbutton2. function pushbutton2_Callback(hObject, eventdata, handles) handles.output = hObject; handles.index = handles.index + 1; Cek(hObject, eventdata, handles); imshow(handles.X{handles.index},[]); imfreehand
function Cek(hObject, eventdata, handles) handles.output = hObject; n = length(handles.files); if handles.index > 1, set(handles.pushbutton1,'enable','on'); else set(handles.pushbutton1,'enable','off'); end if handles.index < n, set(handles.pushbutton2,'enable','on'); else set(handles.pushbutton2,'enable','off'); end guidata(hObject, handles);
end
any appriciation is regarded in advnace.
Muhammad isa

 Accepted Answer

See my demo:
% Demo to have the user freehand draw an irregular shape over a gray scale image.
% Then it creates new images:
% (1) where the drawn region is all white inside the region and untouched outside the region,
% (2) where the drawn region is all black inside the region and untouched outside the region,
% (3) where the drawn region is untouched inside the region and all black outside the region.
% It also (4) calculates the mean intensity value and standard deviation of the image within that shape,
% (5) calculates the perimeter, centroid, and center of mass (weighted centroid), and
% (6) crops the drawn region to a new, smaller separate image.
% Change the current folder to the folder of this m-file.
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 = 16;
% Read in a standard MATLAB gray scale demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'cameraman.tif';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% File doesn't exist -- didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
imshow(grayImage, []);
axis on;
title('Original Grayscale Image', 'FontSize', fontSize);
set(gcf, 'Position', get(0,'Screensize')); % Maximize figure.
message = sprintf('Left click and hold to begin drawing.\nSimply lift the mouse button to finish');
uiwait(msgbox(message));
hFH = imfreehand();
% Create a binary image ("mask") from the ROI object.
binaryImage = hFH.createMask();
xy = hFH.getPosition;
% Now make it smaller so we can show more images.
subplot(2, 3, 1);
imshow(grayImage, []);
axis on;
drawnow;
title('Original Grayscale Image', 'FontSize', fontSize);
% Display the freehand mask.
subplot(2, 3, 2);
imshow(binaryImage);
axis on;
title('Binary mask of the region', 'FontSize', fontSize);
% Label the binary image and computer the centroid and center of mass.
labeledImage = bwlabel(binaryImage);
measurements = regionprops(binaryImage, grayImage, ...
'area', 'Centroid', 'WeightedCentroid', 'Perimeter');
area = measurements.Area
centroid = measurements.Centroid
centerOfMass = measurements.WeightedCentroid
perimeter = measurements.Perimeter
% Calculate the area, in pixels, that they drew.
numberOfPixels1 = sum(binaryImage(:))
% Another way to calculate it that takes fractional pixels into account.
numberOfPixels2 = bwarea(binaryImage)
% 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, 3, 1); % Plot over original image.
hold on; % Don't blow away the image.
plot(x, y, 'LineWidth', 2);
drawnow; % Force it to draw immediately.
% 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, 3, 3);
imshow(burnedImage);
axis on;
caption = sprintf('New image with\nmask burned into image');
title(caption, 'FontSize', fontSize);
% Mask the image and display it.
% Will keep only the part of the image that's inside the mask, zero outside mask.
blackMaskedImage = grayImage;
blackMaskedImage(~binaryImage) = 0;
subplot(2, 3, 4);
imshow(blackMaskedImage);
axis on;
title('Masked Outside Region', 'FontSize', fontSize);
% Calculate the mean
meanGL = mean(blackMaskedImage(binaryImage));
sdGL = std(double(blackMaskedImage(binaryImage)));
% Put up crosses at the centriod and center of mass
hold on;
plot(centroid(1), centroid(2), 'r+', 'MarkerSize', 30, 'LineWidth', 2);
plot(centerOfMass(1), centerOfMass(2), 'g+', 'MarkerSize', 20, 'LineWidth', 2);
% Now do the same but blacken inside the region.
insideMasked = grayImage;
insideMasked(binaryImage) = 0;
subplot(2, 3, 5);
imshow(insideMasked);
axis on;
title('Masked Inside Region', 'FontSize', fontSize);
% Now crop the image.
leftColumn = min(x);
rightColumn = max(x);
topLine = min(y);
bottomLine = max(y);
width = rightColumn - leftColumn + 1;
height = bottomLine - topLine + 1;
croppedImage = imcrop(blackMaskedImage, [leftColumn, topLine, width, height]);
% Display cropped image.
subplot(2, 3, 6);
imshow(croppedImage);
axis on;
title('Cropped Image', 'FontSize', fontSize);
% Put up crosses at the centriod and center of mass
hold on;
plot(centroid(1)-leftColumn, centroid(2)-topLine, 'r+', 'MarkerSize', 30, 'LineWidth', 2);
plot(centerOfMass(1)-leftColumn, centerOfMass(2)-topLine, 'g+', 'MarkerSize', 20, 'LineWidth', 2);
% Report results.
message = sprintf('Mean value within drawn area = %.3f\nStandard deviation within drawn area = %.3f\nNumber of pixels = %d\nArea in pixels = %.2f\nperimeter = %.2f\nCentroid at (x,y) = (%.1f, %.1f)\nCenter of Mass at (x,y) = (%.1f, %.1f)\nRed crosshairs at centroid.\nGreen crosshairs at center of mass.', ...
meanGL, sdGL, numberOfPixels1, numberOfPixels2, perimeter, ...
centroid(1), centroid(2), centerOfMass(1), centerOfMass(2));
msgbox(message);

19 Comments

Thanks for your help. volume can be calculated by multiplying area with the slice number? because i have 55 different slice?? these are in jpg but can be coverted to tif too. when i change your path to mine path like folder = fullfile('C:\Users\khanm\Desktop\image files'); baseFileName = 'fig11.tif'; and when i run this then i found error like this. Error using iptassert (line 20) *Size of I doesn't match size information found in the first input argument.
Error in regionprops>ParseInputs (line 1113) iptassert(isequal(sizeImage,size(I)), ...
Error in regionprops (line 154) [I,requestedStats,officialStats] = ParseInputs(imageSize, varargin{:});
Error in Catdemoo (line 59) measurements = regionprops(binaryImage, grayImage, ... *
so i cannot calculte area or anyother parameters. i have 55 slices i want to calculate volume of region of interst at every slice, thanks for your help in advance. Isa
Area by the slice THICKNESS not slice NUMBER.
ya thanks. you did not told me about the error? what i do with that? actually my image is a colored image and i need to find volume of colored image too. when i run i come with 'Original gray scale image and binary mask of the image.
when i change your path to mine path like folder = fullfile('C:\Users\khanm\Desktop\image files'); baseFileName = 'fig11.tif'; and when i run this then i found error like this. Error using iptassert (line 20) *Size of I doesn't match size information found in the first input argument.
Error in regionprops>ParseInputs (line 1113) iptassert(isequal(sizeImage,size(I)), ...
Error in regionprops (line 154) [I,requestedStats,officialStats] = ParseInputs(imageSize, varargin{:});
Error in Catdemoo (line 59) measurements = regionprops(binaryImage, grayImage, ... *
please solve my this problem.
There's not really much to go on but I'd guess that the size of binaryImage does not match the size of grayImage. How many rows and columns does each have?
yes the problem is size. every slice has 127 rows and 127 columns.
Maybe grayImage is really color. What does this say:
size(grayImage)
size(binaryImage) % Don't use semicolons so it will print to window.
Error using iptassert (line 20) Size of I doesn't match size information found in the first input argument.
this error comes on the commond window. isa
What did the size() functions report to you in the command window???????
Error using iptassert (line 20) Size of I doesn't match size information found in the first input argument.
Error in regionprops>ParseInputs (line 1113) iptassert(isequal(sizeImage,size(I)), ...
Error in regionprops (line 154) [I,requestedStats,officialStats] = ParseInputs(imageSize, varargin{:});
Error in Catdemoo (line 60) measurements = regionprops(binaryImage, grayImage, ... i found the above error in command window
it works very well and gives area, centroid, center of mass, perimeter, numberof pixels and numberof pixels2. when i dont change these
folder = fullfile(matlabroot, '\toolbox\images\imdemos'); baseFileName = 'cameraman.tif'; but when i change these lines to my folder such as
folder = fullfile('C:\Users\khanm\Desktop\image files');
baseFileName = 'fig11.tif';
then the i found error on command window which i told you. i need your help please.
I know you need my help - that's why I offered it but you're confusing me when I tell you to do something - twice! - and you don't do it. Why didn't you put the size commands in there like I told you to (twice)????? In other words, why did you not have this code in your program:
size(grayImage)
size(binaryImage) % Don't use semicolons so it will print to window.
measurements = regionprops(binaryImage, grayImage, 'Centroid', 'Perimeter', 'Area', 'WeightedCentroid');
Please tell me why you are refusing to put that code in there like I instructed, when you know that I need that information to help you. Don't just tell me the error again. I've already seen it three times and don't need to see it a fourth time.
Extremly Sorry Sir, actually i did not understand what you want from me to do. i replace the previous code as
% Label the binary image and computer the centroid and center of mass. labeledImage = bwlabel(binaryImage); size(grayImage) size(binaryImage) % Don't use semicolons so it will print to window. measurements = regionprops(binaryImage, grayImage, ... 'area', 'Centroid', 'WeightedCentroid', 'Perimeter'); area = measurements.Area centroid = measurements.Centroid centerOfMass = measurements.WeightedCentroid perimeter = measurements.Perimeter but i find same error on command window with these values above the error ans =
414 560 3
ans =
414 560
Aha! See, what you call "grayImage" is not really gray. It's color, because the third number, the number of color channels, is 3. You need to decide what to do about that, such as take the green channel, or call rgb2gray() or whatever.
i have all colored images in jpg and i can convert them to tiff by exporting as well as convert them to gray using MATLAB rgb2gray(). i coverted one of them gray and in tiff. when i run the program the same results i found. which i send you in yesterday.
one thing more you can take a any cat image from the google and then convert this to gray image and tiff format. and run in the demo. i found same error there at command window as i found using my images. you can try too if possible to understand my problem more.
Tiff is the format on disk and has nothing to do with what you have in your program. Once it's in the program, it's a 3D array of numbers. You have to use rgb2gray after that, which you're not doing yet.
Oh. thank you Dr. this works very well. thank you soo much Dear. May you have long life. one question please. what are units of the area that appears on commomd window.
Actually i am new in MATLAB. so, i took time to understand. Sorry for that. one more question please. i have 55 images. i want to show those all one by one in Axis of GUI using slider or using 2 pushbuttons (forward and backward) and want to use this part (given below) of code to calculate just area (which i contour with freehand tool).i made the GUI prog with 2 pushbuttons which i told in my first mail.How can i change in that prog (which i sent in my first mail)to get the results i stated using this part given below.
if true
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 = 16;
% Read in a standard MATLAB gray scale demo image.
folder = fullfile('C:\Users\khanm\Desktop\image files');
baseFileName = '004.jpg';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% File doesn't exist -- didn't find it there. Check the search path for it.
fullFileName = baseFileName; % No path this time.
if ~exist(fullFileName, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName); imshow(grayImage, []); axis on; title('Original Grayscale Image', 'FontSize', fontSize); set(gcf, 'Position', get(0,'Screensize')); % Maximize figure. message = sprintf('Left click and hold to begin drawing.\nSimply lift the mouse button to finish'); uiwait(msgbox(message)); hFH = imfreehand(); % Create a binary image ("mask") from the ROI object. binaryImage = hFH.createMask(); xy = hFH.getPosition; % Now make it smaller so we can show more images. subplot(2, 3, 1); imshow(grayImage, []); axis on; drawnow; title('Original Grayscale Image', 'FontSize', fontSize); % Display the freehand mask. subplot(2, 3, 2); imshow(binaryImage); axis on; title('Binary mask of the region', 'FontSize', fontSize); % Label the binary image and computer the centroid and center of mass. labeledImage = bwlabel(binaryImage); GrayImage=rgb2gray(grayImage); measurements = regionprops(binaryImage, GrayImage, ... 'area'); area = measurements.Area
end
ya i done that i said in my last post. can we calculate the cpprdinate values of area? means its x nad y values?
The coordinates are in the xy array.

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!