Skip to main content


Segmentation is the mapping of sheets of papyrus in a 3D X-ray volume. The resulting surface volumes can be used directly to look for ink. The community has made this a significantly more automated process, but it still involves considerable human input.

We have a small group of contractors (the “Segmentation Team”) who have been mapping the scrolls, mostly Scroll 1.

Progress of mapping the scrolls, in area (cm²), from the Segment Directory spreadsheet (dates are when a segment was started, not finished, so it lags behind a bit)

The main tool which our segmenting team currently uses is Volume Cartographer, which you can learn more about in Tutorial 3. Volume Cartographer was created by Seth Parker and others at EduceLab, though the segmentation team currently uses a fork by Philip Allgaier (@spacegaier on Discord).

The idea is to manually annotate a piece of papyrus in a single slice, after which an algorithm can extrapolate it into 3D, essentially by doing really fancy line-following. This algorithm still needs a lot of correction and supervision, but that’s the rough idea.

Illustration of Volume Cartographer with an algorithm extrapolating in 3D.

The resulting 3D shape is called a “mesh”. You can view the meshes of all our segments in Volume Viewer and Segment Viewer (see here):

Some segments from Scroll 1

For more technical details about how the segmentation team operates, check out this doc: The Segmenter’s Guide to Volume Cartographer (for contractors).

Data format

The .volpkg format used by Volume Cartographer (learn more in Tutorial 3) has a paths folder, in which each segment has its own subfolder. Each subfolder contains two files:

  • Scroll1.volpkg/paths/<id>/meta.json: Metadata of a segment.
  • Scroll1.volpkg/paths/<id>/pointset.vcps: Pointset of a segment. This is a custom data format specific to Volume Cartographer. More information here, and see the Volume Cartographer resources list.

You can find segments from the made by the segmentation team (led by @Hari_Seldon on Discord) on the data server: /full-scrolls/Scroll{1,2}.volpkg/paths.

Surface volumes

In addition to the meta.json and pointset.vcps required by Volume Cartographer, we generate a bunch of other files:

  • /layers/{00-64}.tif: Surface volumes of 65 layers.
    • This is most useful for detecting ink.
  • /<id>_points.obj: Pointcloud.
  • /<id>.obj: Mesh of the segment.
  • /<id>.tif: Texture of the surrounding voxels (the maximum of a few of the surrounding layers, based on Volume Cartographer’s estimated papyrus thickness).
  • /<id>.ppm: Per-pixel map, a custom data format mapping points between the surface volume and the original 3D volume of the scroll.
  • /author.txt: Name of the author of the segment.
  • /area_cm2.txt: Total surface area, in cm2.

The surface volume is the most useful dataset for ink detection. The middle layer (32) is sampled right from the segment mesh, and the other layers are sampled “above” and “below” the surface. This results in a new 3D volume “around” the surface of the segment.

Scrubbing through layers of the surface volume of segment 20230827161846

All these extra files were generated using the following script: export SEGMENT=20230827161846 && cd /Scroll1.volpkg/paths/${SEGMENT} && nice vc_convert_pointset -i pointset.vcps -o "${SEGMENT}_points.obj" && nice vc_render -v ../../ -s "${SEGMENT}" -o "${SEGMENT}.obj" --output-ppm "${SEGMENT}.ppm" && mkdir -p layers && nice vc_layers_from_ppm -v ../../ -p "${SEGMENT}.ppm" --output-dir layers/ -r 32 -f tif --cache-memory-limit 50G && vc_area ../.. ${SEGMENT} | grep cm | awk '{print $2}' > area_cm2.txt