changeset 85:13dd3f20a00a

wsi rest api
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 16 Dec 2016 13:01:24 +0100
parents 9ceb0e13dff9
children 329bcab46f5e
files Sphinx/source/plugins/wsi.rst
diffstat 1 files changed, 228 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/Sphinx/source/plugins/wsi.rst	Thu Dec 15 22:49:53 2016 +0100
+++ b/Sphinx/source/plugins/wsi.rst	Fri Dec 16 13:01:24 2016 +0100
@@ -1,7 +1,7 @@
 .. _wsi:
 
 
-Whole-Slide Microscopic Imaging
+Whole-slide microscopic imaging
 ===============================
 
 .. contents::
@@ -24,7 +24,7 @@
 Compilation
 -----------
 
-.. highlight:: bash
+.. highlight:: text
 
 The procedure to compile the WSI framework is similar of that for the
 :ref:`core of Orthanc <binaries>`. The following commands should work
@@ -35,7 +35,7 @@
   $ cd Applications/Build
   $ cmake .. -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Release
   $ make
-  # Secondly, compile the plugin
+  # Secondly, compile the viewer plugin
   $ mkdir ../../ViewerPlugin/Build
   $ cd ../../ViewerPlugin/Build
   $ cmake .. -DSTATIC_BUILD=ON -DCMAKE_BUILD_TYPE=Release
@@ -51,16 +51,17 @@
 <http://www.orthanc-server.com/browse.php?path=/whole-slide-imaging>`__.
 
 
-Installation of the plugin
---------------------------
+Usage of the plugin
+-------------------
 
 .. highlight:: json
 
 You of course first have to :ref:`install Orthanc <compiling>`. Once
 Orthanc is installed, you must change the :ref:`configuration file
 <configuration>` to tell Orthanc where it can find the plugin: This is
-done by properly modifying the ``Plugins`` option. You could for
-instance use the following configuration file::
+done by properly modifying the ``Plugins`` configuration option. You
+could for instance use the following configuration file under
+GNU/Linux::
 
   {
     "Name" : "MyOrthanc",
@@ -74,26 +75,27 @@
 configuration file. The WSI plugin has no specific configuration
 option.
 
-Once a :ref:`DICOM series <model-world>` is opened using Orthanc
-Explorer, a yellow button entitled ``Whole-Slide Imaging Viewer`` will
-show up for series corresponding to whole-slide images. This button
-will open the WSI viewer for that particular series. This behavior can
-be seen on the Orthanc Explorer running on our `WSI demonstration
-server <http://wsi.orthanc-server.com/orthanc/app/explorer.html>`__.
+Once a :ref:`DICOM series <model-world>` is opened using :ref:`Orthanc
+Explorer <orthanc-explorer>`, a yellow button entitled ``Whole-Slide
+Imaging Viewer`` will show up for series corresponding to whole-slide
+images. This button will open the WSI viewer for that particular
+series. This behavior can be seen on the Orthanc Explorer interface
+running on our `WSI demonstration server
+<http://wsi.orthanc-server.com/orthanc/app/explorer.html>`__.
 
 
 
 Command-line tools
 ------------------
 
-.. highlight:: bash
+.. highlight:: text
 
 The command-line tools ``OrthancWSIDicomizer`` and
 ``OrthancWSIDicomToTiff`` provide documentation of all their options
 if started with the ``--help`` parameter::
 
-  $ OrthancWSIDicomizer --help
-  $ OrthancWSIDicomToTiff --help
+  $ ./OrthancWSIDicomizer --help
+  $ ./OrthancWSIDicomToTiff --help
 
 In this section, we review the most common usages of these tools.
 
@@ -104,30 +106,79 @@
 The most simple usage consists in converting some whole-slide image to
 DICOM, then uploading it to Orthanc::
 
-  $ OrthancWSIDicomizer Source.tif
+  $ ./OrthancWSIDicomizer Source.tif
 
 This command will transcode some `hierarchical, tiled TIFF
 <https://en.wikipedia.org/wiki/TIFF>`__ image called ``Source.tif``,
-and push the output DICOM files to the default Orthanc server (running
-on ``localhost`` and listening to HTTP port ``8042``) using its
-:ref:`REST API <rest>`. This operation is fast, as no re-encoding
-takes place: If the source TIFF image contains JPEG tiles, these tiles
-will be written as such.
+and push the generated DICOM files to the default Orthanc server
+(running on ``localhost`` and listening to HTTP port ``8042``) using
+its :ref:`REST API <rest>`. The log of the command will give you the
+:ref:`identifier of the generated series <orthanc-ids>`, so that you
+can locate it in Orthanc Explorer. This conversion is fast, as no
+re-encoding takes place: If the source TIFF image contains JPEG tiles,
+these tiles will be simply written as such.
 
-Obviously, you can specify the parameters of your Orthanc server::
+Obviously, you can specify the parameters of the REST API of your
+target Orthanc server::
 
-  $ OrthancWSIDicomizer Source.tif --orthanc=http://localhost:8042/ --username=orthanc --password=orthanc
+  $ ./OrthancWSIDicomizer Source.tif --orthanc=http://localhost:8042/ --username=orthanc --password=orthanc
 
-It is also possible to write the DICOM instance directly onto some
+It is also possible to write the DICOM instances directly onto some
 folder of the filesystem (the target folder must be existing)::
 
-  $ OrthancWSIDicomizer Source.tif --folder=/tmp/dicomized/
+  $ ./OrthancWSIDicomizer Source.tif --folder=/tmp/dicomized/
 
+This command will create a set of files entitled like
+``/tmp/dicomized/wsi-XXXXXX.dcm``. You can modify this pattern using
+the command-line option ``--folder-pattern``.
+
+By default, the DICOM-izer will spread the output series as a set of
+DICOM files whose size stays below 10MB. This prevents the appearance
+of huge files, which speeds up further processing. This behavior can
+be controlled using the ``--max-size`` command-line option.
 
 
 Re-encoding a DICOM image
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
+The section above explained how to transcode whole-slide images,
+without modifying the compression scheme of their individual tiles
+(which is most commonly JPEG). You can instruct the DICOM-izer to
+re-encode each and every individual tile as follows::
+
+  $ ./OrthancWSIDicomizer Source.tif --reencode=1 --compression=jpeg2000
+
+This example would create a series of DICOM instances encoded using
+the JPEG2k transfer syntax (whose UID is ``1.2.840.10008.1.2.4.90``).
+As JPEG2k is not natively supported by many Web browsers, the Web
+viewer plugin would transparently convert such JPEG2k-encoded tiles to
+PNG images.
+
+It is also possible to re-encode the image so as to reduce disk space
+consumption by changing the JPEG quality::
+
+  $ ./OrthancWSIDicomizer Source.tif --reencode=1 --compression=jpeg --jpeg-quality=10
+
+The DICOM-izer also allows to re-generate all the multi-resolution
+pyramid. This is extremely importantly to enhance the user experience
+of the Web interface, if the source image only features the finest
+zoom level of the whole-slide image::
+
+  $ ./OrthancWSIDicomizer Source.tif --pyramid=1 --smooth=1
+
+The number of levels in the pyramid can be controlled using the
+``--levels`` command-line option. The ``--smooth=1`` option tells the
+DICOM-izer to apply `Gaussian smoothing
+<https://en.wikipedia.org/wiki/Gaussian_blur>`__ when re-scaling the
+image, in order to avoid the appearance of aliasing in the
+multi-resolution pyramid. This produces nicer images, at the price of
+higher computation time.
+
+All the examples described in this section are obviously much more
+CPU-intensive than simple transcoding. The DICOM-izer takes advantage
+in multi-threading to reduce the computation time.  By default, it will
+use half the number of logical CPU cores that are available. This
+behavior can be fine-tuned using command-line option ``--threads``.
 
 
 
@@ -137,35 +188,179 @@
 Out-of-the-box, the DICOM-izer supports standard hierarchical TIFF
 images. Some commonplace image formats (PNG and JPEG) can be
 DICOM-ized as well. However, whole-slide images can come in many
-proprietary file formats. To transcode such images, the DICOM-izer
-relies upon the `OpenSlide toolbox <http://openslide.org/>`__.  
+proprietary file formats. To re-encode such images, the DICOM-izer
+relies upon the `OpenSlide toolbox <http://openslide.org/>`__.
 
 For this feature to work, you have to tell the command-line tool where
 it can find the OpenSlide shared library. GNU/Linux distributions
 generally provide packages containing the OpenSlide shared library
-(under Debian/Ubuntu, simply install the ``libopenslide0`` package)::
+(e.g. under Debian/Ubuntu, simply install the ``libopenslide0``
+package)::
 
-  $ OrthancWSIDicomizer --openslide=libopenslide.so CMU-1-JP2K-33005.svs
+  $ ./OrthancWSIDicomizer --openslide=libopenslide.so CMU-1-JP2K-33005.svs
 
-Precompiled Microsoft Windows binaries of this shared library can be
+Pre-compiled Microsoft Windows binaries of this shared library can be
 found on the `OpenSlide homepage <http://openslide.org/download/>`__::
 
-  $ OrthancWSIDicomizer --openslide=libopenslide-0.dll CMU-1-JP2K-33005.svs
+  $ ./OrthancWSIDicomizer --openslide=libopenslide-0.dll CMU-1-JP2K-33005.svs
 
 Note that this operation implies the re-encoding of the source image
 from the proprietary file format, which is much more time-consuming
 than simply transcoding a TIFF image.
 
 
-
 Specifying a DICOM dataset
 ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+So far, we have only been discussing the whole-slide image by itself,
+and not the :ref:`medical information <dicom-tags>` that is associated
+with each DICOM file. The DICOM tags that must be embedded inside the
+generated DICOM series can be specified using the user-friendly JSON
+file format. You would first generate a minimal, sample JSON dataset
+as follows::
+
+  $ ./OrthancWSIDicomizer --sample-dataset > dataset.json
+
+Secondly, you would edit the just-generated ``dataset.json`` file
+using any text editor (or any script interfaced with your RIS), so as
+to encode medical information associated with the image
+acquisition. Finally, tell the DICOM-izer where it can find the
+dataset when re-encoding or transcoding the image::
+
+  $ ./OrthancWSIDicomizer Source.tif --dataset=dataset.json
+
+Note that it is always a good idea to check whether all the required
+DICOM tags have been properly provided, e.g. by running the
+``dciodvfy`` command-line tool provided by `David Clunie
+<http://www.dclunie.com/dicom3tools.html>`__ that checks the
+compliance of DICOM files.
+
 
 Converting DICOM to TIFF
 ^^^^^^^^^^^^^^^^^^^^^^^^
 
+The whole-slide imaging framework for Orthanc also provides a
+command-line tool that converts some DICOM series, as a standard
+hierarchical, tiled TIFF image. This is important if you wish to
+export some DICOM file to a framework that does not support DICOM
+Supplement 145.
+
+Here is how you would convert a whole-slide image stored in the
+default Orthanc server::
+
+  $ ./OrthancWSIDicomToTiff fdf53e42-06d7377a-c24c59fd-3704e72d-f4c75b68 Target.tif
+
+You just have to provide the :ref:`Orthanc identifier <orthanc-ids>`
+of the series of interest (that can be retrieved using :ref:`Orthanc
+Explorer <orthanc-explorer>` or the :ref:`REST API <rest>`), and the
+path to the target TIFF file.
+
+Similarly to the DICOM-izer, the command-line options ``--orthanc``,
+``--username`` and ``--password`` can be used to specify the
+parameters of your Orthanc server.
+
 
 REST API
 --------
 
+Besides providing an user interface, the plugin for whole-slide
+imaging also enrich the :ref:`REST API <rest>` of Orthanc with some
+new URIs, that are described in this section.
+
+Note that the Web interface of the plugin exclusively relies upon this
+enriched REST API in order to display whole-slide images using the
+`OpenLayers 3 <https://openlayers.org/>`__ JavaScript library.
+
+
+Information about a whole-slide image
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+You can check whether a DICOM series associated with some known
+:ref:`Orthanc ID <orthanc-ids>` ``id`` corresponds to a whole-slide
+image by calling the ``/wsi/pyramids/{id}`` URI. A HTTP status code
+404 is returned if the series is *not* a whole-slide image::
+
+  $ curl -v http://localhost:8042/wsi/pyramids/ca2cc2ef-2dd8be12-0a4506ae-d565b7e1-a4ca9068
+  [...]
+  < HTTP/1.1 404 Not Found
+
+However, if the identifier corresponds to a valid whole-slide image,
+you will get information about its multi-resolution pyramid, formatted
+using JSON::
+
+  $ curl http://localhost:8042/wsi/pyramids/f0ed5846-2ce36a70-d27bb5d3-6ed9dac2-ee638d85
+  {
+    "ID" : "f0ed5846-2ce36a70-d27bb5d3-6ed9dac2-ee638d85",
+    "Resolutions" : [ 1, 2, 4, 8, 16 ],
+    "Sizes" : [
+      [ 10800, 5400 ],
+      [ 5400, 2700 ],
+      [ 2700, 1350 ],
+      [ 1350, 675 ],
+      [ 675, 338 ]
+    ],
+    "TileHeight" : 512,
+    "TileWidth" : 512,
+    "TilesCount" : [
+      [ 22, 11 ],
+      [ 11, 6 ],
+      [ 6, 3 ],
+      [ 3, 2 ],
+      [ 2, 1 ]
+    ],
+    "TotalHeight" : 5400,
+    "TotalWidth" : 10800
+  }
+
+The size of the finest level of the pyramid is verbatim available from
+this output (in the example above, ``10,800 x 5,400`` pixels), as well
+as the size of each individual tile (``512 x 512`` pixels). The
+``TilesCount`` gives, for each level of the pyramid (sorted in
+decreasing resolutions), the number of tiles along each dimension: In
+the example above, the coarsest level contains 2 tiles along the X
+axis, and 1 tile along the Y.
+
+Note that the interpretation of the whole-slide image is done
+transparently by the plugin, which frees the user from parsing each
+and every DICOM instance in the series.
+
+The medical information associated with the series or its instances
+can as usual be retrieved using the core :ref:`REST API <rest>` of
+Orthanc.
+
+
+Decoding the individual tiles
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+As discussed above, the ``/wsi/pyramids/{id}`` gives information about
+the number of tiles in each level of the multi-resolution pyramid
+associated with series ``id``.
+
+You can then retrieve the individual tiles of each level using the
+``/wsi/tiles/{id}/{z}/{x}/{y}`` URI, where ``z`` corresponds to the
+level of interest, and (``x``, ``y``) the index of the tile of
+interest at this level. All of these indices start at zero, the level
+``z=0`` corresponding to the finest level.
+
+For instance, here is how to retrieve the central tile of the finest
+level of the pyramid (that contains ``22 x 11`` tiles in our example)::
+
+  $ curl http://localhost:8042/wsi/tiles/f0ed5846-2ce36a70-d27bb5d3-6ed9dac2-ee638d85/0/11/5 > tile.jpg
+  $ identify ./tile.jpg 
+  ./tile.jpg JPEG 512x512 512x512+0+0 8-bit DirectClass 88.5KB 0.000u 0:00.000
+
+As can be seen, the plugin has returned a JPEG image of size ``512 x
+512``, which corresponds to the size of the tiles in this sample
+image. If trying to access a tile outside the image, the plugin will
+return with an HTTP status code that is not ``200 OK``. Similarly,
+here is how to retrieve a tile at the coarsest level (the pyramid has
+5 levels in our example)::
+
+  $ curl http://localhost:8042/wsi/tiles/f0ed5846-2ce36a70-d27bb5d3-6ed9dac2-ee638d85/4/0/0 > tile.jpg
+
+Depending upon the transfer syntax of the DICOM instances, the tile
+might not be encoded using JPEG. Indeed, if the transfer syntax is
+uncompressed (UID ``1.2.840.10008.1.2`` and friends) or JPEG2k
+lossless (UID ``1.2.840.10008.1.2.4.90``), the plugin will
+transparently re-encode the tile to PNG in order to avoid any
+destructive compression.