5
$\begingroup$

After importing a 3D image in STL format, my possibilities in regard to "3D Volumetric Image Processing" seem rather limited. All examples are given with TIFF files. Is there a way to convert from STL to TIFF or work with an STL image in some other way?

$\endgroup$
8
$\begingroup$

Here is something quick and dirty to convert from a Graphics3D to Image3D (the second argument is sort of a quality knob, the higher the number the more slices are taken):

img3Dify[gr3d_Graphics3D, qu_] := Module[{pr, br, slices},
  pr = PlotRange /. AbsoluteOptions[gr3d, PlotRange];
  br = Map[Norm@Differences[#] &, pr]; 
  slices = ParallelMap[
    Image[Show[gr3d, ViewPoint -> Top, 
       Lighting -> {{"Ambient", White}}, Background -> None, 
       PlotRange -> {pr[[1]], pr[[2]], #}]] &, 
    Partition[FindDivisions[pr[[3]], qu*2], 2, 1]];
  Image3D[slices, BoxRatios -> br, ColorFunction -> Hue]]

on an example image

spikey = Import["ExampleData/spikey.stl", "Graphics3D"]

spikey

img3Dify[spikey, 40]

spikey as Image3D

$\endgroup$
1
  • $\begingroup$ Thank you! That was actually just what I needed…! $\endgroup$
    – Simon
    Jan 21 '14 at 17:15
5
$\begingroup$

I found that with Mathematica 10 one can use the region functions/distance+watershed to achieve something similar but much faster. Something along these lines can generate ~1 million voxels in a couple of seconds in my machine:

voxelify[region_?RegionQ, res_?NumericQ] := 
 Module[{f, bounds, boxsize, voxsize, data, d2},
  f = RegionDistance[region];
  bounds = RegionBounds[region]; 
  boxsize = -Subtract @@ # & /@ bounds;
  voxsize = Max[boxsize]/res; 
  data = ParallelArray[f[{##}] &, Round[boxsize/voxsize], bounds]; 
  d2 = HeavisideTheta[data - voxsize]; 
  2 - ReplaceAll[WatershedComponents[Image3D[1 - d2]], {0 -> 2}]
  ]

And then

spikey = Import["ExampleData/spikey.stl", "MeshRegion"];
Image3D[voxelify[spikey, 100]]

voxelized spikey

$\endgroup$
2
  • $\begingroup$ I get this error message (MMA 11.3): ParallelArray::nopar1: Array[f$11729[{##1}]&,{100,95,81},{{-1.54435,1.54435},{-1.46876,1.46876},{-1.2494,1.2494}},List] cannot be parallelized; proceeding with sequential evaluation. $\endgroup$ Mar 28 '19 at 9:12
  • $\begingroup$ Actually I get the same error message using ParallelArray in any version of MMA, including 10.0, 10.3 and 11.3. $\endgroup$ Apr 1 '19 at 17:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.