Tutorial
|
|
========
|
|
|
|
Installation
|
|
~~~~~~~~~~~~
|
|
|
|
The package is available on PyPi. Install it using:
|
|
|
|
::
|
|
|
|
pip install nd2reader
|
|
|
|
If you don't already have the packages ``numpy``, ``pims``, ``six`` and
|
|
``xmltodict``, they will be installed automatically if you use the
|
|
``setup.py`` script. ``nd2reader`` is an order of magnitude faster in
|
|
Python 3. I recommend using it unless you have no other choice. Python
|
|
2.7 and Python >= 3.4 are supported.
|
|
|
|
Installation via Conda Forge
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Installing ``nd2reader`` from the ``conda-forge`` channel can be
|
|
achieved by adding ``conda-forge`` to your channels with:
|
|
|
|
::
|
|
|
|
conda config --add channels conda-forge
|
|
|
|
Once the ``conda-forge`` channel has been enabled, ``nd2reader`` can be
|
|
installed with:
|
|
|
|
::
|
|
|
|
conda install nd2reader
|
|
|
|
It is possible to list all of the versions of ``nd2reader`` available on
|
|
your platform with:
|
|
|
|
::
|
|
|
|
conda search nd2reader --channel conda-forge
|
|
|
|
Opening ND2s
|
|
~~~~~~~~~~~~
|
|
|
|
``nd2reader`` follows the `pims <https://github.com/soft-matter/pims>`__
|
|
framework. To open a file and show the first frame:
|
|
|
|
.. code:: python
|
|
|
|
from nd2reader import ND2Reader
|
|
import matplotlib.pyplot as plt
|
|
|
|
with ND2Reader('my_directory/example.nd2') as images:
|
|
plt.imshow(images[0])
|
|
|
|
After opening the file, all ``pims`` features are supported. Please
|
|
refer to the `pims
|
|
documentation <http://soft-matter.github.io/pims/>`__.
|
|
|
|
ND2 metadata
|
|
~~~~~~~~~~~~
|
|
|
|
The ND2 file contains various metadata, such as acquisition information,
|
|
regions of interest and custom user comments. Most of this metadata is
|
|
parsed and available in dictionary form. For example:
|
|
|
|
.. code:: python
|
|
|
|
from nd2reader import ND2Reader
|
|
|
|
with ND2Reader('my_directory/example.nd2') as images:
|
|
# width and height of the image
|
|
print('%d x %d px' % (images.metadata['width'], images.metadata['height']))
|
|
|
|
All metadata properties are:
|
|
|
|
- ``width``: the width of the image in pixels
|
|
- ``height``: the height of the image in pixels
|
|
- ``date``: the date the image was taken
|
|
- ``fields_of_view``: the fields of view in the image
|
|
- ``frames``: a list of all frame numbers
|
|
- ``z_levels``: the z levels in the image
|
|
- ``total_images_per_channel``: the number of images per color channel
|
|
- ``channels``: the color channels
|
|
- ``pixel_microns``: the amount of microns per pixel
|
|
- ``rois``: the regions of interest (ROIs) defined by the user
|
|
- ``experiment``: information about the nature and timings of the ND
|
|
experiment
|
|
|
|
Iterating over fields of view
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Using ``NDExperiments`` in the Nikon software, it is possible to acquire
|
|
images on different ``(x, y)`` positions. This is referred to as
|
|
different fields of view. Using this reader, the fields of view are on
|
|
the ``v`` axis. For example:
|
|
|
|
.. code:: python
|
|
|
|
from nd2reader import ND2Reader
|
|
|
|
with ND2Reader('my_directory/example.nd2') as images:
|
|
# width and height of the image
|
|
print(images.metadata)
|
|
|
|
will output
|
|
|
|
.. code:: python
|
|
|
|
{'channels': ['BF100xoil-1x-R', 'BF+RITC'],
|
|
'date': datetime.datetime(2017, 10, 30, 14, 35, 18),
|
|
'experiment': {'description': 'ND Acquisition',
|
|
'loops': [{'duration': 0,
|
|
'sampling_interval': 0.0,
|
|
'start': 0,
|
|
'stimulation': False}]},
|
|
'fields_of_view': [0, 1],
|
|
'frames': [0],
|
|
'height': 1895,
|
|
'num_frames': 1,
|
|
'pixel_microns': 0.09214285714285715,
|
|
'total_images_per_channel': 6,
|
|
'width': 2368,
|
|
'z_levels': [0, 1, 2]}
|
|
|
|
for our example file. As you can see from the metadata, it has two
|
|
fields of view. We can also look at the sizes of the axes:
|
|
|
|
.. code:: python
|
|
|
|
print(images.sizes)
|
|
|
|
.. code:: python
|
|
|
|
{'c': 2, 't': 1, 'v': 2, 'x': 2368, 'y': 1895, 'z': 3}
|
|
|
|
As you can see, the fields of view are listed on the ``v`` axis. It is
|
|
therefore possible to loop over them like this:
|
|
|
|
.. code:: python
|
|
|
|
images.iter_axes = 'v'
|
|
for fov in images:
|
|
print(fov) # Frame containing one field of view
|
|
|
|
For more information on axis bundling and iteration, refer to the `pims
|
|
documentation <http://soft-matter.github.io/pims/v0.4/multidimensional.html#axes-bundling>`__.
|