LabVIEW

cancel
Showing results for 
Search instead for 
Did you mean: 

redering a 3d image from an intensity stack

I have raw integer data that is stored in a 3-d array of size 256x256x100.  It's very easy to get LabVIEW to display each 2-d image one at a time on an intensity graph, however I would like to generate a solid 3d model using this data.  Is there a way for LabVIEW to display a rotatable 3d model from this stack?
 
Thanks,
Anthony
0 Kudos
Message 1 of 45
(8,063 Views)

"AntLee29" <x@no.email> wrote in message news:1161160808863-429063@exchange.ni.com...
I have raw integer data that is stored in a 3-d array of size 256x256x100.&nbsp; It's very easy to get LabVIEW to display each 2-d image one at a time on an intensity graph, however I would like to generate a solid 3d model using this data.&nbsp; Is there a way for LabVIEW to display a rotatable 3d model from this stack?
&nbsp;
Thanks,
Anthony



Hi,


In the graph control palette (where all the other graphs are) you can find the 3D Surface Graph. I'm not sure if it is included in LabVIEW Base package though...


Regards,


Wiebe.
0 Kudos
Message 2 of 45
(8,048 Views)
I found the 3d surface graph function, but I'm not exactly sure as to how to go about using it from a 3d intensity array.  What should I be wiring into the x-vector, y-vector, and z-matrix inputs?
0 Kudos
Message 3 of 45
(8,033 Views)
As far as I know, this is not possible - although I'd also be interested if anyone can provide a solution!

If you're running Windows, I've used a free volume renderer called Voxx with some success - it should easily handle a volume of that size.

Cheers ~ Greg

0 Kudos
Message 4 of 45
(8,031 Views)
AntLee29,


I didn't get the volume rendering part...


If you have a 3d array with intensities, and you want to draw a solid, you'll a few options...


Use a threshold, and create a surface connecting the (interpolated) coordinates. The resulting surface can be drawn with the 3d surface graph. The creation of the surface seems easy, but isn't. I looked into this once, and it's still being researched. It's not a LabVIEW question though...


If you search the web for "volume rendering tessellation", or "polygonising volumes" you'll get very nice sites like:


http://techpubs.sgi.com/library/dynaweb_docs/0650/SGI_Developer/books/VolumizerPG/sgi_html/ch02.html#id5382630


http://prosjekt.ffi.no/unik-4660/lectures04/chapters/Algorithms2.html


You'll notice that OpenGL is used a lot. And that might be a solution if the 3D Surface Graph isn't sufficient. You can use the 3D extension for the picture control (I think it's standard in LV8.2, you'll have to download it for LV7.1), to draw anything you like. The pennalty is you'll have to draw everything you want yourself, so expect a lot of work to get something working.


You can also raytrace though your 3d data. The result will be a 2d picture, that you can display with a picture control. But it will be slow... So you could use quadtrees, bsd trees, kd trees...


Hope it helps. I think you'll get some starts if you'll post some working code!


Wiebe.




"AntLee29" <x@no.email> wrote in message news:1161209407718-429508@exchange.ni.com...
I found the 3d surface graph function, but I'm not exactly sure as to how to go about using it from a 3d intensity array.&nbsp; What should I be wiring into the x-vector, y-vector, and z-matrix inputs?
0 Kudos
Message 5 of 45
(8,018 Views)
0 Kudos
Message 6 of 45
(8,008 Views)

"unclebump" <x@no.email> wrote in message news:1161267011399-429804@exchange.ni.com...
Is this what you want??
<a href="http://zone.ni.com/devzone/cda/epd/p/id/468" target="_blank">http://zone.ni.com/devzone/cda/epd/p/id/468</a>


No.


We're talking about ways to visualize a 3D set of data, not a surface (represented by 2d array, although the points are 3d+color).


Imagine a cube (1m X 1m X 1m ), divided in little cubes ( .01m X .01m X .01m). Each little cube has an intensity. Data sets like this are generated by e.g. MRI scanners.


To visualize e.g. "bones", you could threshold each little cube. E.g. a MRI value between 3.5 and 6.9 (unit doesn't matter) is bone. The result is a large set of little cubes that need to be visualized. The question is how? Converting it to a surface is a possibility, and then the 3D surface graph can be used.


Regards,


Wiebe.
0 Kudos
Message 7 of 45
(8,006 Views)

Anthony,

Could you please post a VI with the 3-d data saved as default along with an image to remind me what those looked like?

We may be better able to help with a little more info.

Trying to help,

Ben

I'm thinking we can do this with cliping or transparency.

Message Edited by Ben on 10-19-2006 02:49 PM

Retired Senior Automation Systems Architect with Data Science Automation LabVIEW Champion Knight of NI and Prepper LinkedIn Profile YouTube Channel
0 Kudos
Message 8 of 45
(7,996 Views)
The 3d stack is stored in the "Mouse Tendon Data" array.  As of right now, the vi will simply scroll through each layer of the 3d stack and display the 2d results.  See the attached vi.  Thanks for the help everyone. 🙂
 
Thanks,
Anthony
 
 
P.S.
I already know about the high intensity noise in a few of the images and also the triangular distortions in the top right and bottom left of each image.  Just ignore that. 😛
0 Kudos
Message 9 of 45
(7,988 Views)
Here's the result of rendering it using Voxx - if you're running the program, you can spin it around in 3D like you want. It's hard to get a good image because your data has only 15 values, but I think this is what you want.  I haven't seen any way of doing anything similar in LabVIEW.

Cheers ~ Greg

0 Kudos
Message 10 of 45
(7,985 Views)