ngio 0.2.0b3__py3-none-any.whl → 0.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ngio/__init__.py +30 -10
- ngio/common/__init__.py +3 -3
- ngio/common/_array_pipe.py +7 -1
- ngio/common/_masking_roi.py +4 -4
- ngio/common/_roi.py +14 -14
- ngio/hcs/__init__.py +16 -2
- ngio/hcs/plate.py +465 -54
- ngio/images/__init__.py +7 -7
- ngio/images/abstract_image.py +30 -10
- ngio/images/create.py +25 -35
- ngio/images/image.py +40 -8
- ngio/images/label.py +33 -8
- ngio/images/masked_image.py +19 -5
- ngio/images/{omezarr_container.py → ome_zarr_container.py} +84 -47
- ngio/ome_zarr_meta/__init__.py +5 -0
- ngio/ome_zarr_meta/ngio_specs/__init__.py +10 -0
- ngio/ome_zarr_meta/ngio_specs/_axes.py +90 -65
- ngio/ome_zarr_meta/ngio_specs/_dataset.py +46 -8
- ngio/ome_zarr_meta/ngio_specs/_ngio_hcs.py +242 -69
- ngio/ome_zarr_meta/ngio_specs/_ngio_image.py +53 -19
- ngio/ome_zarr_meta/ngio_specs/_pixel_size.py +28 -11
- ngio/ome_zarr_meta/v04/_custom_models.py +18 -0
- ngio/ome_zarr_meta/v04/_v04_spec_utils.py +3 -4
- ngio/tables/__init__.py +2 -2
- ngio/tables/tables_container.py +3 -3
- ngio/tables/v1/__init__.py +2 -2
- ngio/tables/v1/_feature_table.py +20 -1
- ngio/tables/v1/_generic_table.py +10 -0
- ngio/tables/v1/_roi_table.py +35 -13
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/METADATA +8 -5
- ngio-0.2.2.dist-info/RECORD +55 -0
- ngio-0.2.0b3.dist-info/RECORD +0 -54
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/WHEEL +0 -0
- {ngio-0.2.0b3.dist-info → ngio-0.2.2.dist-info}/licenses/LICENSE +0 -0
ngio/__init__.py
CHANGED
|
@@ -9,33 +9,53 @@ except PackageNotFoundError: # pragma: no cover
|
|
|
9
9
|
__author__ = "Lorenzo Cerrone"
|
|
10
10
|
__email__ = "lorenzo.cerrone@uzh.ch"
|
|
11
11
|
|
|
12
|
-
from ngio.common import ArrayLike, Dimensions
|
|
13
|
-
from ngio.hcs import
|
|
12
|
+
from ngio.common import ArrayLike, Dimensions, Roi, RoiPixels
|
|
13
|
+
from ngio.hcs import (
|
|
14
|
+
OmeZarrPlate,
|
|
15
|
+
OmeZarrWell,
|
|
16
|
+
create_empty_plate,
|
|
17
|
+
create_empty_well,
|
|
18
|
+
open_ome_zarr_plate,
|
|
19
|
+
open_ome_zarr_well,
|
|
20
|
+
)
|
|
14
21
|
from ngio.images import (
|
|
15
22
|
Image,
|
|
16
23
|
Label,
|
|
17
24
|
OmeZarrContainer,
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
create_empty_ome_zarr,
|
|
26
|
+
create_ome_zarr_from_array,
|
|
20
27
|
open_image,
|
|
21
|
-
|
|
28
|
+
open_ome_zarr_container,
|
|
29
|
+
)
|
|
30
|
+
from ngio.ome_zarr_meta.ngio_specs import (
|
|
31
|
+
AxesSetup,
|
|
32
|
+
DefaultNgffVersion,
|
|
33
|
+
ImageInWellPath,
|
|
34
|
+
NgffVersions,
|
|
35
|
+
PixelSize,
|
|
22
36
|
)
|
|
23
|
-
from ngio.ome_zarr_meta.ngio_specs import AxesSetup, ImageInWellPath, PixelSize
|
|
24
37
|
|
|
25
38
|
__all__ = [
|
|
26
39
|
"ArrayLike",
|
|
27
40
|
"AxesSetup",
|
|
41
|
+
"DefaultNgffVersion",
|
|
28
42
|
"Dimensions",
|
|
29
43
|
"Image",
|
|
30
44
|
"ImageInWellPath",
|
|
31
45
|
"Label",
|
|
46
|
+
"NgffVersions",
|
|
32
47
|
"OmeZarrContainer",
|
|
33
48
|
"OmeZarrPlate",
|
|
49
|
+
"OmeZarrWell",
|
|
34
50
|
"PixelSize",
|
|
35
|
-
"
|
|
51
|
+
"Roi",
|
|
52
|
+
"RoiPixels",
|
|
53
|
+
"create_empty_ome_zarr",
|
|
36
54
|
"create_empty_plate",
|
|
37
|
-
"
|
|
55
|
+
"create_empty_well",
|
|
56
|
+
"create_ome_zarr_from_array",
|
|
38
57
|
"open_image",
|
|
39
|
-
"
|
|
40
|
-
"
|
|
58
|
+
"open_ome_zarr_container",
|
|
59
|
+
"open_ome_zarr_plate",
|
|
60
|
+
"open_ome_zarr_well",
|
|
41
61
|
]
|
ngio/common/__init__.py
CHANGED
|
@@ -15,7 +15,7 @@ from ngio.common._common_types import ArrayLike
|
|
|
15
15
|
from ngio.common._dimensions import Dimensions
|
|
16
16
|
from ngio.common._masking_roi import compute_masking_roi
|
|
17
17
|
from ngio.common._pyramid import consolidate_pyramid, init_empty_pyramid, on_disk_zoom
|
|
18
|
-
from ngio.common._roi import
|
|
18
|
+
from ngio.common._roi import Roi, RoiPixels, roi_to_slice_kwargs
|
|
19
19
|
from ngio.common._slicer import (
|
|
20
20
|
SliceTransform,
|
|
21
21
|
compute_and_slices,
|
|
@@ -29,9 +29,9 @@ from ngio.common._zoom import dask_zoom, numpy_zoom
|
|
|
29
29
|
__all__ = [
|
|
30
30
|
"ArrayLike",
|
|
31
31
|
"Dimensions",
|
|
32
|
-
"
|
|
32
|
+
"Roi",
|
|
33
|
+
"RoiPixels",
|
|
33
34
|
"SliceTransform",
|
|
34
|
-
"WorldCooROI",
|
|
35
35
|
"compute_and_slices",
|
|
36
36
|
"compute_masking_roi",
|
|
37
37
|
"consolidate_pyramid",
|
ngio/common/_array_pipe.py
CHANGED
|
@@ -124,7 +124,7 @@ def get_pipe(
|
|
|
124
124
|
case "dask":
|
|
125
125
|
return _dask_get_pipe(array, slices, transformations)
|
|
126
126
|
|
|
127
|
-
case "
|
|
127
|
+
case "delayed":
|
|
128
128
|
return _delayed_numpy_get_pipe(array, slices, transformations)
|
|
129
129
|
|
|
130
130
|
case _:
|
|
@@ -179,6 +179,12 @@ def _mask_pipe_common(
|
|
|
179
179
|
**slice_kwargs,
|
|
180
180
|
)
|
|
181
181
|
|
|
182
|
+
if not dimensions_label.has_axis("c"):
|
|
183
|
+
# Remove the 'c' from the slice_kwargs
|
|
184
|
+
# This will not work if the query uses non-default
|
|
185
|
+
# axes names for channel
|
|
186
|
+
slice_kwargs = {k: v for k, v in slice_kwargs.items() if k != "c"}
|
|
187
|
+
|
|
182
188
|
label_patch = get_pipe(
|
|
183
189
|
label_array,
|
|
184
190
|
dimensions=dimensions_label,
|
ngio/common/_masking_roi.py
CHANGED
|
@@ -8,7 +8,7 @@ import dask.delayed
|
|
|
8
8
|
import numpy as np
|
|
9
9
|
import scipy.ndimage as ndi
|
|
10
10
|
|
|
11
|
-
from ngio.common._roi import
|
|
11
|
+
from ngio.common._roi import Roi, RoiPixels
|
|
12
12
|
from ngio.ome_zarr_meta import PixelSize
|
|
13
13
|
from ngio.utils import NgioValueError
|
|
14
14
|
|
|
@@ -117,7 +117,7 @@ def lazy_compute_slices(segmentation: da.Array) -> dict[int, tuple[slice, ...]]:
|
|
|
117
117
|
|
|
118
118
|
def compute_masking_roi(
|
|
119
119
|
segmentation: np.ndarray | da.Array, pixel_size: PixelSize
|
|
120
|
-
) -> list[
|
|
120
|
+
) -> list[Roi]:
|
|
121
121
|
"""Compute a ROIs for each label in a segmentation.
|
|
122
122
|
|
|
123
123
|
This function expects a 2D or 3D segmentation array.
|
|
@@ -143,7 +143,7 @@ def compute_masking_roi(
|
|
|
143
143
|
max_z, max_y, max_x = slice_[0].stop, slice_[1].stop, slice_[2].stop
|
|
144
144
|
else:
|
|
145
145
|
raise ValueError("Invalid slice length.")
|
|
146
|
-
roi =
|
|
146
|
+
roi = RoiPixels(
|
|
147
147
|
name=str(label),
|
|
148
148
|
x_length=max_x - min_x,
|
|
149
149
|
y_length=max_y - min_y,
|
|
@@ -153,6 +153,6 @@ def compute_masking_roi(
|
|
|
153
153
|
z=min_z,
|
|
154
154
|
)
|
|
155
155
|
|
|
156
|
-
roi = roi.
|
|
156
|
+
roi = roi.to_roi(pixel_size)
|
|
157
157
|
rois.append(roi)
|
|
158
158
|
return rois
|
ngio/common/_roi.py
CHANGED
|
@@ -10,7 +10,7 @@ import numpy as np
|
|
|
10
10
|
from pydantic import BaseModel, ConfigDict, Field
|
|
11
11
|
|
|
12
12
|
from ngio.common._dimensions import Dimensions
|
|
13
|
-
from ngio.ome_zarr_meta.ngio_specs import PixelSize, SpaceUnits
|
|
13
|
+
from ngio.ome_zarr_meta.ngio_specs import DefaultSpaceUnit, PixelSize, SpaceUnits
|
|
14
14
|
from ngio.utils import NgioValueError
|
|
15
15
|
|
|
16
16
|
|
|
@@ -26,7 +26,7 @@ def _to_world(value: int, pixel_size: float) -> float:
|
|
|
26
26
|
return value * pixel_size
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
class
|
|
29
|
+
class Roi(BaseModel):
|
|
30
30
|
"""Region of interest (ROI) metadata."""
|
|
31
31
|
|
|
32
32
|
name: str
|
|
@@ -36,20 +36,20 @@ class WorldCooROI(BaseModel):
|
|
|
36
36
|
x: float = 0.0
|
|
37
37
|
y: float = 0.0
|
|
38
38
|
z: float = 0.0
|
|
39
|
-
unit: SpaceUnits = Field(
|
|
39
|
+
unit: SpaceUnits | str | None = Field(DefaultSpaceUnit, repr=False)
|
|
40
40
|
|
|
41
41
|
model_config = ConfigDict(extra="allow")
|
|
42
42
|
|
|
43
|
-
def
|
|
43
|
+
def to_pixel_roi(
|
|
44
44
|
self, pixel_size: PixelSize, dimensions: Dimensions
|
|
45
|
-
) -> "
|
|
45
|
+
) -> "RoiPixels":
|
|
46
46
|
"""Convert to raster coordinates."""
|
|
47
47
|
dim_x = dimensions.get("x")
|
|
48
48
|
dim_y = dimensions.get("y")
|
|
49
49
|
# Will default to 1 if z does not exist
|
|
50
50
|
dim_z = dimensions.get("z", strict=False)
|
|
51
51
|
|
|
52
|
-
return
|
|
52
|
+
return RoiPixels(
|
|
53
53
|
name=self.name,
|
|
54
54
|
x=_to_raster(self.x, pixel_size.x, dim_x),
|
|
55
55
|
y=_to_raster(self.y, pixel_size.y, dim_y),
|
|
@@ -59,7 +59,7 @@ class WorldCooROI(BaseModel):
|
|
|
59
59
|
z_length=_to_raster(self.z_length, pixel_size.z, dim_z),
|
|
60
60
|
)
|
|
61
61
|
|
|
62
|
-
def zoom(self, zoom_factor: float = 1) -> "
|
|
62
|
+
def zoom(self, zoom_factor: float = 1) -> "Roi":
|
|
63
63
|
"""Zoom the ROI by a factor.
|
|
64
64
|
|
|
65
65
|
Args:
|
|
@@ -71,7 +71,7 @@ class WorldCooROI(BaseModel):
|
|
|
71
71
|
return zoom_roi(self, zoom_factor)
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
class
|
|
74
|
+
class RoiPixels(BaseModel):
|
|
75
75
|
"""Region of interest (ROI) metadata."""
|
|
76
76
|
|
|
77
77
|
name: str
|
|
@@ -83,9 +83,9 @@ class RasterCooROI(BaseModel):
|
|
|
83
83
|
z_length: int
|
|
84
84
|
model_config = ConfigDict(extra="allow")
|
|
85
85
|
|
|
86
|
-
def
|
|
86
|
+
def to_roi(self, pixel_size: PixelSize) -> Roi:
|
|
87
87
|
"""Convert to world coordinates."""
|
|
88
|
-
return
|
|
88
|
+
return Roi(
|
|
89
89
|
name=self.name,
|
|
90
90
|
x=_to_world(self.x, pixel_size.x),
|
|
91
91
|
y=_to_world(self.y, pixel_size.y),
|
|
@@ -105,7 +105,7 @@ class RasterCooROI(BaseModel):
|
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
|
|
108
|
-
def zoom_roi(roi:
|
|
108
|
+
def zoom_roi(roi: Roi, zoom_factor: float = 1) -> Roi:
|
|
109
109
|
"""Zoom the ROI by a factor.
|
|
110
110
|
|
|
111
111
|
Args:
|
|
@@ -127,7 +127,7 @@ def zoom_roi(roi: WorldCooROI, zoom_factor: float = 1) -> WorldCooROI:
|
|
|
127
127
|
new_x = max(roi.x - diff_x / 2, 0)
|
|
128
128
|
new_y = max(roi.y - diff_y / 2, 0)
|
|
129
129
|
|
|
130
|
-
new_roi =
|
|
130
|
+
new_roi = Roi(
|
|
131
131
|
name=roi.name,
|
|
132
132
|
x=new_x,
|
|
133
133
|
y=new_y,
|
|
@@ -142,13 +142,13 @@ def zoom_roi(roi: WorldCooROI, zoom_factor: float = 1) -> WorldCooROI:
|
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
def roi_to_slice_kwargs(
|
|
145
|
-
roi:
|
|
145
|
+
roi: Roi,
|
|
146
146
|
pixel_size: PixelSize,
|
|
147
147
|
dimensions: Dimensions,
|
|
148
148
|
**slice_kwargs: slice | int | Iterable[int],
|
|
149
149
|
) -> dict[str, slice | int | Iterable[int]]:
|
|
150
150
|
"""Convert a WorldCooROI to slice_kwargs."""
|
|
151
|
-
raster_roi = roi.
|
|
151
|
+
raster_roi = roi.to_pixel_roi(
|
|
152
152
|
pixel_size=pixel_size, dimensions=dimensions
|
|
153
153
|
).to_slices()
|
|
154
154
|
|
ngio/hcs/__init__.py
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
"""OME-Zarr HCS objects models."""
|
|
2
2
|
|
|
3
|
-
from ngio.hcs.plate import
|
|
3
|
+
from ngio.hcs.plate import (
|
|
4
|
+
OmeZarrPlate,
|
|
5
|
+
OmeZarrWell,
|
|
6
|
+
create_empty_plate,
|
|
7
|
+
create_empty_well,
|
|
8
|
+
open_ome_zarr_plate,
|
|
9
|
+
open_ome_zarr_well,
|
|
10
|
+
)
|
|
4
11
|
|
|
5
|
-
__all__ = [
|
|
12
|
+
__all__ = [
|
|
13
|
+
"OmeZarrPlate",
|
|
14
|
+
"OmeZarrWell",
|
|
15
|
+
"create_empty_plate",
|
|
16
|
+
"create_empty_well",
|
|
17
|
+
"open_ome_zarr_plate",
|
|
18
|
+
"open_ome_zarr_well",
|
|
19
|
+
]
|