OME Bio-Formats

10 years of proprietary image data





Melissa Linkert
Open Microscopy Environment & Glencoe Software

What is Bio-Formats?

  • Java library for reading image-based datasets
    • Reads images, but also acquisition metadata
  • One API, many applications
    • ImageJ
    • MATLAB
    • ...and others
  • A complete implementation of OME-XML and OME-TIFF
    • also now in C++

A brief historical overview

  • 2005 - work began on Java library
  • 2006 March 31 - first official release of Bio-Formats
  • late 2006 - OMERO begins using Bio-Formats
  • early 2008 - MATLAB first supported
  • 2008 - major effort standardize metadata handling
  • 2009 (v4.0.0) - unified version numbers with OMERO
  • 2012 - major effort to improve automated testing
  • late 2012/early 2013 - work began on C++ library
  • 2014/2015 - major effort to improve performance
  • 2015 - increasing number of contributed code changes
  • mid-2015 - faster release cycle

The history in numbers

What can you do now?

Read images and metadata across many domains...

  • light microscopy
  • electron microscopy
  • medical imaging (CT, PET, ...)
  • high content screening (HCS)
  • digital pathology/whole slide imaging (WSI)
  • Fluorescence-lifetime imaging microscopy (FLIM)
  • Light sheet fluorescence microscopy (LSFM)

...and in many different applications

ImageJ macro:
run("Bio-Formats Macro Extensions");
Ext.setId("/PATH/TO/FILE");
Ext.getImageCount(imageCount);
timestamps = newArray(imageCount);
for (plane=0; plane < imageCount; plane++) {
  Ext.openImage("image #" + plane, plane);
  Ext.getPlaneTimingDeltaT(timestamps[plane], plane);
}
                
MATLAB:
r = bfGetReader("/PATH/TO/FILE");
imageCount = r.getImageCount();
omeMetadata = r.getMetadataStore();
for plane = 1:imageCount
  image = bfGetPlane(r, plane, varargin{:});
  timestamp = omeMetadata.getPlaneDeltaT(0, plane - 1).value().doubleValue();
end
                
Java:
ImageReader reader = new ImageReader();
IMetadata omeMetadata = MetadataTools.createOMEXMLMetadata();
reader.setMetadataStore(omeMetadata);
reader.setId("/PATH/TO/FILE");
for (int plane = 0; plane < reader.getImageCount(); plane++) {
  byte[] image = reader.openBytes(plane);
  Number timestamp = omeMetadata.getPlaneDeltaT(0, plane).value();
}

                

What we've done recently

  • full support for Windows
  • performance improvements, especially over network file systems
  • added units for most metadata values
  • approx. 130 bug fixes in 2015

What's next?

  • Updates to the development process
    • More releases, and faster
    • ...but without compromising quality
  • Updated ROI model
  • More usage examples and developer documentation
  • Feedback welcome!

Questions?