From a8538fc9c8f1694994cdf0000e49c739573c7a16 Mon Sep 17 00:00:00 2001 From: Jordao Bragantini Date: Wed, 4 Feb 2026 14:02:28 -0800 Subject: [PATCH] adding kwargs to regionprops --- src/tracksdata/nodes/_mask.py | 10 ++++++---- src/tracksdata/nodes/_test/test_mask.py | 11 +++++++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/tracksdata/nodes/_mask.py b/src/tracksdata/nodes/_mask.py index d6bd0fcc..e227b70f 100644 --- a/src/tracksdata/nodes/_mask.py +++ b/src/tracksdata/nodes/_mask.py @@ -373,7 +373,7 @@ def move( if image_shape is not None: self._crop_overhang(image_shape) - def regionprops(self, spacing: tuple[float, ...] | None = None) -> "RegionProperties": + def regionprops(self, **kwargs) -> "RegionProperties": """ Compute scikit-image regionprops for this mask. @@ -381,16 +381,18 @@ def regionprops(self, spacing: tuple[float, ...] | None = None) -> "RegionProper properties (e.g. centroid, coords) are returned in absolute image coordinates. + IMPORTANT: When providing an intensity image it should match the bounding box shape, not the actual image shape. + Parameters ---------- - spacing : tuple[float, ...] | None - The spacing of the image in each dimension (scale). + **kwargs : dict + Keyword arguments to pass to regionprops. """ props = regionprops( self._mask.astype(np.uint16), cache=True, offset=tuple(self._bbox[: self._mask.ndim]), - spacing=spacing, + **kwargs, ) if len(props) != 1: diff --git a/src/tracksdata/nodes/_test/test_mask.py b/src/tracksdata/nodes/_test/test_mask.py index d804f21d..bf0c0e17 100644 --- a/src/tracksdata/nodes/_test/test_mask.py +++ b/src/tracksdata/nodes/_test/test_mask.py @@ -67,6 +67,17 @@ def test_mask_regionprops_empty() -> None: _ = Mask(mask_array, bbox).regionprops() +def test_mask_regionprops_intensity_image() -> None: + """Regionprops should handle intensity images.""" + mask_array = np.array([[False, True], [True, False]], dtype=bool) + bbox = np.array([0, 0, 2, 2]) + intensity_image = np.array([[1, 2], [3, 4]]) + + props = Mask(mask_array, bbox).regionprops(intensity_image=intensity_image) + assert props.intensity_max == 3 # 4 is outside the mask + assert props.intensity_min == 2 # 0 is outside the mask + + def test_mask_getstate_setstate() -> None: """Test Mask serialization and deserialization.""" mask_array = np.array([[True, False], [False, True]], dtype=bool)