From 4df62fc7353b619e6a9a91f581fdaf49760f3cc8 Mon Sep 17 00:00:00 2001 From: Andreas Eisenbarth Date: Fri, 25 Aug 2023 15:29:18 +0200 Subject: [PATCH 1/4] Set rgb argument to auto-detect whether image channels are RGB --- src/spatialdata_io/readers/codex.py | 1 + src/spatialdata_io/readers/cosmx.py | 1 + src/spatialdata_io/readers/mcmicro.py | 2 +- src/spatialdata_io/readers/merscope.py | 1 + src/spatialdata_io/readers/steinbock.py | 2 +- src/spatialdata_io/readers/visium.py | 7 +++++-- src/spatialdata_io/readers/xenium.py | 2 +- 7 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/spatialdata_io/readers/codex.py b/src/spatialdata_io/readers/codex.py index a55e4830..3fd7a6d8 100644 --- a/src/spatialdata_io/readers/codex.py +++ b/src/spatialdata_io/readers/codex.py @@ -80,6 +80,7 @@ def codex( "images": Image2DModel.parse( image, scale_factors=[2, 2], + rgb=None, ) } sdata = SpatialData(images=images, shapes={str(region): shapes}, table=table) diff --git a/src/spatialdata_io/readers/cosmx.py b/src/spatialdata_io/readers/cosmx.py index d3c47dba..6d9d56ea 100644 --- a/src/spatialdata_io/readers/cosmx.py +++ b/src/spatialdata_io/readers/cosmx.py @@ -200,6 +200,7 @@ def cosmx( "global_only_image": aff, }, dims=("y", "x", "c"), + rgb=None, **image_models_kwargs, ) images[f"{fov}_image"] = parsed_im diff --git a/src/spatialdata_io/readers/mcmicro.py b/src/spatialdata_io/readers/mcmicro.py index c7c3ba21..fb14223c 100644 --- a/src/spatialdata_io/readers/mcmicro.py +++ b/src/spatialdata_io/readers/mcmicro.py @@ -91,7 +91,7 @@ def _get_images( image_models_kwargs: Mapping[str, Any] = MappingProxyType({}), ) -> Union[SpatialImage, MultiscaleSpatialImage]: image = imread(path / McmicroKeys.IMAGES_DIR / f"{sample}{McmicroKeys.IMAGE_SUFFIX}", **imread_kwargs) - return Image2DModel.parse(image, **image_models_kwargs) + return Image2DModel.parse(image, rgb=None, **image_models_kwargs) def _get_labels( diff --git a/src/spatialdata_io/readers/merscope.py b/src/spatialdata_io/readers/merscope.py index 686dcf7c..697c05c2 100644 --- a/src/spatialdata_io/readers/merscope.py +++ b/src/spatialdata_io/readers/merscope.py @@ -168,6 +168,7 @@ def merscope( dims=("c", "y", "x"), transformations={"microns": microns_to_pixels.inverse()}, c_coords=stainings, + rgb=True, **image_models_kwargs, ) images[f"{dataset_id}_z{z_layer}"] = parsed_im diff --git a/src/spatialdata_io/readers/steinbock.py b/src/spatialdata_io/readers/steinbock.py index 69cd5e40..2f0283a5 100644 --- a/src/spatialdata_io/readers/steinbock.py +++ b/src/spatialdata_io/readers/steinbock.py @@ -97,7 +97,7 @@ def _get_images( image_models_kwargs: Mapping[str, Any] = MappingProxyType({}), ) -> Union[SpatialImage, MultiscaleSpatialImage]: image = imread(path / SteinbockKeys.IMAGES_DIR / f"{sample}{SteinbockKeys.IMAGE_SUFFIX}", **imread_kwargs) - return Image2DModel.parse(data=image, transformations={sample: Identity()}, **image_models_kwargs) + return Image2DModel.parse(data=image, transformations={sample: Identity()}, rgb=None, **image_models_kwargs) def _get_labels( diff --git a/src/spatialdata_io/readers/visium.py b/src/spatialdata_io/readers/visium.py index c662c205..da877d05 100644 --- a/src/spatialdata_io/readers/visium.py +++ b/src/spatialdata_io/readers/visium.py @@ -192,6 +192,7 @@ def visium( full_image, scale_factors=[2, 2, 2, 2], transformations={"global": transform_original}, + rgb=None, **image_models_kwargs, ) else: @@ -201,13 +202,15 @@ def visium( image_hires = imread(path / VisiumKeys.IMAGE_HIRES_FILE, **imread_kwargs).squeeze().transpose(2, 0, 1) image_hires = DataArray(image_hires, dims=("c", "y", "x"), name=dataset_id) images[dataset_id + "_hires_image"] = Image2DModel.parse( - image_hires, transformations={"downscaled_hires": Identity()} + image_hires, transformations={"downscaled_hires": Identity()}, rgb=None ) if (path / VisiumKeys.IMAGE_LOWRES_FILE).exists(): image_lowres = imread(path / VisiumKeys.IMAGE_LOWRES_FILE, **imread_kwargs).squeeze().transpose(2, 0, 1) image_lowres = DataArray(image_lowres, dims=("c", "y", "x"), name=dataset_id) images[dataset_id + "_lowres_image"] = Image2DModel.parse( - image_lowres, transformations={"downscaled_lowres": Identity()} + image_lowres, + transformations={"downscaled_lowres": Identity()}, + rgb=None, ) return SpatialData(images=images, shapes=shapes, table=table) diff --git a/src/spatialdata_io/readers/xenium.py b/src/spatialdata_io/readers/xenium.py index f81dd37a..0df681ef 100644 --- a/src/spatialdata_io/readers/xenium.py +++ b/src/spatialdata_io/readers/xenium.py @@ -216,5 +216,5 @@ def _get_images( ) -> SpatialImage | MultiscaleSpatialImage: image = imread(path / file, **imread_kwargs) return Image2DModel.parse( - image, transformations={"global": Identity()}, dims=("c", "y", "x"), **image_models_kwargs + image, transformations={"global": Identity()}, dims=("c", "y", "x"), rgb=None, **image_models_kwargs ) From efb68c68a05c967655529f34d35dd8976a40a9f6 Mon Sep 17 00:00:00 2001 From: LucaMarconato <2664412+LucaMarconato@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:34:33 +0200 Subject: [PATCH 2/4] add minimum spaitaldata version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 58f6858a..8caecebb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ urls.Documentation = "https://spatialdata-io.readthedocs.io/" urls.Source = "https://github.com/scverse/spatialdata-io" urls.Home-page = "https://github.com/scverse/spatialdata-io" dependencies = [ - "spatialdata", + "spatialdata>=2.2.0", "scikit-image", "h5py", "joblib", From e98427017186683054f737b781d58524cd502e32 Mon Sep 17 00:00:00 2001 From: Luca Marconato Date: Sun, 8 Sep 2024 12:57:10 +0200 Subject: [PATCH 3/4] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65a98ba0..63a5282b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning][]. - (Xenium) added `dims` parameter for more control in `xenium_aligned_image()` +### Fixed + +- Passing `rgb=None` to image model parser, leading to 3-4 channel images being interpreted as RGB(A) + ## [0.1.4] - 2024-08-07 ### Changed From a76de1d3cc83efebfae508e102294beff389e589 Mon Sep 17 00:00:00 2001 From: Luca Marconato Date: Sun, 8 Sep 2024 13:07:15 +0200 Subject: [PATCH 4/4] fix precommit --- src/spatialdata_io/readers/_utils/_utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spatialdata_io/readers/_utils/_utils.py b/src/spatialdata_io/readers/_utils/_utils.py index 63f5bdf2..c9fad4ee 100644 --- a/src/spatialdata_io/readers/_utils/_utils.py +++ b/src/spatialdata_io/readers/_utils/_utils.py @@ -18,8 +18,8 @@ NDArrayA = NDArray[Any] except (ImportError, TypeError): - NDArray = np.ndarray # type: ignore[misc] - NDArrayA = np.ndarray # type: ignore[misc] + NDArray = np.ndarray # type: ignore[misc,unused-ignore] + NDArrayA = np.ndarray # type: ignore[misc,unused-ignore] def _read_counts(