Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

enhance + bugfix of images and labels elements #127

Merged
merged 28 commits into from
Feb 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
86665b7
don't remove coords
giovp Feb 5, 2023
632c112
update iter multiscale
giovp Feb 17, 2023
0410cea
merge
giovp Feb 17, 2023
6e4a050
update spatial-image and multiscale-spatial_image version
giovp Feb 17, 2023
6565b12
remove check that is now in multiscale spatial image
giovp Feb 19, 2023
4833e63
add coordinates assignment
giovp Feb 19, 2023
2d8bbd2
add coordinates to parser
giovp Feb 19, 2023
22b18a9
Merge branch 'main' into models/images/add-coordinates
giovp Feb 19, 2023
c99c5dd
fix tests
giovp Feb 20, 2023
f562a3b
update tests for 3d
giovp Feb 20, 2023
aef337b
add tests for labels
giovp Feb 20, 2023
0dc0459
update shapely
giovp Feb 20, 2023
97f8d7e
add some comments
giovp Feb 20, 2023
90e0cc3
improve validation per #115
giovp Feb 20, 2023
6140832
remove multiscale_factors and add sclae_factors
giovp Feb 20, 2023
238fb8c
try fixing tests
giovp Feb 20, 2023
c67435a
updates
giovp Feb 20, 2023
3240659
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Feb 20, 2023
55c0e7c
fix mypy
giovp Feb 20, 2023
4214abc
add channels to IO
giovp Feb 20, 2023
f65151e
update omero exlcuding it from labels
giovp Feb 20, 2023
448da01
use isel
giovp Feb 22, 2023
51d865d
read name from raster data
LucaMarconato Feb 23, 2023
697eae1
Merge branch 'main' into models/images/add-coordinates
LucaMarconato Feb 23, 2023
5245259
fix unpad_raster()
LucaMarconato Feb 23, 2023
0a752fe
all tests passing
LucaMarconato Feb 23, 2023
f20582a
fixed precommit
LucaMarconato Feb 23, 2023
7a9f140
remove reference to name
giovp Feb 24, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ dependencies = [
"zarr",
# "ome_zarr",
"ome_zarr@git+https://github.com/LucaMarconato/ome-zarr-py@bug_fix_io",
"spatial_image",
"multiscale_spatial_image",
"spatial_image>=0.3.0",
"multiscale_spatial_image>=0.11.2",
"xarray-schema",
"pygeos",
"geopandas",
"shapely==2.0rc2",
"shapely>=2.0.1",
"rich",
"pyarrow",
"tqdm",
Expand Down
1 change: 1 addition & 0 deletions spatialdata/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ def _check_geopandas_using_shapely() -> None:
"If you intended to use PyGEOS, set the option to False."
),
UserWarning,
stacklevel=2,
)
2 changes: 1 addition & 1 deletion spatialdata/_core/_spatial_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ def _bounding_box_query_image(
# add the
selection[axis_name] = slice(min_value, max_value)

query_result = image.sel(selection)
query_result = image.isel(selection)

# update the transform
# currently, this assumes the existing transforms input coordinate system
Expand Down
73 changes: 43 additions & 30 deletions spatialdata/_core/_transform_elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
from spatialdata._core.core_utils import (
DEFAULT_COORDINATE_SYSTEM,
SpatialElement,
_get_scale,
compute_coordinates,
get_dims,
)
from spatialdata._core.models import get_schema
Expand Down Expand Up @@ -208,14 +210,21 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"Unsupported schema {schema}")

axes = get_dims(data)
transformed_dask, raster_translation = _transform_raster(
Expand All @@ -232,6 +241,8 @@ def _(data: SpatialImage, transformation: BaseTransformation, maintain_positioni
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand All @@ -244,43 +255,43 @@ def _(
get_transformation,
set_transformation,
)
from spatialdata._core.models import Labels2DModel, Labels3DModel
from spatialdata._core.models import (
Image2DModel,
Image3DModel,
Labels2DModel,
Labels3DModel,
)
from spatialdata._core.transformations import BaseTransformation, Sequence

# labels need to be preserved after the resizing of the image
if schema == Labels2DModel or schema == Labels3DModel:
# TODO: this should work, test better
kwargs = {"prefilter": False}
else:
elif schema == Image2DModel or schema == Image3DModel:
kwargs = {}
else:
raise ValueError(f"MultiscaleSpatialImage with schema {schema} not supported")

axes = get_dims(data)
scale0 = dict(data["scale0"])
assert len(scale0) == 1
scale0_data = scale0.values().__iter__().__next__()
transformed_dask, raster_translation = _transform_raster(
data=scale0_data.data, axes=scale0_data.dims, transformation=transformation, **kwargs
)
get_dims(data)
transformed_dict = {}
for k, v in data.items():
assert len(v) == 1
xdata = v.values().__iter__().__next__()

composed: BaseTransformation
if k == "scale0":
composed = transformation
else:
scale = _get_scale(xdata.attrs["transform"])
composed = Sequence([scale, transformation, scale.inverse()])

transformed_dask, raster_translation = _transform_raster(
data=xdata.data, axes=xdata.dims, transformation=composed, **kwargs
)
transformed_dict[k] = SpatialImage(transformed_dask, dims=xdata.dims, name=xdata.name)

# this code is temporary and doens't work in all cases (in particular it breaks when the data is not similar
# to a square but has sides of very different lengths). I would remove it an implement (inside the parser)
# the logic described in https://github.com/scverse/spatialdata/issues/108)
shapes = []
for level in range(len(data)):
dims = data[f"scale{level}"].dims.values()
shape = np.array([dict(dims._mapping)[k] for k in axes if k != "c"])
shapes.append(shape)
multiscale_factors = []
shape0 = shapes[0]
for shape in shapes[1:]:
factors = shape0 / shape
factors - min(factors)
# assert np.allclose(almost_zero, np.zeros_like(almost_zero), rtol=2.)
try:
multiscale_factors.append(round(factors[0]))
except OverflowError as e:
raise e
# mypy thinks that schema could be ShapesModel, PointsModel, ...
transformed_data = schema.parse(transformed_dask, dims=axes, multiscale_factors=multiscale_factors) # type: ignore[call-arg,arg-type]
transformed_data = MultiscaleSpatialImage.from_dict(transformed_dict)
old_transformations = get_transformation(data, get_all=True)
assert isinstance(old_transformations, dict)
set_transformation(transformed_data, old_transformations, set_all=True)
Expand All @@ -290,6 +301,8 @@ def _(
raster_translation=raster_translation,
maintain_positioning=maintain_positioning,
)
transformed_data = compute_coordinates(transformed_data)
schema().validate(transformed_data)
return transformed_data


Expand Down
Loading