Edit me

Supported image types

Images are diverse

We intuitively think of an image file as a digital photograph, similar in appearance to human vision, containing a matrix of RGB or grayscale pixels.

In reality, images come in diverse form: varying in dimension, number of channels, color depth and type, whether pixel-sizes are uniform in all dimensions, and in many other respects.

And when encoded onto a filesystem, file formats vary widely also with different encodings, types of compression, proprietary codes, and metadata.

Image types supported in Anchor

Anchor supports much, but not all, of this diversity:

  • 2D/3D rectangular images with arbitrary number of channels and pixel-size (anisotropy).
  • diverse bit depths: unsigned 8-bit, unsigned 16-bit, unsigned 32-bit and floating point.
  • time-series and other indexed forms of images in a limited way.
  • certain forms of metadata (pixel size, channel names) but not others.
  • Anchor-specific data structures for:
    • object-segmentations (pixel subregions, encoded into HDF5)
    • geometric shapes (useful for shape annotations).

What’s not supported

Images containing the following are not yet supported:

  • transparency
  • pyramidal formats (containing multiple scaled-down versions for quick access at scale)
  • point clouds

Reading and writing image formats

A flexible method of reading and writing different file-formats is provided through customizable classes for reading and writing images, inheriting from StackReader and StackWriter respectively.

Specifying default readers and writers

The default readers and writers are set in defaultBeans.xml configuration-files, found at:

  • $ANCHOR_HOME/config/defaultBeans.xml in the main Anchor distribution, and
  • $USER_HOME/.anchor/defaultBeans.xml optionally, taking precedence.

In practice, these readers and writers are usually implemented via hierarchies of rules that select an appropriate driver for a particular type of image, based upon whether its 2D/3D, the number of channels, bit depth etc.

The user may also suggest a preferred file format for writing via the -of command-line-option.

Reading images

By default, the following logic decides which reader is used for an image file:

Condition Reader Supported Formats
.jpg or .jpeg extension OpenCVReader JPEG (auto-adjusted to any EXIF orientation)
anything else BioformatsReader approximately 150 supported formats

Multi-file driver

Another driver, the MultiFileReader virtually combines different files into a single image (as varying channels, or varying z-stacks in a 3D image, or varying timepoints in a time-series). A regular-expression is used to match file-paths.

Helper utility drivers

Other drivers in org.anchoranalysis.plugin.io.bean.rasterreader provide useful utility functions:

Class Function
FlattenAsChannel Converts indexed/time-series images into different channels.
ImposeResolution Imposes a specific physical pixel size (across X,Y,Z dimensions).
ReadVoxelExtentXml Reads physical pixel-size from an accompanying .xml file for each image.
RejectIfConditionXYResolution Rejects images if a condition is filled on the X-Y resolution.

Writing images

By default, the following logic decides which writer is used for an image:

Image Type Writer Reason
Binary 2D PNG via ImageJ Avoids compression artefacts.
Binary 3D Tiff via Bioformats Like above, but can save 3D images.
*RGB or Grayscale 2D PNG via ImageJ Widely-supported and lossless compression.
RGB or Grayscale 3D Tiff via Bioformats Can save 3D images as multi-frame.
*Three-channels but not RGB Tiff via Bioformats Can save three channels independently.
anything else OMETiff via Bioformats Supports diverse image types.

Binary images are stored as unsigned 8-bit but with only 0 and 255 as valid states.

In the two asterixed cases, if a -of command-line-option is supplied, a matching writer for this format will be found and instead used, but only if one is available and supports the image-type.