How to extrude a 3D image from a binary 2D image
One way to extrude a 3D object from a binary 2D image is to use RegionPlot3D
:
pts = ImageData[ColorNegate@Binarize@Import["http://i.stack.imgur.com/UWO6k.png"], "Bit"];
g = RegionPlot3D[pts[[Sequence @@ Round@{i, j}]] == 1, {i, 1, #1}, {j, 1, #2}, {z,
0, 1}, PlotPoints -> 100, Mesh -> False, Axes -> False, Boxed -> False] & @@ Dimensions[pts]
pts = Cases[g, x_GraphicsComplex :> First@x, Infinity]
Unfortunately, I see more than one point why your approach will not work like you hope. Let me give a completely different approach which consumes some memory but is really short.
The trick is to use ListContourPlot3D
and to create the input-volume from your image which you use as slices. The only thing you have to remember is that you have to pad your stack of images with two slices of zeroes only.
bm = 1 - ImageData[Import["http://i.stack.imgur.com/UWO6k.png"],"Bit"];
With[{zero = ConstantArray[0, Dimensions[bm]]},
ListContourPlot3D[Append[Prepend[Table[bm, {5}], zero], zero], Contours -> {0.5}]
]
Version 11 introduces the function ImageMesh[]
, which makes the generation of a 3D extrusion relatively easy:
img = ColorNegate[Import["http://i.stack.imgur.com/UWO6k.png"]];
With[{h = 50}, (* height *)
RegionProduct[ImageMesh[img], MeshRegion[{{0}, {h}}, Line[{1, 2}]]]]
Alternatively, one could construct an Image3D[]
object that can then be fed to ImageMesh[]
:
ImageMesh[Image3D[ConstantArray[img, 50]]]