extract 3D surface from 3D volume data

조회 수: 23 (최근 30일)
RNTL
RNTL 2012년 2월 2일
댓글: Sumayyah Alhydary 2021년 4월 24일
Hi, I have a volumetric data (in the form of (x,y,z,val(x,y,z)) array of data on and within a 3D volume shape. I would like to take only the coordinates and value on the surface.
Does anyone have an idea ?

답변 (4개)

Sean de Wolski
Sean de Wolski 2012년 2월 2일
It sounds like you may want to create an isosurface (a volumetric contour map).
doc isosurface
  댓글 수: 4
Bjorn Gustavsson
Bjorn Gustavsson 2012년 2월 3일
Now we can start working!
If you don't take the radius from [0,0,0] but from the center of your points [xC,yC,zC] then you might be set. If you should calculate the center points with the mean or median of the points, like the center of mass (sum(x.*val)/sum(val)), also it is not given that such center even are inside a general 3-D body. But these steps you can judge better yourself.
HTH
RNTL
RNTL 2012년 2월 10일
Hi,
unfortunately its more complicated than that. I could use it if the shape was surrounded by a closed curve (in 2D plane). but its not the case.

댓글을 달려면 로그인하십시오.


YADOLAH GANJKHANLOU
YADOLAH GANJKHANLOU 2020년 6월 3일
if you voxilize the object then yes it is very easy
you can run following code to see how it work:
load('spiralVol.mat');
h = volshow(spiralVol);
B = bwperim(spiralVol);
figure
h = volshow(B);
to voxilize your volume:
Just make a zeros matrix V with your volume's dimention and then make the voxels with x,y,z of your shape to be equal to 1.
you can reverese the above algoritm to extract X,Y,Z of the surface of you volume.
Yadi

Bjorn Gustavsson
Bjorn Gustavsson 2012년 2월 2일
Algorithm in steps:
  1. Extract the surface elements in x y z and val
Done! Since we cant know how you define the surface, the shape of the surface or any other facts about it except that it is a surface in 3-D it is not easy for us to give you more than that. If you want to display it you might get somewhere with:
T = delaunay3(X,Y,Z,{'Qt', 'Qbb', 'Qc', 'Qz'} ); and then something like tetramesh
HTH
  댓글 수: 3
Bjorn Gustavsson
Bjorn Gustavsson 2012년 2월 2일
Yes, and we still do not know how you see the surface, is it the boundary between where val is finite and nan, 0? Something else? If you want us to be able to give even suggestions you'd be better off if you gave us something to go on...
Josiah Yoder
Josiah Yoder 2017년 1월 27일
I have the same question as the asker. To answer Bjorn's question, Suppose I pick any threshold, say 0.5, how can I find the surface where the volume = 0.5?

댓글을 달려면 로그인하십시오.


Kevin Moerman
Kevin Moerman 2012년 2월 10일
Could you rephrase/clarify your question? It sounds like you have 3D image data and that you are only interested in a certain surface within this volume.
Do you have intensity data x,y,z,val for a cloud of points or is that an image? And do I understand it correctly that you have coordinates that you know lie on the surface? Like x_s,y_x,z_s? And that you want to find the intensities on the surface points e.g. val_s? This can be achieved through interpolation (e.g. griddata3 or TriScatterInterp). If you want an actual description of the surface like patch data (faces and vertices) for plotting of the possibly closed shape (you don’t need this for determination of val_s on these points) then its more complex. Then you have point cloud onto which you want to draw a surface. You could try the cart2sph approach you suggested but this will produce possible artefacts at the poles and will lead to non-unique solutions at locations with double solutions in the spherical coordinate system (multiple radii solutions for a given angular coordinate set). There’s a number of quick and dirty approaches to getting the surface: 1) Just use the convex hull 2) Do a Delaunay tessellation (the outer surface elements now describe the convex hull again) but delete tetrahedrons which contain edged which are too long (i.e. these might be bridging the gaps that you do not want bridged). Then find the outer triangles to find your surface. This only works if you have a nice even point spacing. Good luck.
Kevin
  댓글 수: 2
RNTL
RNTL 2012년 2월 10일
Hi Kevin,
The prob description is this: I have a set of points which is given according to (x,y,z,intensity), where the (x,y,z) values are their spatial location in cartesian coord system. and the intensity at this point. The data I have should contain solely the on-body and in-body points. however, I would like to extract only those points which are on-body.
1. don't have prior knowledge on the on-body intensities.
2. the shape of the body is not convex, so as i understand the convex hull will not be useful here.
I have to check griddata3, maybe it can help.
Thanks, Ron
GS89
GS89 2017년 4월 3일
Did anyone figure out how this can be done?

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Surface and Mesh Plots에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by