63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
from abc import ABC
|
|
from itertools import product
|
|
|
|
import numpy as np
|
|
from ome_types import model
|
|
|
|
from .. import AbstractReader
|
|
|
|
|
|
class Reader(AbstractReader, ABC):
|
|
priority = 20
|
|
|
|
@staticmethod
|
|
def _can_open(path):
|
|
return isinstance(path, np.ndarray) and 1 <= path.ndim <= 5
|
|
|
|
def get_ome(self):
|
|
def shape(size_x=1, size_y=1, size_c=1, size_z=1, size_t=1): # noqa
|
|
return size_x, size_y, size_c, size_z, size_t
|
|
|
|
size_x, size_y, size_c, size_z, size_t = shape(*self.array.shape)
|
|
try:
|
|
pixel_type = model.PixelType(self.array.dtype.name)
|
|
except ValueError:
|
|
if self.array.dtype.name.startswith("int"):
|
|
pixel_type = model.PixelType("int32")
|
|
else:
|
|
pixel_type = model.PixelType("float")
|
|
|
|
ome = model.OME()
|
|
ome.instruments.append(model.Instrument())
|
|
ome.images.append(
|
|
model.Image(
|
|
pixels=model.Pixels(
|
|
size_c=size_c,
|
|
size_z=size_z,
|
|
size_t=size_t,
|
|
size_x=size_x,
|
|
size_y=size_y,
|
|
dimension_order="XYCZT",
|
|
type=pixel_type,
|
|
),
|
|
objective_settings=model.ObjectiveSettings(id="Objective:0"),
|
|
)
|
|
)
|
|
for c, z, t in product(range(size_c), range(size_z), range(size_t)):
|
|
ome.images[0].pixels.planes.append(model.Plane(the_c=c, the_z=z, the_t=t, delta_t=0))
|
|
return ome
|
|
|
|
def open(self):
|
|
if isinstance(self.path, np.ndarray):
|
|
self.array = np.array(self.path)
|
|
while self.array.ndim < 5:
|
|
self.array = np.expand_dims(self.array, -1) # noqa
|
|
self.path = "numpy array"
|
|
|
|
def __frame__(self, c, z, t):
|
|
frame = self.array[:, :, c, z, t]
|
|
if self.axes.find("y") > self.axes.find("x"):
|
|
return frame.T
|
|
else:
|
|
return frame
|