You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

93 lines
2.7 KiB

from pims import FramesSequenceND, Frame
import numpy as np
from nd2reader.exc import NoImageError
from nd2reader.parser import get_parser
import six
class ND2Reader(FramesSequenceND):
"""
PIMS wrapper for the ND2 reader
"""
def __init__(self, filename):
self.filename = filename
# first use the parser to parse the file
self._fh = open(filename, "rb")
self._parser = get_parser(self._fh)
self._metadata = self._parser.metadata
self._roi_metadata = self._parser.roi_metadata
# Set data type
self._dtype = self._get_dtype_from_metadata()
# Setup the axes
self._init_axis('x', self._metadata.width)
self._init_axis('y', self._metadata.height)
self._init_axis('c', len(self._metadata.channels))
self._init_axis('t', len(self._metadata.frames))
self._init_axis('z', len(self._metadata.z_levels))
# provide the default
self.iter_axes = 't'
def _get_dtype_from_metadata(self):
"""
Determine the data type from the metadata.
:return:
"""
bit_depth = self._parser.raw_metadata.image_attributes[six.b('SLxImageAttributes')][six.b('uiBpcInMemory')]
if bit_depth <= 16:
self._dtype = np.float16
elif bit_depth <= 32:
self._dtype = np.float32
else:
self._dtype = np.float64
return self._dtype
@classmethod
def class_exts(cls):
return {'nd2'} | super(ND2Reader, cls).class_exts()
def close(self):
if self._fh is not None:
self._fh.close()
def get_frame_2D(self, c, t, z):
"""
Gets a given frame using the parser
:param c:
:param t:
:param z:
:return:
"""
c_name = self._metadata.channels[c]
try:
image = self._parser.driver.get_image_by_attributes(t, 0, c_name, z, self._metadata.width,
self._metadata.height)
except (TypeError, NoImageError):
return Frame([])
else:
return Frame(image, frame_no=image.frame_number, metadata=self._get_frame_metadata())
def _get_frame_metadata(self):
"""
Get the metadata for one frame
:return:
"""
frame_metadata = {
"height": self._metadata.height,
"width": self._metadata.width,
"date": self._metadata.date,
"pixel_microns": self._metadata.pixel_microns,
"rois": self._roi_metadata
}
return frame_metadata
@property
def pixel_type(self):
return self._dtype