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 diff --git a/pyproject.toml b/pyproject.toml index 6cf0403a..199868c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "anndata", "numpy", "scanpy", - "spatialdata>=0.2.1", + "spatialdata>=0.2.2", "scikit-image", "h5py", "joblib", 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( 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 8867fa76..9b8df25b 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 22d521ad..04096c71 100644 --- a/src/spatialdata_io/readers/mcmicro.py +++ b/src/spatialdata_io/readers/mcmicro.py @@ -100,7 +100,7 @@ def mcmicro( assert len(samples) == 1 data = imread(samples[0], **imread_kwargs) # , scale_factors=[2, 2] - data = Image2DModel.parse(data, transformations=_get_transformation(), **image_models_kwargs) + data = Image2DModel.parse(data, transformations=_get_transformation(), rgb=None, **image_models_kwargs) images["tma_map"] = data image_dir = path / McmicroKeys.IMAGES_DIR_TMA @@ -116,7 +116,7 @@ def mcmicro( image_id = core_id data = imread(sample, **imread_kwargs) - data = Image2DModel.parse(data, c_coords=marker_names, **image_models_kwargs) + data = Image2DModel.parse(data, c_coords=marker_names, rgb=None, **image_models_kwargs) transformations = _get_transformation( tma=int(core_id) if tma else None, tma_centroids=tma_centroids, raster_data=data ) @@ -131,7 +131,9 @@ def mcmicro( raw_name = raw_image.with_name(raw_image.stem).with_suffix("").stem data = imread(raw_image, **imread_kwargs) - images[raw_name] = Image2DModel.parse(data, transformations={raw_name: Identity()}, **image_models_kwargs) + images[raw_name] = Image2DModel.parse( + data, transformations={raw_name: Identity()}, rgb=None, **image_models_kwargs + ) illumination_dir = path / McmicroKeys.ILLUMINATION_DIR if illumination_dir.exists(): @@ -143,7 +145,7 @@ def mcmicro( data = imread(illumination_image, **imread_kwargs) images[illumination_name] = Image2DModel.parse( - data, transformations={raw_name: Identity()}, **image_models_kwargs + data, transformations={raw_name: Identity()}, rgb=None, **image_models_kwargs ) samples_labels = list((path / McmicroKeys.LABELS_DIR).glob("*/*" + McmicroKeys.IMAGE_SUFFIX)) diff --git a/src/spatialdata_io/readers/merscope.py b/src/spatialdata_io/readers/merscope.py index 6a352f99..c5c5cf03 100644 --- a/src/spatialdata_io/readers/merscope.py +++ b/src/spatialdata_io/readers/merscope.py @@ -273,7 +273,7 @@ def _rioxarray_load_merscope( dim="c", ) - return Image2DModel.parse(im, c_coords=stainings, **image_models_kwargs) + return Image2DModel.parse(im, c_coords=stainings, rgb=None, **image_models_kwargs) def _dask_image_load_merscope( @@ -292,6 +292,7 @@ def _dask_image_load_merscope( im, dims=("c", "y", "x"), c_coords=stainings, + rgb=None, **image_models_kwargs, ) 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 e5feaa7a..22a75855 100644 --- a/src/spatialdata_io/readers/visium.py +++ b/src/spatialdata_io/readers/visium.py @@ -221,6 +221,7 @@ def visium( full_image, scale_factors=[2, 2, 2, 2], transformations={"global": transform_original}, + rgb=None, **image_models_kwargs, ) else: @@ -230,13 +231,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")) 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")) 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 d27caaa5..74034f37 100644 --- a/src/spatialdata_io/readers/xenium.py +++ b/src/spatialdata_io/readers/xenium.py @@ -562,7 +562,7 @@ def _get_images( # let's add a dummy channel as a temporary workaround. image = da.concatenate([image, da.zeros_like(image[0:1])], axis=0) 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 )