scikit-image 0.26.0 (2025-12-20)#

We’re happy to announce the release of scikit-image 0.26.0!

New Features#

  • Add new parameter max_step_cost to skimage.graph.MCP.find_costs which allows limiting the maximal stepping cost between points (#7625).

  • In skimage.transform, add the identity class constructor to all geometric transforms. For example, you can now use skimage.transform.PolynomialTransform(dimensionality=2) (#7754).

  • Add new property intensity_median to skimage.measure.regionprops (#7745).

  • binary_blobs now supports a mode parameter for the Gaussian filter, allowing periodic boundary conditions with mode="wrap" (#7909).

API Changes#

  • In skimage.morphology, deprecate binary_erosion, binary_dilation, binary_opening, and binary_closing in favor of erosion, dilation, opening, and closing respectively. The binary versions weren’t actually significantly faster than their non-binary counterparts and sometimes significantly slower. In the future, we might add optimizations internally to the remaining (general, non-binary) functions for when they’re used with binary inputs (#7665).

  • Deprecate parameter max_cost in skimage.graph.MCP.find_costs which previously did nothing. Use the new parameter max_step_cost instead (#7625).

  • Deprecate parameter max_cumulative_cost in skimage.graph.MCP.find_costs which did nothing (#7625).

  • In skimage.morphology.remove_small_holes, deprecate the area_threshold parameter in favor of the new max_size parameter to make API and behavior clearer. This new threshold removes holes smaller than or equal to its value, while the previous parameter only removed smaller ones (#7739).

  • In skimage.morphology.remove_small_objects, deprecate the min_size parameter in favor of the new max_size parameter to make API and behavior clearer. This new threshold removes objects smaller than or equal to its value, while the previous parameter only removed smaller ones (#7739).

  • In skimage.transform, deprecate the use of scalar scale, with dimensionality=3 where this can be passed to a geometric transform contructor. This allows us to generalize the use of the constructors to the case where the parameters must specify the dimensionality, unless you mean to construct an identity transform (#7754).

  • In skimage.transform, turn all input parameters to transform constructors keyword-only (other than matrix). This avoids confusion due to the positional parameter order being different from the order by which they are applied in AffineTransform (#7754).

  • Deprecate parameter num_threads in skimage.restoration.rolling_ball; use workers instead (#7302).

  • Deprecate parameter num_workers in skimage.restoration.cycle_spin; use workers instead (#7302).

  • Officially deprecate old properties in skimage.measure.regionprops and related functions. While we removed the documentation for these some time ago, they where still accessible as keys (via __get_item__) or attributes. Going forward, using deprecated keys or attributes, will emit an appropriate warning (#7778).

  • In skimage.measure, add a new class method and constructor from_estimate for LineModelND, CircleModel, and EllipseModel. This replaces the old API—the now deprecated estimate method—which required initalizing a model with undefined parameters before calling estimate (#7771).

  • In skimage.transform, add a new class method and constructor from_estimate for AffineTransform, EssentialMatrixTransform, EuclideanTransform, FundamentalMatrixTransform, PiecewiseAffineTransform, PolynomialTransform, ProjectiveTransform, SimilarityTransform, and ThinPlateSplineTransform. This replaces the old API—the now deprecated estimate method—which required initializing an undefined transform before calling estimate (#7771).

  • Deprecate skimage.measure.fit.BaseModel; after we expire the other *Model* deprecations, there is no work for an ancestor class to do (#7789).

  • In skimage.measure, deprecate .params attributes of the models CircleModel, EllipseModel, and LineModelND. Instead set model-specific attributes: origin, direction for LineModelND; center, radius for CircleModel, center, ax_lens, theta for EllipseModel (#7789).

  • In skimage.measure, deprecate use of model constructor calls without arguments leaving an uninitialized instance (for example CircleModel()). This applies to CircleModel, EllipseModel, and LineModelND. Instead prefer input arguments to define instances (for example CircleModel(center, radius)). This follows on from prior deprecation of the estimate method, which had implied the need for the no-argument constructor, of form cm = CircleMoldel(); cm.estimate(data) (#7789).

  • In skimage.measure, deprecate use of params arguments to predict* calls of model objects. This applies to CircleModel, EllipseModel, and LineModelND. We now ask instead that the user provide initialization equivalent to the params content in the class construction. For example, prefer cm = CircleModel((2, 3), 4); x = cm.predict_x(t) to cm = CircleMoldel(); x = cm.predict_x(t, params=(2, 3, 4))) (#7789).

Enhancements#

  • Raise a ValueError instead of a TypeError in CircleModel, EllipseModel, and LineModelND in skimage.measure. This applies when failing to pass a value for params (or passing params=None) to predict methods of an uninitialized transform (#7789).

  • In skimage.measure, the RegionProperties class that is returned by regionprops, now has a formatted string representation (__repr__). This representation includes the label of the region and its bounding box (#7887).

Performance#

  • Use greedy einsum optimization in skimage.measure.moments_central (#7947).

  • Add lazy loading to skimage.segmentation (#7035).

Bug Fixes#

  • Make deconvolution example scientifically sensible (#7589).

  • In skimage.filters.sobel/scharr/prewitt/farid, when mode="constant" is used ensure that cval has an effect. It didn’t previously (#7826).

  • Ensure skimage.graph.cut_normalized is deterministic when seeded with the rng parameter and when SciPy 1.17.0.dev0 or newer is installed. With earlier SciPy versions the internally used function scipy.linalg.eigsh is not deterministic and can lead to different results (#7912).

  • Avoid potential integer overflow in skimage.morphology.reconstruction (#7938).

  • Handle negative axis lengths due to numerical errors in axis_major_length and axis_minor_length properties of skimage.measure.regionprops (#7916).

  • In skimage.util.random_noise, ensure that clip argument is handled consistently for various modes (#7924).

  • Apparent fix for Hough transform stray j (#7974).

Documentation#

  • Reflect deprecation of I/O plugin infrastructure in user guide (#7710).

  • Display code blocks with a caption and extra indentation (#7706).

  • Edit gallery examples on segmentation to comply with matplotlib’s object-oriented style (#7531).

  • Add link to 2.0 TODO (#7716).

  • Denote changes in Frangi filter explicitly (#7721).

  • Add SPEC badges (#7737).

  • Fix math equations in docstrings for manders_coloc_coeff and normalized_mutual_information (#7517).

  • Use the import convention import skimage as ski in the docstrings of ski.measure.euler_number, ski.measure.perimeter and ski.measure.perimeter_crofton (#7741).

  • Fix the definition of entropy in the docstring of skimage.metrics.normalized_mutual_information (#7750).

  • DOC: document use of environment.yml in installation guide (#7760).

  • Further document use of regionprops function and fix terms (#7518).

  • Display actual threshold value in Global Otsu plot (#7780).

  • DOC: Include missing gain parameter in adjust_gamma equation (#7763).

  • Document output dtype for transform.resize (#7792).

  • Use consistent wording in property description (#7804).

  • Draft migration guide for skimage2 (#7785).

  • Update import convention in certain gallery examples (#7764).

  • Document some parameters (#7753).

  • Make call to skimage.measure.ransac in the gallery example “Assemble images with simple image stitching” deterministic. This avoids random non-deterministic failures (#7851).

  • Improve docstring for Wiener restoration function (#7523).

  • Describe custom warning-strategy in migration guide (#7857).

  • Normalize spelling of normalize (#7865).

  • Restore fast page navigation with in page anchors (#7899).

  • In skimage.feature, clarify the description of the parameter num_sigma in blob_log and blob_doh (#7774).

  • Use correct CSS selector to override scroll-behavior (#7928).

  • Mention image readers other than skimage.io in getting_started docs (#7929).

  • doc: replace git checkout with git switch (#7910).

  • Avoid doctest error for -0 vs 0 (#7950).

  • Update contributing guide to de-emphasize rebasing (#7953).

  • Update git commands in contributing guide (#7956).

  • Add Linux Foundation Health Score badge to README (#7907).

  • Remove contributor docs section on pushing to another contributor’s branch (#7957).

  • Clarify non-native support for masked array in the documentation (#7968).

  • Designate 0.26.0rc2 release (#7987).

  • Clarify RELEASE.txt after v0.26.0rc2 (#7990).

Infrastructure#

  • Add experimental infrastructure for dispatching to a backend (#7520).

  • Build conda environment.yml from pyproject.toml (#7758).

  • Report failures on main via issue (#7752).

  • Make doctest-plus work with spin (#7786).

  • Temporarily pin to pyodide-build==0.30.0, and ensure that the correct xbuildenvs are used (#7788).

  • Use cibuildwheel to build WASM/Pyodide wheels for scikit-image, push nightlies to Anaconda.org (#7440).

  • CI: Update pypa/gh-action-pypi-publish to v1.12.4 for attestations on PyPI (#7793).

  • Do not report failure in wheels sub-recipe (#7806).

  • Temporary fix for Visual Studio & Clang incompatibility in Windows image (#7835).

  • Setup stub creation with docstub in CI (#7802).

  • Capture docstub output, but retain error (#7852).

  • Add dynamic date / git hash to dev version (#7870).

  • Add dependabot configuration (#7882).

  • Use pytest’s summary over pytest-pretty’s table-based one (#7905).

  • Bump the actions group across 1 directory with 14 updates (#7895).

  • Add 14 day cooldown for dependabot (#7915).

  • Skip Cython 3.2.* and address other issues in wheel building CI (#7901).

  • Simplify build wheel configuration by using of pyproject.toml configuration (#7877).

  • Report failures on nightly wheel build, test, or upload (#7807).

  • Require pytest >=8.3 which hides tracebacks for xfailures (#7937).

  • Note how to deal with automatic CI failure notifications / issues (#7940).

  • CI: Add support for building wheels for Windows on ARM (#7847).

  • Avoid building on macos-13 (#7949).

  • Revert “Refactor names in Pyodide workflow (#7959)” (#7963).

  • Avoid uploading unsupported wasm wheels to PyPI (#7969).

  • Test on macOS intel in CI again (#7965).

  • Wheels: add option to exclude v2 namespace (#7958).

  • Refactor Pyodide workflow with matrix (#7962).

  • Build wheels on Windows & Python 3.14t (#7978).

Maintenance#

  • Bump to Pyodide 0.27.2 stable and install available optional dependencies for WASM tests (#7646).

  • Drop Python 3.10 support (#7673).

  • Remove outdated TODO (#7713).

  • Remove deprecated shift parameters (#7714).

  • Bump to Pyodide 0.27.3 (#7712).

  • Update build (#7715).

  • Remove deprecated image2 param (#7719).

  • Update MacOS min versions (#7720).

  • Cut down runtime of rolling-ball gallery example (#7705).

  • Pin JasonEtco/create-an-issue action to SHA for v2.9.2 (#7787).

  • Remove unused & obsolete legacy_datasets, legacy_registry vars (#7677).

  • Address deprecations in Pillow 11.3 (#7828).

  • Only report failure on main branch once (#7839).

  • Remove superfluous mask argument in _generic_edge_filter (#7827).

  • In skimage.transform.FundamentalMatrixTransform, refactor scaling calculation to make algorithm clearer, and allow original Hartley algorithm if preferred (#7767).

  • Skip doctest with random component (#7854).

  • Remove MANIFEST.in, that is no longer needed with Meson (#7855).

  • Fix simple errors reported by docstub (I) (#7853).

  • Add package version to skimage2 (#7871).

  • Use data files from GitLab repo (#7875).

  • Fix test to not fetch data already presented in test directory, fix tests on Python 3.14 and macos arm (#7881).

  • Update TODO to check test precision on macOS ARM (#7884).

  • Add information about time of execution of test on each file (#7874).

  • Remove np.testing from skimage._shared.utils (#7891).

  • MAINT: some dependency version consistency cleanups (#7894).

  • Add forgotten pytest-pretty to Pyodide wheel recipe too (#7898).

  • Address ResourceWarning in _built_utils/version.py (#7904).

  • Mark test_rag.py::test_reproducibility as flaky for current versions of SciPy (< 1.17.0.dev0) (#7912).

  • Use divmod in montage index computation (#7914).

  • Test fixes and improvmement from cibuldwheel PR (#7922).

  • Allow Cython 3.2.0 again (#7927).

  • Move away from numpy.fix in favor of numpy.trunc (#7933).

  • Bump the Pyodide version for testing to the latest available (0.29) (#7931).

  • Fix ResourceWarning in CI (#7930).

  • Switch back to using Cython wheels from PyPI (#7932).

  • moments_hu doctest should ignore tiny differences (#7944).

  • Relax constraints of regionprops multichannel test on MacOS with NumPy & “Accelerate” (#7942).

  • Refactor names in Pyodide workflow (#7959).

  • Use __doctest_requires__ instead of inline importorskip (#7966).

  • Mark test_wrap_around as xfail on macOS until 2026-02-01 (#7985).

Contributors#

40 authors added to this release (alphabetically):

25 reviewers added to this release (alphabetically):

_These lists are automatically generated, and may not be complete or may contain duplicates._