SimpleITK 3.0.0 Alpha 3

Release Notes for SimpleITK v3.0.0 Alpha Release 3

This is the third Alpha Release of SimpleITK 3.0. It covers changes since v3.0.0a1 (September 2025), including v3.0.0a2.

Significant work has been done on the Python packaging and build system, with a migration to scikit-build-core. The Python Image class now supports the buffer protocol and array interface for zero-copy interoperability with NumPy and other array libraries.

Breaking Changes

  • SobelEdgeDetectionImageFilter: The default 3D Sobel operator coefficients have changed to be consistent with the 2D operator (via ITK). A UseLegacyOperatorCoefficients option has been added to restore the previous behavior.
  • Removed the private _GetMemoryViewFromImage function from Python. It is replaced by the Image class’s __array_interface__ and buffer protocol (__buffer__) support (see New Features).
  • Dropped Python 3.9 from packaged wheels. Minimum supported Python version is now 3.10.
  • Minimum CMake version increased from 3.16.3 to 3.23.0.

New Features

  • Added Python buffer protocol (PEP 688) and __array_interface__ support to the Image class. Images can be used directly as read-only NumPy arrays without copying data, and the ImageBuffer CPython class maintains proper memory lifetime.
  • Added pixel_types module to Python with utility functions for determining pixel type categories.
  • Introduced wrapping for ContourExtractor2DImageFilter. Contour results are accessible via parameterized active measurement methods.
  • Added ContainerManageMemory method to internal PimpleImage for controlling ImportImageContainer memory ownership.
  • Added experimental support for building ITK via CMake FetchContent as an alternative to the SuperBuild ExternalProject.
  • Added manylinux_2_28 Linux wheel packages.
  • Python packaging switched from setuptools/setup.py to scikit-build-core with pyproject.toml. A top-level pyproject.toml now enables building and installing SimpleITK as a Python package directly from the source repository, eliminating the need for the separate SimpleITKPythonPackage project. SimpleITK can now be installed directly with:
    pip install .                          # from a local clone
    pip install git+https://github.com/SimpleITK/SimpleITK.git@v3.0.0a3  # from git
    
    The build automatically fetches ITK via FetchContent and compiles both ITK and SimpleITK. Build dependencies (swig, jinja2, pyyaml, etc.) are declared in pyproject.toml and installed automatically by pip.

Build System Changes

  • Migrated Python wheel building to scikit-build-core with a top-level pyproject.toml, replacing the legacy setuptools/setup.py approach.
  • SWIG 4.3.0 is now the minimum required version.
  • Google Test is now fetched via CMake FetchContent instead of being built as a SuperBuild external project.
  • Migrated to CMake FILE_SET for header management (requires CMake 3.23+).
  • Modernized CMake usage: target-based ITK linking, modern foreach(IN LISTS), CMAKE_LINKER_TYPE for gold linker, and simplified export configuration.
  • Removed support for older MSVC compiler versions.
  • Added YAML C-based loader support (pyyaml) for improved code generation performance.

Updates

  • Updated ITK to development version 6.0b2+ (commit c79274e4, main as of 2026-03-09).
  • Upgraded SuperBuild uv installer with isolated install support and PowerShell compatibility.
  • Corrected Lua wrapping template issues and enabled Lua in CI batch builds.

Bug Fixes

  • Fixed Show function creating temporary files with % characters, which caused failures on some platforms.
  • Fixed Python module file extension on Windows.
  • Fixed macOS deployment target configuration for Python distributions.

Additional details and packages can be found on Github:

2 Likes

Is GetITKBase() still the way to get ITK image from SimpleITK image? How hard would it be to make .GetITKImage() method, which would return an image of proper type (instead of DataObject)? I am interested in this via Python wrapping.

The itk::DataObject * Image::GetITKBase() method is a C++ method that is wrapped in any language. This method was not modified in this release.

If you’d like to make a feature request, please create an issue on GitHub and we can discuss further there.

1 Like

For your information, at the moment, ITK (v6.0b02) only uses the new, more consistent coefficients for 3D Sobel when you explicitly disable UseLegacyOperatorCoefficients. Or when you enable ITK_FUTURE_LEGACY_REMOVE.

By default, you still get the old default! :upside_down_face:

The release notes are correct for SimpleITK, in that it defaults to the new behavior. I believe that there was a discussion some place about why the legacy behavior was wrong it would probably be good to include that in the notes. So you know where the discussion occoured? Is this it: Sobel operator extended for 4D, legacy support for 3D, OK?

SimpleITK has the defaults explicitly specified as UseLegacyOperatorCoefficients=OFF.

2 Likes

Thanks for embracing the new Sobel coefficients for 3D, @blowekamp :smile:

Yes indeed! I added the following motivation at https://github.com/InsightSoftwareConsortium/ITK/pull/5718 :

The new coefficients are more commonly used by other toolkits, including SciPy’s scipy.ndimage.sobel, and correspond with https://en.wikipedia.org/wiki/Sobel_operator

Technically, the new coefficients for 3D are computed by the very same algorithm as the coefficients for 2D, 4D, …, and ND. So in that way, they are consistent with the other supported dimensionalities.

1 Like