Method: Serial sectioning to obtain images for 3D reconstruction
Back to main page

Fig 1. Rock sample mounted for cutting with a diamond-dust tile saw blade.

The internal structures of rock samples can be made visible by repeatedly shaving a planar layer from a sample and photographing the exposed surface, yielding a sequence of 2D images that can be reconstructed by software into 3D views. The dimensions of each voxel in the 3D reconstruction will be dictated by camera optics in the plane of the sections, and, perpendicular to that plane, by the thickness of slices.

If each photograph is considered a slice in the XY plane of a Cartesian coordinate system, then each progressive image gives a view parallel to the XY-plane, stepping through the rock at intervals along the Z axis. Views orthogonal to the XY plane can be synthesized by taking a row or column of pixels from each of the XY-plane images, creating XZ- and YZ-plane images respectively.

Examples of the results, in three orthogonal views, are shown in figure 2 below; the XY plane is produced from photos, and the other two planes (XZ and YZ) are synthesized:

A view in the XY plane, the along Z-axis (as photographed)

A view in the XZ plane, along the Y-axis (synthesized)

A view in the YZ plane, along the X-axis (synthesized)

Fig 2. Three orthogonal views of a concretion embedded in a matrix

Numerous software packages work with image stacks to create views and perform analyses. Open source packages include ImageJ, Vaa3d, and Slicer.

Obtaining an image stack from videos elsewhere on this web site

Several pages on this site in the Observations section have videos that were created from image stacks, where sequential images become frames in the video. Such a video can be 'disassembled' back into an image sequence, and then imported into any of the many offline image stack manipulation tools, eg., ImageJ, discussed below.

To obtain an image sequence from a video, identify which video (usually there are three, representing the three orthogonal views) contains the highest resolution plane; the one derived directly from photographs, versus the other two planes which were synthesized. Download it to your computer, usually by right-clicking on the video or link and using 'save as' or 'save target'. Open it in QuickTime or VLC or similar video tools, and export it to an image sequence. Then follow the information below to work with that image sequence.

Most of those videos are downsized for the web and compressed. Contact me if you'd like better resolution images (see bottom of this page).

Using ImageJ to view image stacks

Here's how to use ImageJ (version 1.49) to create orthogonal views from a stack of serial sections, assuming a directory exists containing a collection of serial section images, named with a numeric sequential suffix, eg., sampleName_000.png:

  • File -> Import -> Image sequence... (select the first image of the collection)
  • Image -> Scale... (enter a scaling factor to reduce the images, if necessary, to no more than half the width of your screen)
  • Image -> Properties... (enter 'voxel depth' equal to the distance between sections divided by the distance between pixels in the XY plane, eg., ~5)
  • Image -> Stacks -> Orthogonal Views

As shown below (fig 3), this will open a two additional adjacent windows showing the other orthogonal planes, synthesized from the stack. A slider in the original plane controls movement through the stack of original images, and dragging the mouse in that window will move through the other two planes. In this manner the stack can be explored in three dimensions.

Figure 3. ImageJ, with three orthogonal views of an image stack

The plug-in 'ImageJ 3D Viewer' provides rotating views of specifiable orthosections, as does Vaa3d (discussed below).

ImageJ can generate stacks in the two planes that are orthogonal to the image stack, using Image -> Stacks -> Reslice, which can then be stored to disk as an image sequence or TIF stack, etc.

Using Vaa3d

Vaa3d (version 4.7.2) doesn't seem to accept PNG files, so use ImageJ to create a TIFF from a stack of PNGs (ImageJ: File -> Import -> Image sequence, File -> Save As -> TIF) and then open that TIF file in Vaa3d:

  • File -> Open image/stack in new window... (specify a TIF file that contains a stack)
  • Press 'See in 3D', 'Entire image'
  • Click 'X-section' (to show orthoslices)
  • Set 'Z-thick' to expand the z-axis to put it in correct proportion to the XY pixel interval (eg., around 10)
  • Manipulate the controls to move the slices, rotate, translate, or zoom

Figure 4. Vaa3d, with three orthogonal views of an image stack

Using Quicktime to make scrubbable videos

Image stacks are conveniently viewed as frames of a video. The Quicktime video player allows the viewer to move the playhead back and forth ('scrub'), making it a good choice for viewing a single image stack in isolation. To make a video from an image collection, open Quicktime and use File -> Open Image Sequence and the select the first image of a collection. Quicktime will import all subsequent images in that directory.

Examples of stacks in Quicktime videos can be found in the Observations section of this web site.

Using Quicktime to convert a video to an image sequence

Videos opened in Quicktime can be exported as a sequence of images. Thus a video can serve as a compressed format for storing an image stack. Once decompressed into an image sequence, the images can be imported into other tools, such as ImageJ, etc.

Creating an image stack from a rock sample

Any method that can serially expose parallel planar surfaces at regular intervals will work to create an image stack. The distance between planes will determine the resolution in the z-axis. In the XY plane, a typical digital camera has a sensor maybe 4000 pixels wide, which over 20 cm provides a resolution of 50 microns/pixel. Obtaining 50 micron resolution along the z-axis might be possible with a lapidary wheel, with a jig to ensure successive planes were parallel, but I used a 10" rock saw, which has a kerf of about 1.5 mm, making cuts every 2mm (cutting less than 2mm tended to cause the saw blade to deflect rather than cut into the rock; even at 2mm the blade wear was uneven). The sample is nearly completely consumed by the process; only the final thin section (~2mm thick) and a lot of rock dust remain.

With a 10" blade, samples up to about 8cm thick can be cut. I used a Bosch diamond blade for 'ceramic tile, porcelain, slate' (~C$30, Home Depot).

The procedure is conceptually simple: Make a cut to shave off 2mm; photograph the newly-exposed surface; repeat until less than 2mm remains.


Figure 5. Sample mount.

The sample must be mounted so that it is supported to the last cut, and so that cuts are parallel and at 2mm intervals. A flat face is prepared on the sample, selected carefully with regard to what is of interest in the sample (this first face establishes the axis normal to the highest resolution images). As the sample is cut, it will eventually be held only by this face, so it must be mechanically strong enough to support the sample and resist the stresses of cutting. Even for samples with a flat-ish base, it is unlikely that a sample can be supported entirely from its base to the last thin cut, so it's best to mount it from the side.

The prepared planar face of the sample is then glued using epoxy to a piece of 6mm plywood (painted with urethane to make it water-resistant) (the curing time of '5 minute' is strongly dependent on temperature; use at cooler temperatures to extend working time). That piece is glued using white water-based wood glue to a rectangular (90 degree angles) block of wood screwed to a rectangle carrier of 16mm plywood (painted with urethane). All angles must be orthogonal, so that the saw cuts will be parallel to the back face of the sample.

Samples which do not have a flat base upon which to rest can be handled by cutting them in two, photographing each of the resulting faces, and then treating each half separately (fig 1 and fig 5).

The purpose of the urethane is to protect the wood from water, so that it will not swell. Using wood glue allows the plywood+sample to be removed (by soaking for a few hours) from the mounting block; after all the cutting, it is all that remains of the sample, and it is nicely mounted by epoxy to the 6mm plywood backing and can serve as a reference. All but the 6mm back-piece can be re-used.

After the first cut, subsequent cuts should be at 2mm intervals (or whatever interval you choose). To avoid drift, measure from a fixed reference point (eg., the edge of the saw platform) instead of from the current surface.

After a cut, the sample and carrier mount are rinsed to remove rock dust and grit; I used a spray bottle. Also rinse off the saw tray between cuts (to remove particles that might interfere with placing the sample mount squarely on the platform).


Figure 6. Photo station. A straight-edge is used to position the rock face flush with the two guides.

The goal is to obtain consistent aligned photographs of the serial sections, with each photo having the same perspective, exposure, ambient light, and sample surface conditions.

I set up a 'photography station' at a height comfortable when standing (since there will be many repetitions), consisting of a shelf with two blocks clamped near its edge, as shown in figure 6. Using a straight edge, the sample on its carrier is positioned with the sample face flush and square with the two blocks, and laterally, against one of the blocks. Since everything on the sample carrier is orthogonal, this provides consistent alignment.

A camera on a tripod was positioned such that the sample face, at its greatest extents, fills the frame of the camera. For the lens+camera I used, the camera was about 50cm from the sample, leaving enough room to work with the sample without risking bumping the camera or tripod. Of course the camera's optical axis needs to be perpendicular to and centered upon the sample face. A DSLR lens with manual focus is best, as it can be set up once and will stay that way.

Stable exposure can be obtained by shooting in a room with consistent and low ambient light and using a flash at a fixed power (not automatic, which might cause the flash output to vary with scene conditions). I positioned the flash close to the camera and slightly above the camera's optical axis, using a linear-polarizing sheet over the flash and a polarized filter on the camera, set orthogonal to each other (this attenuates any shiny reflected light). I used an electronic shutter release to avoid shaking, or worse, moving the camera (it's crucial that the camera and flash not be moved during the entire sequence, otherwise there'll be much more work later to align the images).

To identify the frames, I put a pair of dice into the frame, incrementing them as two digit base 6 counters (more dies would give a larger range, but I just wrapped).

Here's the routine: After each cut, use a hand sprayer to rinse dust and grit from the sample and carrier, rinsing the newly-exposed surface gently so as not to displace loosely-cemented grains. Press with a towel to remove water drops. Go to the photo station, taking care not to bump the camera or anything else. Place the sample and carrier on the shelf (see figure 6) and, using a straight edge, slide it forward to be flush and square with the two guide posts (and thus the camera). Reflectivity and colour is usually significantly affected by surface moisture, so to provide a repeatable consistent surface, I aimed for moist but without shiny water. This was accomplished by misting the sample with a hand-operated sprayer and, if necessary, blotting with a paper towel. The number on the pair of dice was incremented, then the camera+flash was triggered. Then I moved to another station where the distance from the back of the sample mount (the 6mm plywood) to the sample face was measured and recorded, then back to the saw. Each cycle took about 4 minutes.

Make sure everything stays clean; a piece of grit under the sample carrier, either at the saw or the photography station, could throw off alignment.

Fiducial markers in the frames would be useful to confirm alignment. I tried putting parallel wood 'rails' on the sample carrier platform, perpendicular to the sample face, that are cut along with the sample, but it was only partially successful (the wood sometimes splintered).


After finally obtaining a series of photos, I saved the raw files in a directory, renamed them including a sequential suffix, and looked at the results. Raw files are large and harder to manipulate en masse, and no large adjustments were required, so I converted the images to lossless PNG, using a Photoshop batch script. Then all images were loaded in layers (Photoshop, File -> Scripts -> Load files into stack...) and examined, one layer at a time, looking for frame-to-frame alignment and exposure consistency. Typically there were a few frames that were slightly offset, possibly due to grit or mistakes; these were nudged into alignment, based upon fiducials or consistency with the adjacent sample frames. A convenient way to check for consistency is to load the layers into an animation (Window -> Animation, then using the Animation menu, Make frames from layers) and run it, looking for jumps in alignment or exposure.

This provides a set of images in the XY plane. Depending on the application, if there is no need for high resolution, it may be convenient to reduce the file sizes to facilitate processing. Then, as described above, images were synthesized for the orthogonal XZ and YZ planes.


If you have suggestions, please send a comment using this web form.