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_costtoskimage.graph.MCP.find_costswhich allows limiting the maximal stepping cost between points (#7625).In
skimage.transform, add theidentityclass constructor to all geometric transforms. For example, you can now useskimage.transform.PolynomialTransform(dimensionality=2)(#7754).Add new property
intensity_mediantoskimage.measure.regionprops(#7745).binary_blobsnow supports amodeparameter for the Gaussian filter, allowing periodic boundary conditions withmode="wrap"(#7909).
API Changes#
In
skimage.morphology, deprecatebinary_erosion,binary_dilation,binary_opening, andbinary_closingin favor oferosion,dilation,opening, andclosingrespectively. 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_costinskimage.graph.MCP.find_costswhich previously did nothing. Use the new parametermax_step_costinstead (#7625).Deprecate parameter
max_cumulative_costinskimage.graph.MCP.find_costswhich did nothing (#7625).In
skimage.morphology.remove_small_holes, deprecate thearea_thresholdparameter in favor of the newmax_sizeparameter 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 themin_sizeparameter in favor of the newmax_sizeparameter 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 scalarscale, withdimensionality=3where 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 thanmatrix). This avoids confusion due to the positional parameter order being different from the order by which they are applied inAffineTransform(#7754).Deprecate parameter
num_threadsinskimage.restoration.rolling_ball; useworkersinstead (#7302).Deprecate parameter
num_workersinskimage.restoration.cycle_spin; useworkersinstead (#7302).Officially deprecate old properties in
skimage.measure.regionpropsand 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 constructorfrom_estimateforLineModelND,CircleModel, andEllipseModel. This replaces the old API—the now deprecatedestimatemethod—which required initalizing a model with undefined parameters before callingestimate(#7771).In
skimage.transform, add a new class method and constructorfrom_estimateforAffineTransform,EssentialMatrixTransform,EuclideanTransform,FundamentalMatrixTransform,PiecewiseAffineTransform,PolynomialTransform,ProjectiveTransform,SimilarityTransform, andThinPlateSplineTransform. This replaces the old API—the now deprecatedestimatemethod—which required initializing an undefined transform before callingestimate(#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.paramsattributes of the modelsCircleModel,EllipseModel, andLineModelND. Instead set model-specific attributes:origin, directionforLineModelND;center, radiusforCircleModel,center, ax_lens, thetaforEllipseModel(#7789).In
skimage.measure, deprecate use of model constructor calls without arguments leaving an uninitialized instance (for exampleCircleModel()). This applies toCircleModel,EllipseModel, andLineModelND. Instead prefer input arguments to define instances (for exampleCircleModel(center, radius)). This follows on from prior deprecation of theestimatemethod, which had implied the need for the no-argument constructor, of formcm = CircleMoldel(); cm.estimate(data)(#7789).In
skimage.measure, deprecate use ofparamsarguments topredict*calls of model objects. This applies toCircleModel,EllipseModel, andLineModelND. We now ask instead that the user provide initialization equivalent to theparamscontent in the class construction. For example, prefercm = CircleModel((2, 3), 4); x = cm.predict_x(t)tocm = CircleMoldel(); x = cm.predict_x(t, params=(2, 3, 4))) (#7789).
Enhancements#
Raise a
ValueErrorinstead of aTypeErrorinCircleModel,EllipseModel, andLineModelNDinskimage.measure. This applies when failing to pass a value forparams(or passingparams=None) topredictmethods of an uninitialized transform (#7789).In
skimage.measure, theRegionPropertiesclass that is returned byregionprops, now has a formatted string representation (__repr__). This representation includes the label of the region and its bounding box (#7887).
Performance#
Bug Fixes#
Make deconvolution example scientifically sensible (#7589).
In
skimage.filters.sobel/scharr/prewitt/farid, whenmode="constant"is used ensure thatcvalhas an effect. It didn’t previously (#7826).Ensure
skimage.graph.cut_normalizedis deterministic when seeded with therngparameter and when SciPy 1.17.0.dev0 or newer is installed. With earlier SciPy versions the internally used functionscipy.linalg.eigshis 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_lengthandaxis_minor_lengthproperties ofskimage.measure.regionprops(#7916).In
skimage.util.random_noise, ensure thatclipargument 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 skiin the docstrings ofski.measure.euler_number,ski.measure.perimeterandski.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.ransacin 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 parameternum_sigmainblob_logandblob_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
cibuildwheelto build WASM/Pyodide wheels forscikit-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.tomlconfiguration (#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_registryvars (#7677).Address deprecations in Pillow 11.3 (#7828).
Only report failure on main branch once (#7839).
Remove superfluous
maskargument 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_reproducibilityas flaky for current versions of SciPy (< 1.17.0.dev0) (#7912).Use
divmodinmontageindex 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_aroundas xfail on macOS until 2026-02-01 (#7985).
Contributors#
40 authors added to this release (alphabetically):
Aditi Juneja (@Schefflera-Arboricola)
Agriya Khetarpal (@agriyakhetarpal)
Alex Louk (@AlexLouk)
Ananya Srivastava (@ana42742)
Brigitta Sipőcz (@bsipocz)
Emmanuel Ferdman (@emmanuel-ferdman)
Eoghan O’Connell (@PinkShnack)
Giuditta Parolini (@GParolini)
Grzegorz Bokota (@Czaki)
Jamal Mustafa (@jimustafa)
Jan Eglinger (@imagejan)
Jarrod Millman (@jarrodmillman)
Jeremy Muhlich (@jmuhlich)
Jonathan Reimer (@jonathimer)
Jordão Bragantini (@JoOkuma)
Juan Nunez-Iglesias (@jni)
Kevin (@apetizerr)
Kimberly Meechan (@K-Meech)
Larry Bradley (@larrybradley)
Lars Grüter (@lagru)
Marianne Corvellec (@mkcor)
Mark Harfouche (@hmaarrfk)
Matt Haberland (@mdhaber)
Matthew Brett (@matthew-brett)
Matthew Feickert (@matthewfeickert)
MS-GITS (@Greenie0701)
Paweł Rzońca (@clacrow)
Sebastian Berg (@seberg)
Sigurd Vargdal (@Tensorboy2)
Stefan van der Walt (@stefanv)
Tim Head (@betatim)
Valentin Valls (@vallsv)
Veit Heller (@hellerve)
Vicent Caselles-Ballester (@vcasellesb)
25 reviewers added to this release (alphabetically):
Aditi Juneja (@Schefflera-Arboricola)
Agriya Khetarpal (@agriyakhetarpal)
Alex Louk (@AlexLouk)
Brigitta Sipőcz (@bsipocz)
Gregory Lee (@grlee77)
Grzegorz Bokota (@Czaki)
Jan Eglinger (@imagejan)
Jarrod Millman (@jarrodmillman)
Juan Nunez-Iglesias (@jni)
Larry Bradley (@larrybradley)
Lars Grüter (@lagru)
Marianne Corvellec (@mkcor)
Mark Harfouche (@hmaarrfk)
Marvin Albert (@m-albert)
Matthew Brett (@matthew-brett)
MS-GITS (@Greenie0701)
Paweł Rzońca (@clacrow)
Sebastian Berg (@seberg)
Sigurd Vargdal (@Tensorboy2)
Stefan van der Walt (@stefanv)
Tim Head (@betatim)
Vicent Caselles-Ballester (@vcasellesb)
_These lists are automatically generated, and may not be complete or may contain duplicates._