MATLAB Answers

calculate volume under of 3D isosurface plot

35 views (last 30 days)
I have a 3D matrix data V(201,101,101). I want to calculate the isosurface volume for a particular isovalue.
How to calculate the volume.
I used following code to generate isosurface.
figure;
p = patch(isosurface(x,y,z,V,-2));
isonormals(x,y,z,V,p);
cdata = smooth3(rand(size(V)),'box',7);
isocolors(x,y,z,cdata,p)
p.Facecolor = 'interp';
p.Edgecolor = 'none';

  4 Comments

Show 1 older comment
Abhishek Saini
Abhishek Saini on 28 Nov 2019
I didin't understand, what do you mean by alphashape?
Abhishek Saini
Abhishek Saini on 28 Nov 2019
How to get the values of x,y, and z.
I used
p = issurface(x,y,z,V,isovalue).
It returns
p.vertices and
p.faces.
What should I use to calculate the colum and how does it will give volume.
I have attached isosurface image.
Capture.PNG

Sign in to comment.

Accepted Answer

Constantino Carlos Reyes-Aldasoro
Edited: Constantino Carlos Reyes-Aldasoro on 29 Nov 2019
What isosurface and isovalue are doing are generating a surface around those points that are above a certain value. All code you showed is good for visualising, but what you really want here is not a visual display but a number of the volume.
If you want the volume that is the same as how many points satisfy your condition of voxel intensity > value, so what you have to do is the following:
volumeOfInterest = (V >-2 );
That will generate a matrix of same dimensions as V with 1 for those points above the isovalue and 0 below, then simply sum those values
volume = sum (volumeOfInterest(:));
And then, if needed you will need to callibrate that value to the physical quantity of your interest (say mm^3) with a conversion between voxels and that quantity.
Hope that helps

  3 Comments

Abhishek Saini
Abhishek Saini on 29 Nov 2019
Thanks Constantino for the detailed answer. If I am not wronf the volume is the sum of number of voxels having values 1 (lets say 200). This means it is scalar quantity. So the actual volume will be
volumeOfInterest = (V >-2 );
volume = sum (volumeOfInterest(:));
actual_volume = volume * volume_of_1_voxel; % unit of voxel i.e. mm^3
Is this correct.
Walter Roberson
Walter Roberson on 29 Nov 2019
Abhishek Saini: please only use Flag to notify the moderators of problems with posts.
Constantino Carlos Reyes-Aldasoro
True, the code I wrote was only calculating the number of voxels, but if you want to callibrate that number into a certain physical quantity, like m^3 or mm^3 you will need to do that multiplication. Will edit my previous response so that it has the complete answer in case someone new arrives to this post.

Sign in to comment.

More Answers (0)

Sign in to answer this question.