Skip to content

Commit 347295a

Browse files
authored
Merge pull request #153 from odinsbane/pyramid_dim_reduction
Added a failing test and the code to make it not fail.
2 parents e27d2e0 + eceabef commit 347295a

File tree

4 files changed

+50
-3
lines changed

4 files changed

+50
-3
lines changed

ngff_zarr/methods/_itk.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
_align_chunks,
99
_compute_sigma,
1010
_dim_scale_factors,
11+
_update_previous_dim_factors,
1112
_get_block,
1213
_spatial_dims,
1314
)
@@ -136,7 +137,9 @@ def _downsample_itk_bin_shrink(
136137
spatial_dims = _image_dims[: len(spatial_dims)]
137138
for scale_factor in scale_factors:
138139
dim_factors = _dim_scale_factors(dims, scale_factor, previous_dim_factors)
139-
previous_dim_factors = dim_factors
140+
previous_dim_factors = _update_previous_dim_factors(
141+
scale_factor, spatial_dims, previous_dim_factors
142+
)
140143
previous_image = _align_chunks(previous_image, default_chunks, dim_factors)
141144

142145
shrink_factors = [dim_factors[sd] for sd in spatial_dims]
@@ -222,7 +225,9 @@ def _downsample_itk_gaussian(
222225
spatial_dims = _image_dims[: len(spatial_dims)]
223226
for scale_factor in scale_factors:
224227
dim_factors = _dim_scale_factors(dims, scale_factor, previous_dim_factors)
225-
previous_dim_factors = dim_factors
228+
previous_dim_factors = _update_previous_dim_factors(
229+
scale_factor, spatial_dims, previous_dim_factors
230+
)
226231
previous_image = _align_chunks(previous_image, default_chunks, dim_factors)
227232

228233
shrink_factors = [dim_factors[sd] for sd in spatial_dims]

ngff_zarr/methods/_itkwasm.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
_align_chunks,
1111
_compute_sigma,
1212
_dim_scale_factors,
13+
_update_previous_dim_factors,
1314
_get_block,
1415
_spatial_dims,
1516
_spatial_dims_last_zyx,
@@ -93,7 +94,9 @@ def _downsample_itkwasm(
9394
transposed_dims = False
9495
for scale_factor in scale_factors:
9596
dim_factors = _dim_scale_factors(dims, scale_factor, previous_dim_factors)
96-
previous_dim_factors = dim_factors
97+
previous_dim_factors = _update_previous_dim_factors(
98+
scale_factor, spatial_dims, previous_dim_factors
99+
)
97100
previous_image = _align_chunks(previous_image, default_chunks, dim_factors)
98101
# Operate on a contiguous spatial block
99102
previous_image = _spatial_dims_last_zyx(previous_image)

ngff_zarr/methods/_support.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ def _dim_scale_factors(dims, scale_factor, previous_dim_factors):
113113
}
114114
return result_scale_factors
115115

116+
def _update_previous_dim_factors(scale_factor, spatial_dims, previous_dim_factors):
117+
if isinstance(scale_factor, int):
118+
previous_dim_factors = { d : scale_factor for d in spatial_dims }
119+
else:
120+
previous_dim_factors = scale_factor
121+
return previous_dim_factors
116122

117123
def _align_chunks(previous_image, default_chunks, dim_factors):
118124
block_0_shape = [c[0] for c in previous_image.data.chunks]

test/test_pyramid_integrity.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import dask.array as da
2+
from ngff_zarr import Multiscales, to_multiscales, NgffImage, Methods
3+
4+
def test_check_pyramid():
5+
"""
6+
When creating downscaled versions of images, subsequent resolutions were
7+
not correctly being calculated. This test checks that the image volume
8+
occupies the same space, and it checks that the scale factors are consistent
9+
with the provided scale factors.
10+
"""
11+
data = da.zeros(shape=(512, 512))
12+
for method in Methods:
13+
image = NgffImage(
14+
data=data,
15+
dims=["y", "x"],
16+
scale={"y": 0.25, "x": 0.25},
17+
translation={"y": 0, "x": 0},
18+
)
19+
scale_factors = [2, 4, 8, 16, 32]
20+
multiscales: Multiscales = to_multiscales(
21+
image,
22+
scale_factors=scale_factors,
23+
method=method,
24+
)
25+
dims = image.data.shape
26+
27+
for sf, image in enumerate(multiscales.images):
28+
if sf == 0:
29+
continue
30+
scales = [image.scale[k] for k in image.scale]
31+
for i, d in enumerate(dims):
32+
assert d * 0.25 == scales[i]*image.data.shape[i]
33+
assert scales[i] == scale_factors[sf - 1] * 0.25

0 commit comments

Comments
 (0)