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.

64 lines
2.0 KiB

  1. from pims import FramesSequenceND, Frame
  2. import numpy as np
  3. from nd2reader.exc import NoImageError
  4. from nd2reader.parser import get_parser
  5. from nd2reader.version import get_version
  6. import six
  7. class ND2Reader(FramesSequenceND):
  8. """
  9. PIMS wrapper for the ND2 reader
  10. """
  11. def __init__(self, filename):
  12. self.filename = filename
  13. # first use the parser to parse the file
  14. self._fh = open(filename, "rb")
  15. major_version, minor_version = get_version(self._fh)
  16. self._parser = get_parser(self._fh, major_version, minor_version)
  17. self._metadata = self._parser.metadata
  18. self._roi_metadata = self._parser.roi_metadata
  19. # Set data type
  20. bit_depth = self._parser.raw_metadata.image_attributes[six.b('SLxImageAttributes')][six.b('uiBpcInMemory')]
  21. if bit_depth <= 16:
  22. self._dtype = np.float16
  23. elif bit_depth <= 32:
  24. self._dtype = np.float32
  25. else:
  26. self._dtype = np.float64
  27. # Setup the axes
  28. self._init_axis('x', self._metadata.width)
  29. self._init_axis('y', self._metadata.height)
  30. self._init_axis('c', len(self._metadata.channels))
  31. self._init_axis('t', len(self._metadata.frames))
  32. self._init_axis('z', len(self._metadata.z_levels))
  33. def close(self):
  34. if self._fh is not None:
  35. self._fh.close()
  36. def get_frame_2D(self, c, t, z):
  37. """
  38. Gets a given frame using the parser
  39. :param c:
  40. :param t:
  41. :param z:
  42. :return:
  43. """
  44. c_name = self._metadata.channels[c]
  45. try:
  46. image = self._parser.driver.get_image_by_attributes(t, 0, c_name, z, self._metadata.width,
  47. self._metadata.height)
  48. except (TypeError, NoImageError):
  49. return Frame([])
  50. else:
  51. return Frame(image, frame_no=image.frame_number)
  52. @property
  53. def pixel_type(self):
  54. return self._dtype