Slicer 4.10: Summary, Highlights and Changelog


(Jean Christophe Fillion Robin) #1

Table of Contents

Summary

The community of 3D Slicer developers is proud to announce that version 4.10 is now available for download. This version introduces ~500 feature enhancements and bug fixes for better performance and stability. It includes more than 20 new-and-improved core modules and more than 25 new-and-improved extensions.

The development of 3D Slicer—including its numerous modules, extensions, datasets, pull requests, patches, issues reports, suggestions—is made possible by users, developers, contributors and commercial partners around the world. This development is funded by various grants and agencies. For more details, please see the 3D Slicer Acknowledgments page.

slicer.org is the portal to the application, training materials, and the development community.

The Slicer Training page provides a series of tutorials and data sets for training in the use of Slicer.

Please note that Slicer continues to be a research package and is not intended for clinical use. Testing of functionality is an ongoing activity with high priority, however, some features of Slicer are not fully tested.

Highlights

Rendering improvements

Switched to completely reworked rendering infrastructure, which enables 10-100x faster rendering of complex surface models, faster GPU-accelerated volume rendering, available on a wider range of devices, such as laptops with integrated GPU. The minimum required OpenGL version is now 3.2.

  • GPU volume rendering has now Surface smoothing option to remove woodgrain artifacts without increasing rendering time (enable at Volume rendering / Advanced / Techniques / Advanced rendering properties).

  • New optimized volume rendering quality option: “Normal” optimized image sampling parameters based on volume size and resolution

  • New multi-volume rendering mode (Volume renderig/Display/Rendering: VTK Multi-Volume): experimental, shading and dynamic clipping not supported yet. Example of skull rendered from CT and stripped brain from MRI:
    image

  • Smooth clipped surfaces: clipping ROI boundaries are now rendered as smooth planes

  • Gradient opacity mapping: gradient opacity mapping can be used to make soft-tissues (or other regions with slowly varying image intensity) semi-transparent. It now works with both CPU and GPU volume rendering.
    image

  • Depth peeling: transparent surface meshes (models, segmentations) are now correctly rendered (enable depth peeling by clicking push-pin icon in 3D view, triple-dot button, Use depth peeling checkbox)
    image

  • Improved performance on systems with many CPU cores by using Threaded Building Blocks (TBB) as SMP backend in VTK. It is enabled by default on Windows. Multi-threaded image filter execution is typically improved by 20-30%. For more details, read the Performances section in the Changelog.

Segmentation improvements

Many improvements and fixes has been implemented in Segment Editor and related modules.

  • Convert solid segments to hollow objects, for example to create 3D-printable vessel wall from segmented blood pool.

  • New Draw Tube effect added for segmentation of tubular shapes (nerves, flexible catheters, etc.) from control points placed in slice or 3D viewers - available in SegmentEditorExtraEffects extension.

  • Save segmentations directly to STL or OBJ files for 3D printing or exporting to external modeling software

  • Improve segmentation quality by setting finer resolution, isotropic voxel size in the segmentation node’s internal labelmap representation. Click the box icon image next to the master volume selector to open the Segmentation geometry window.
    image

  • Improved 3D update speed by up to 5x: disable surface smoothing (surface smoothing factor is set to 0) and then 3D view is updated immediately after a segmentation is edited

  • Automatically alignment of slice views: if slice views are not oriented according to axes of internal labelmap then a warning icon image appears. Clicking the icon automatically realigns all slice views.

  • Find small segments in a large volume easier: click “Jump slices” option to context menu (right-click menu) of segment list to show segment centered in all slice views.
    image

  • Improved paint and erase effect: (1) Made painting/erasing in 3D view optional, (2) Added “smudge” option to paint effect: auto-select segment at click position, and (3) added option to erase in all segments.

Improved Python support

  • Slicer can be used via Jupyter notebooks. Supports auto-complete, inspection (documentation lookup), showing slice and 3D view content in the notebook.

  • Slicer notebooks can be launched directly on the cloud in any web browser. Can be used on any platforms, even on a phone, no Slicer installation is necessary. Try now! Binder

  • Any Python script can be loaded into Slicer as a CLI module. User interface in Slicer is generated automatically from module descriptor XML file. See Radiomics module as an example.

Virtual Reality

3D Slicer scenes can be viewed in any OpenVR-compatible virtual reality headset(https://blog.kitware.com/slicervirtualreality/), such as HTC Vive, any Windows MR headset, or Oculus Rift, by a single button click. 3D Slicer supports all rendering modes, including 4D volume rendering. User can walk or “fly” around, look in inside objects. Individual objects or the entire scene can be moved, translated, rotated using controllers: can be used for exploring anatomy (may replace 3D printing in some applications), simulated device placement, interactive 3D registration, etc.

Other improvements

  • Plotting capabilities have improved with the new Plots module. Plots can be created directly from tables (stored as .csv files). Line, scatter, bar plot types, various line styles. Custom labels, axes, interactive editing and selection of values.

  • Custom 3D Slicer-based clinical research or commercial applications can now be developed and maintained more easily: a new application template was developed that gives broad control over the application’s look and feel (custom stylesheet, icons, branding, main window content) and content (custom extensions, modules can be bundled, any Slicer core modules can be disabled). The template is already used for building custom research tools, such as SlicerSALT and multiple clinical software applications.

  • Markup fiducials can be copied to clipboard and pasted into Excel or into other markup fiducial list.

  • Screen capture: Master view can be different from captured views, therefore for example it is now possible to sweep a slice view and capture it in 3D view (master view is a slice node; capture all frames enabled; layout is 1-up 3D). Video can be exported that repeats the animation multiple times, optionally in forward/backward direction, which enables sharing very short (few-second) videos on YouTube or other video players where continuous looped playback is not available.

  • 26 new extensions have been added - see complete list below


Update: Slicer 4.10 release will be initiated tomorrow morning
(Andras Lasso) #2

Changelog

Core

Performances

  • Threaded Building Blocks (TBB) is now available as a SMP backend in VTK.

    • It provides tools for writing parallel C++ programs and VTK can use TBB to improve efficiency of execution of many filters.

    • Using TBB over default multi-threading (Sequential), multi-threaded image filter execution is typically improved by 20-30%. In cases where many threads are created (e.g., pipeline updates performed 10-100 per second, on an 8 or more core machine) and the computation load is very small, the speed may be improved by a factor of 10-20x.

    • On some systems image reslicing performance is increased from 10fps to 130fps by switching from Sequential to TBB.

    • TBB is now enabled by default on Windows. Slicer with TBB has not been tested on Linux and macOS yet.

  • Speedup app startup time by lazily instantiating extension dialog: With the introduction of Qt5, this became an issue because instantiating a QWebEngineView also means that QtWebEngineProcess is started. Read details at r26960.

  • Use new, optimized VTK filters for isosurface extraction and plane cutting. vtkDiscreteMarchingCubes replaced with vtkDiscreteFlyingEdges3D, and vtkCutter replaced with vtkPlaneCutter. With TBB backend, computation time for complex surfaces (e.g., obtained by thresholding a noisy grayscale volume) is decreased by a factor of 30-500%.

  • Speedup application launch by 50% when handling of command-line argument displays a message and exits the application. This was done by introducing the function quickExit allowing to quickly terminate the process. More details at r27015.

  • Ensure application quickly exit if problem parsing cmd line arguments

  • Improve reslicing performance: When slice position was changed, all inputs of slice image blend filters were reset, which caused measurable slowdown in some cases. This fix makes sure that slice inputs are only reset if they have been changed. It improves reslice speed by a few FPS, and much more in some special cases.

  • Improve rotate to volume plane algorithm. Slice plane is always rotated to the closest matching plane orientation. If a single-slice volume is selected then volume plane normal is selected as slice plane normal. Also added RotateToAxes method, which allows aligning slice with an arbitrary coordinate system, defined by a homogeneous transformation.

  • Hide/show crosshairs actor instead of using the more expensive add/remove.

  • Prevent unnecessary 3D view updates. When slice view was moved or crosshair was moved, 3D view was always updated, even if slice and crosshair were not visible in the 3D view. This caused unnecessary slowdown of slice browsing.

Features

Fixes

  • Report insufficient OpenGL support instead of crashing.

  • Fix Windows remote desktop re-connection on OpenGL version check. If insufficient OpenGL version is found on Windows then a “Retry” option is offered, which closes current remote desktop session and restarts Slicer.

  • Fix high DPI display on windows with multiple screens.

  • Fix passing module paths containing single quote. Add SlicerCorePythonManager::toPythonStringLiteral method to create Python string literals from string values.

  • Create user-specific temporary directory on unix systems. Slicer temporary directory is owned by the user who started Slicer first and is not writeable for other users.

  • Reset scene name when closing the scene.

  • Fix running of script specified with native path separators.

  • Fix crash on scene close caused by annotation ROI node.

  • Fix add and subtract slice blending modes.

  • Fix slice normal flipping by rotate to volume plane. “Rotate to volume” always set slice (X, Y, normal) axes to form a right-handed coordinate system. However, by default, axial and sagittal views are set up with a left-handed coordinate system, so “Rotate to volume” feature flipped the slice normal (slice moved in opposite direction when moving the slider the same direction) for axial and sagittal views. Fix problem by flipping the slice plane normal if and only if input slice coordinate system was left-handed.

Internationalization/Localization

  • Add translation support for loadable modules as well as MRML Widgets.

  • Improve support for Chinese language by fixing qSlicerCoreApplication::loadTranslations() and also encoding special characters for subject hierarchy item attributes. See https://discourse.slicer.org/t/slicer-mrml-scene-not-loading/2090

  • Add more string translation in qSlicerAppMainWindow and qMRMLCaptureToolBar.

IO

  • Features

    • Scene view is not created automatically on save. Scene views make large files significantly larger, clutter the scene view list, and scene views are still not very reliable. Therefore, scene view is not created automatically on file save anymore. A screenshot is still saved (same folder and file basename as the .mrml file but with .png extension).

    • Save the scene in same file format as it is loaded from.

    • Update IO manager adding convenience function “openAddMarkupsDialog”

    • Write coordinate system name (currently RAS, in the future it may be RAS or LPS) into OBJ, STL, and PLY file header. This will allow better compatibility with all software that save meshes in LPS coordinate system.

    • Show wait cursor while loading data using Slicer file dialog

  • Fixes

    • Add Latin1 encoding specification to saved MRML file to ensure correct loading of names with special characters.

    • qSlicerXcedeCatalogReader: Fix reading of description in importVolumeNode.

    • Improve SceneView saving and loading (Fix storage file names in scene views when saving MRB, fix crash in subject hierarchy node when restoring a scene view).

    • Fix save location of nodes with updated file name.

    • Fix range check in vtkMRMLStorageNode::ResetNthFileName.

    • Fix crash when attempted to save node without specifying filename.

    • Fix User color node reverting to File on scene reload

    • Fix filename overrides when saving to MRB.

    • Fix saving of vtkMRMLScriptedModuleNode parameters with special chars

    • Remove full file extension to generate node name when loading volume.

    • Fix loading of custom model display scalar range from scene.

    • Fix confirmation of saved scenes. Confirmation was asked even if “always close” checkbox was checked.

    • Fix volume rendering display node saving.

    • Fix double-saving of VolumeRendering MRML node attribute.

    • Fix too bright material in .obj material files. Models exported into .obj file showed up too bright in Blender and other software. Fix color scale so that sum of diffuse, ambient, and specular component has correct intensity.

    • DiffusionWeightedVolumeNode must only accept unit-length gradients.

    • vtkNRRDWriter: don’t dup ‘space’ field as k-v from node attribute.

DICOM

Most changes to the DICOM module are under-the-hood improvements to provide additional flexibility to load a wider variety acquisition types with fewer warning messages and redundant confirmation dialogs. Added extensive options to DICOM header (metadata) viewer to allow exporting all or selected fields for troubleshooting and data mining. Also improved DICOM utility methods to make it easier for developers to import and load DICOM data sets.

Multivolume/Sequences Support

MultiVolume support was improved with new features (support of multivolume import from 4D NIfTI), incremental improvements (improved robustness of cardiac CT import, support of import of multivolume as Sequences, improved progress reporting, migration of the infrastructure to use Plotting module in place of VTK plots) and bug fixes.

API Updates

  • Add API to add border around fullscreen app window. On Windows, when turning on OpenGL and using the full screen mode (mainWindow=slicer.util.mainWindow().showFullScreen()), menus and tooltips were no longer visible. By enabling setHasBorderInFullScreen, a one-pixel border is added around the window, which fixes the problem. See http://doc.qt.io/qt-5/windows-issues.html#fullscreen-opengl-based-windows

  • User information can be saved to application settings using slicer.app.applicationLogic().GetUserInformation(). User information can be edited in application settings (User panel).

  • Set default attribute value for Scene::Clear(bool). This change allows clearing the scene by simply calling scene.Clear().

  • Add Pick3D function for 3D displayable managers. 3D displayable managers can implement their Pick3D function which takes a RAS point, and finds the display node that was picked. It can be queried using GetPickedNodeID. Implemented for models, segmentations, and volume rendering

  • Allow excluding views from main layout management. See KitwareMedical/SlicerOpenVR#18

  • Add pause render functions to qMRMLLayoutManager and qSlicerApplication: When modifying or setting up nodes that may trigger a render event, pauseRender can be called to temporarily stop the view from rendering intermediate steps. Once all modifications have been completed, calling resumeRender will restore the previously stored pause states.

  • Add method in ThreeDViewControllerWidgetPrivate to retrieve ViewLogic from ViewNode.

  • Add color support to 3D view controllers. The layout view property ‘viewcolor’ was only available for slice views. By sinking the LayoutColor member variable from vtkMRMLSliceNode to vtkMRMLAbstractViewNode, and adding accessor functions to qMRMLThreeDWidget and controller similar to those in the slice widgets, this property can now be set to 3D views as well.

  • Add fit option to slicer.util.setSliceViewerLayers().

  • Refactor and improve underlying infrastructure to support browsing capabilities provided by Qt4 (QWebView) and Qt5 (QWebEngineView).

  • Add C++ macros for reading, writing, copying, and printing MRML node properties. For more details, read Why use macros instead of functions ?.

  • Add Set/GetOrientationMatrixColumn methods to vtkAddonMathUtilities.

  • Add “IsNodeClassRegistered” function to vtkMRMLScene.

  • Add MeanDiffusivity calculation to vtkDiffusionTensorMathematics class.

Python Scripting

  • Change Slicer’s Python executable to PythonSlicer. This allows using Slicer’s Python executable as an interpreter in PyCharm (to make available auto-complete and method documentation in the editor).

  • Support import of Slicer python packages using PythonSlicer.

  • Support loading module script starting with ‘!#’ as Python CLI.

  • Add python utilities that download, unzip, import, and load DICOM data.

  • Add accessor functions to layout manager and factory.

  • Numpy Integration

    • Add functions for indicating numpy array modification to slicer.util: arrayFromVolumeModified, arrayFromModelPointsModified and arrayFromGridTransformModified.

    • Add arrayFromVolume support for vtkMRMLDiffusionWeightedVolumeNode.

    • Add convenience function for creating table node from numpy array.

    • Add slicer.util.arrayFromSegment helper function.

  • Wrapping

    • ModulePanel: Add support for setting/getting module manager from python.

    • Add Python wrapping for all qMRMLSliceWidget methods.

    • Add DICOMUtils.refreshDICOMWidget to refresh browser from database.

    • Throw an exception if getNode() does not find a node.

    • Fix wrapping of QSocketNotifier.

  • Performance

  • Fixes

    • Ensure user site-packages are not imported by PythonQt

    • Ensure python is not initialized if Slicer started with --disable-python

    • Do instantiate any scripted plugins when python is disabled

    • Fix copy-paste issue with Python console: When copy-pasting something somewhere before the last character in the command line, the rest of the line was ignored when executing.

Infrastructure

Dashboard and Factories

  • Switch continuous integration to CircleCI 2.0 leveraging the “slicer/slicer-base” docker image based of “slicer/buildenv-qt5-centos7”. See https://github.com/Slicer/SlicerBuildEnvironment and https://github.com/thewtex/SlicerDocker.

  • Improve dashboard driver script used to test both Slicer application and Slicer extensions as well as custom Slicer-based applications. Dashboard script templates is also easier to customize and read (50% less lines).

  • Add support for uploading extension packages to a Girder based server.

  • “Slicer Nightly” build has been renamed to “Slicer Preview”. See https://discourse.slicer.org/t/different-dashboard-for-master-and-stable-builds/2091.

  • License information is now tracked for all external projects and remote modules: A license-.txt file is generated for each external projects. This should help compose the list of open source packages used in a Slicer based applications.

  • Add runCodespell maintenance script to identify and help fix typo in Slicer source code.

  • Reduce noise reported on the quality dashboard updating CTestCustom warning exception list.

  • Add support for uploading extension package to a Girder based server. See https://github.com/girder/slicer_extension_manager#readme.

Build System

  • Support building Slicer against either Qt4 or Qt5.

    • Configuring Slicer with QT_QMAKE_EXECUTABLE CMake option means that Qt4 is required and defaults to C++98 and VTK7 with legacy OpenGL backend.

    • Configuring Slicer with Qt5_DIR CMake option means Qt5 is required and defaults to C++11 and VTK8 with new OpenGL backend.

  • Subversion is no longer required to configure Slicer.

  • SuperBuild extension templates have been improved.

  • IDE support

    • Add support for “Slicer --VisualStudioProject” option to automatically open the Visual Studio with the Slicer project.

    • Associate python wrapping Hierarchy targets with an IDE folder. This will ensure that within IDE like VisualStudio each hierarchy targets will be organized in their corresponding “folder”.

  • Update infrastructure used to regenerate the Slicer.crt Certificate authority bundle. The bundle is used to confirm the “digital identity” of peers when establishing secure connection over https. See Slicer/Base/QTCore/Resources/Certs/README.

  • Streamline future update of major version of ITK and VTK by renaming external project file.

  • Fix build issues with GCC7.

  • Fix building with a virtualenv system python.

  • Update SlicerInitializeOSXVariables CMake module with latest macOS version.

  • Improve build system to fail early if requirements are not met.

  • Improve consistency of external projects (External_*.cmake) in Slicer and CTK.

  • Update dynamic analysis infrastructure. Read r26993 commit message for more details.

  • Improve support for ninja build tool adding support for CMAKE_JOB_* options. See https://discourse.slicer.org/t/ninja-build-using-too-many-cores/2304

  • Fix configuration of valgrind script on macOS

  • Update SuperBuild extension template to work around ExternalProject issue and submit a CMake fix. See https://gitlab.kitware.com/cmake/cmake/merge_requests/1838 and viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&revision=27038

  • Contribute improvements to ExternalProjectDependency CMake module:

    • Introduce ExternalProject_AlwaysConfigure function

    • Add support for EXTERNAL_PROJECT_ADDITIONAL_DIRS.

    • If set propagate CMAKE_EXPORT_COMPILE_COMMANDS and CMAKE_JOB_* to all CMake-based external projects.

    • Ensure USES_TERMINAL_* options are always enabled.

    • Fix incorrect behavior supporting variables ending with “-NOTFOUND”.

  • Update UseSlicer to conveniently include ExternalProject CMake module and ensure that the CMAKE_OSX_ variables are passed to all external projects when used in SuperBuild extension.

Custom Slicer application support

  • Modernize the Slicer Custom Application template https://github.com/KitwareMedical/SlicerCustomAppTemplate and introduce use of cookiecutter template for generating a custom application.

  • Introduce application properties to differentiate Slicer and main app version. Custom Slicer application can have their own metadata (version number, description, …) in addition of the Slicer ones. See r27316 for more details.

  • Slicer util messageBox now shows current actual application name.

  • Dependencies

    • Allow custom Slicer application to list other Slicer external projects: This can be done in the YourCusomApp/CMakeLists.txt by updating the list of EXTERNAL_PROJECT_ADDITIONAL_DIRS with the path containing the external project files and (2) appending to the variable Slicer_ADDITIONAL_DEPENDENCIES.

    • Support configuring and building against custom install of Python. Note that creating a package bundling a custom installation of the python libraries is still NOT supported, instead of failing with an error message, an obvious warning message is now reported.

  • Slicer Refactoring:

    • Simplify Main.cxx introducing (pre|post)InitializeApplication functions. This allows to remove duplicated code from Slicer-based application.

    • Split main window class to allow re-use in Slicer custom application. Add the class “qSlicerMainWindow” to Base/QTApp library. This allows to use a standard derivation approach in Slicer custom application. See r27324.

    • Rename and relocate qSlicerAppErrorReportDialog into Base/QTApp library

    • Rename qSlicerAppAboutDialog to qSlicerAboutDialog and relocate into Base/QTApp library. Update API to support customization of properties like logo and URLs.

    • Introduce “mainApplicationName” SlicerCoreApplication property.

  • Packaging:

    • Superbuild-type extension can be bundled to the Slicer package by adding it to Slicer_EXTENSION_SOURCE_DIRS.

    • Support macOS packaging of shared third-party libraries installed by extension: This commit allows to specify a variable _FIXUP_BUNDLE_LIBRARY_DIRECTORIES in the extension CMakeLists.txt and ensure that fix-up script will successfully find and copy the shared libraries being a dependency an extension modules.

    • Update UseSlicer add variables for macOS link flags for 3rd-party binaries and libraries. Variables Slicer_INSTALL_THIRDPARTY_EXECUTABLE_LINK_FLAGS and Slicer_INSTALL_THIRDPARTY_LIBRARY_LINK_FLAGS useful for linking executable and binaries that depends on Slicer external projects but are installed in Slicer_INSTALL_THIRDPARTY_BIN_DIR and Slicer_INSTALL_THIRDPARTY_LIB_DIR. This is the case of extensions building tools or libraries that are respectively not CLIs and not loadable module libraries but are expected to be linked against project like VTK or ITK.

  • Slicer CMake modules

    • Refactor vtkMacroKitPythonWrap to streamline integration in other project

    • Introduce SlicerApplicationOptions, SlicerInitializeBuildType and SlicerInitializeReleaseType CMake modules.

    • Introduce SlicerDirectories CMake module: This module allows to get the (relative) directories for both build and install tree. It was re-factored into its own module to allow Slicer-based app to get the value of the directories.

    • Rename CMake module SlicerBlockSetCMakeOSXVariables to SlicerInitializeOSXVariables

    • Ensure ExternalProjectAddSource module can directly be included and used in custom Slicer application.

Dependencies

Qt

  • Update from Qt 4.8 to Qt 5.11

ITK

  • Update ITK to 4.13.1, for more information on the new features available see the ITK 4.13 release notes.

  • DICOM image reading, which is provided by ITK, can now optionally use ITK’s DCMTK backend in addition to the GDCM backend.

  • Anticipating the transition to ITK 5, the code has been updated to build with the option ITK_LEGACY_REMOVE set to ON.

VTK

New Modules

Plots

  • Features

    • Add subject hierarchy plugin for plot series node. It is now easy to add/remove series from a chart using visibility icon in subject hierarchy.

    • Add tooltip to plot series widget explaining why x axis column cannot be selected for non-scatter plots.

    • Add logarithmic axis scaling option for plot axes.

    • Add option to specify custom plot axes range.

    • Made plot legend font size adjustable.

    • Read FAQ: What is the difference between Slicer Plot and Chart ?

  • Python API

    • Add slicer.util.plot function for easy creation of plots from numpy arrays.

Improved Modules

BRAINSTools

  • Update DWIConvert module to fix conversion of FSL (*.nii.gz) to NRRD file

Colors

  • Feature:

    • Add centered label display to color node scalar bar: Start/end position of labels were always the start/end of scalar range, which made color names misaligned with the color swatches. The new centered mode allows placing a label right in the center of each color swatch.

Data

  • Features

    • Subject Hierarchy module has been merged into the Data module as a new tab. Available tabs in the module are “Subject hierarchy”, “Transform hierarchy” and “All nodes”. The “Display tab” has been removed.

    • Add subject hierarchy visibility actions. There are two new actions when right-clicked on the eye icon: (1) Models plugin: “Toggle slice intersection visibility”, (2) Volume Rendering plugin: “Toggle volume rendering” + “Volume rendering options…”.

  • API

    • Add utility function in volume rendering logic called CreateDefaultVolumeRenderingNodes for convenient setup of nodes required for rendering a volume. Only creates nodes if they did not already exist.
  • Fixes

    • Encode subject hierarchy item names: If subject hierarchy item name contained special character (such as &) then it was written directly to the XML file, causing parsing errors.

    • Prevent cell with visibility toggle from being text editable.

    • Fix subject hierarchy treeview popup height.

    • Update combobox label on SubjectHierarchyItemModifiedEvent. The subject hierarchy combobox text would not get updated when its item or one of its parent was modified.

Data

Probe
  • Improve user experience keeping DataProbe height consistent.

  • Fix logic used to hide slice view corner annotations.

Extract Skeleton

  • Fix centerline points computation.

Endoscopy

  • Fix camera update: No camera Modified event is invoked until all camera parameters are updated. Camera view up vector and clipping range is automatically recomputed.

  • Increase maximum replay speed by allowing skipping 50 points (was 10 before).

Extension Wizard

  • Add created module paths to search paths by default.

  • Include name of target in pull request title

  • Fix contribution of extensions targeting a specific version of the ExtensionsIndex.

Cameras

  • Fix vtkMRMLCameraNode::ResetClippingRange(): Far clipping plane was approximated from camera distance form focal point, which was often incorrect.

  • Fix start/end modify for vtkMRMLCameraNode: ModifiedEvent was invoked directly by calling InvokeEvent(), which was not intercepted in DisabledModified state. Fixed by using Modified() method instead.

Label Map Statistics

  • Add Median computation support.

Landmark Registration

  • Known issue: This module has not changed much, but is currently not working pending the resolution of bug #4634.

Markups / Fiducials / Annotations

  • Features

    • Allow cut, copy, and paste of fiducials in markups module.

    • Replace old markup copy/move by new clipboard based new version.

  • Fixes

    • Ensure vtkMRMLMarkupsNode::AddPointToNthMarkup return value on failure.

    • Fix markups fiducial appearing when clicking on a different slice. When clicked&dragged at a screen position where there was a fiducial at that position on a different slice, the fiducial jumped to the current slice.

    • Ensure markup is visible after clicking in 3d in persistent mode.

    • Prevent MarkupsFiducialStorage saving if invalid coordinate system.

    • Define annotation ROI widget handle size relative to window size.

Models, Surface Toolbox

  • Features

    • Add direct color mapping option to Models module. Files that contain RGB color for each cell or vertex as 3-component scalar can now be displayed correctly by selecting the new “Direct color mapping” option in models module / display / scalar section.

    • Add Fill Holes step to SurfaceToolbox module

  • Fixes

    • Fix model scalar thresholding.

    • Fix model clipping by scalar.

ProbeVolumeWithModel

  • Add support for volumetric meshes.

Sample Data

  • Support adding custom data category.

  • Add Development category that only shows up in Developer mode

  • Add one dataset in the Development category: TinyPatient, containing a 10x10x10 CT and a binary labelmap segmentation with two segments.

  • Stop trying to download data after five attempts (it could get into infinite loop)

  • Add MRBrain sample data set.

  • Try to download sample data again if loading fails.

Segmentations / Segment Editor / Segment Statistics

  • Features

    • Move Editor module to Legacy category.

    • Allow saving empty segmentation node.

    • Add Jump slices option to context menu of segment list. This makes it easy to find a small segment in a large volume.

    • Make segment editor brush appear in yellow instead of white.

    • Add size scale option to segmentation file export.

    • Add widget to specify labelmap geometry in segmentations. More details in r27288 commit message.

    • Improve loading of model node as segmentation. Default representation is set to closed surface, so no conversion to labelmap will happen. Reference geometry spacing is computed from extent of the model (to have approximately 250^3 voxel labelmap) instead of hardcoding to 1.0mm.

    • Add rotate to volume plane warning button to Segment editor. When slice views are not aligned with the internal labelmap representation stored in segmentation node, then a warning button is displayed to the user.

    • Simplify Segment editor automatic thresholding interface. No need to press “Set” button - when a method or options are changed, the threshold is set automatically.

    • Add automatic thresholding to Segment editor. Various methods (Otsu, Huang, Li, etc.) can be used in Segment Editor’s Threshold effect to set threshold value in a reproducible way.

    • Add function to reorder segments in segments table view. In context menu there are two new actions to move selected segment(s) up or down. This is available in the segments table view in both Segment Editor and the Segmentations module.

    • Always set segmentation nrrd file vector axis to “list” kind. When only a few segments were in the segmentation then axis kind was set to complex, RGB, RGBA, …, which was not meaningful and caused some nrrd readers to fail to read the image (see this discussion for an example https://discourse.itk.org/t/reading-segmentation-file-from-slicer-nrrd-with-multiple-segments-with-simpleitk-shows-exception/808/14).

    • Improve segment editor scissors outside fill/erase in slice mode. When positive/negative slice clip is enabled, outside fill/erase modified the segmentation on both sides of the slice plane. Improve the behavior so that only the selected side of the slice is filled/erased, because this is generally more useful behavior. If needed, the other side of the slice can be easily erased/filled with an additional scissor operation.

    • Add option to open folder after segmentation export is done.

    • Add Hollow effect to Segment Editor. See https://discourse.slicer.org/t/new-segment-editor-effect-for-creating-hollow-objects.

    • Allow loading STL files as segmentation node. See https://discourse.slicer.org/t/save-segmentation-directly-to-stl-or-obj-files/2428.

    • Add options in Data module to convert labelmap/model to segmentation.

    • Hide background segment after Grow from seeds effect. Determine whether a segment is background by checking corner voxel values (if 5 or more are non-zero, then background).

    • Add direct file export from segmentation. It allows to export segments (all or just visible) directly to STL or OBJ files. Segments may be exported to separate STL files or one merged file. OBJ files contain color and opacity information.

    • Do not reset view when Segmentation master node selected. User may have carefully set up view, so resetting it when switching to Segment Editor module would cause inconvenience.

    • Improve painting and erase effect: (1) Made painting/erasing in 3D view optional, (2) Added “smudge” option to paint effect: auto-select segment at click position, and (3) added option to erase in all segments.

    • Add median to Segmentation statistics module.

  • Python

    • Add slicer.util.arrayFromSegment helper function.
  • Performance

    • Prevent unnecessary memory allocation in vtkMRMLSegmentationNode::GenerateMergedLabelmap.

    • Improve rendering speed of transformed models and segmentations. For more details, read r27244 commit message.

  • Fixes

    • Fix scalar range in colormap exported from segmentation. When a segmentation node is exported to labelmap volume node, a color node is automatically created. When this colormap is used by volume rendering module, the colors are mapped using scalar range of the lookup table. By default the range was set to [0, 255], which resulted in incorrect mapping. Fixed range by setting it to [0, number of segments].

    • 0801966fd BUG: Fixed hiding of node selectors in qMRMLSegmentEditorWidge

    • Fix saving of color nodes of labelmaps exported from segmentation. Color nodes are hidden by default, but hidden nodes cannot be saved in .mrml files (only as .mrb). Updated exporting of segmentation nodes to labelmaps so that the created color nodes are now not hidden.

    • Fix segment jump slice position. While segment center IJK position is stored in a double because that is needed for computations, the values must an integer to make the center always in the middle of a voxel.

    • abd52b276 BUG: Fix small segment geometry widget issues. For more details, read r27304 commit message.

    • Make segment editor auto-threshold more robust. Added exception handling (Kittler-Illingworth method may throw exceptions). Temporarily removed Li method from the GUI (computation may crash).

    • Make late-registered effects show up in Segment editor. When Segment editor module was chosen to be startup module, effects provided in SegmentEditorExtraEffects extension did not show up.

    • Fix joint smoothing mode in segment editor effect.

    • Fix segment color in 3D when polydata has active array.

    • Fix crash in segment editor widget on scene close.

    • Fix loading of segment display properties from scene file.

    • Fix segmentation logic ExportAllSegmentsToModelHierarchy.

    • Fix new segment color after last segment has been removed.

    • Fix segmentation slice intersection update after transform change.

    • SegmentStatistics: Changing parameter set now update selected plugin list.

    • Fix normals in labelmap to surface conversion.

Simple Filters

  • Update SimpleITK version to v1.1.0

  • Avoid installing SimpleITK archive lib and reduce Slicer package size

Scene Views

  • Fix writing of scene view description to scene file keeping HTML tags.

  • Prevent crash when saving MRML scene with SceneView module is disabled.

  • Refactor scene views module to use Qt Widgets instead of a web widget.

Screen Capture

  • Allow frames-per-second specification as alternative to video length: this makes it easier to create videos from sequences that are played at original acquisition speed (e.g., X-ray fluoroscopy frames taken at particular FPS).

  • Allow using not visible master view: It is now possible to have a slice sweep and capture 3D view (master view is a slice node; capture all frames enabled; layout is 1-up 3D).

  • It is now possible to export a video that is playing the animation forward and backwards.

  • Animation can be repeated multiple times. This allows making very short (few-second) videos easier to view in players where continuous looped playback is not available (e.g., YouTube and some media players).

Transforms

  • Extend volume if non-linear transform is hardened: Voxel grid of the volume was not changed when non-linear transform was hardened on it, which could cause clipping of the volume. Now volume is automatically extended to contain the transformed volume.

  • Prevent re-registration of custom ITK transform types: Profiling indicated that it takes noticeable time to re-register when a large number of transform nodes are instantiated.

  • Fix transform hierarchy errors after scene load.

VectorToScalarVolume

  • Expand the module with two new options: (2) Extract a single component from any vector image, not only RGB and (3) Compute the average of all the components of the vector image. Existing option (1) allows computing the luminance from a RGB image.

Volumes

  • Fix crash if a volume with empty image data is exported by volumes logic. See https://discourse.slicer.org/t/convert-label-map-volume-into-a-scalarvolumenode/3550 and r27291 commit message.

  • Volumes module histogram:

    • Compute histogram only if needed: If Histogram section in Volumes module is not open then now the histogram is not computed to avoid unnecessary (and potentially lengthy) computation.

    • Updated bin count computation. For values with discrete values, number of values in range will be used as bin count (but max. 1000). For floating-point volumes bin count is always 1000.

  • Update CTK to prevent crash in ctkVTKVolumePropertyWidget

Volume Rendering

  • Features

    • Support Volume rendering of multiple volumes: Experimental multi-volume renderer allowing to correctly display multiple intermixed volumes. Note that is does not yet support shading.

    • Clipped surfaces are now smooth (looks the same as if the volume was cropped)

    • Improve volume rendering quality in “Adaptive” mode, and add new volume rendering quality option named “Normal”.

    • Improved volume rendering speed: GPU-accelerated volume rendering is now working on many more computers than before. Note that it requires OpenGL version 3.2 or higher.

    • Support configuring available GPU memory in both Application Settings and in Volume Rendering module.

    • Add CT-Air volume rendering preset: It can be used for visualizing regions that appear dark in the image, such as air or blood. Users have often trouble with volume rendering “inverted” images - where dark regions should be visible and bright regions should be hidden (showing airways, blood vessels, ventricles, etc.), but so far all the volume rendering presets are showing bright regions and hiding dark regions. Since creating an inverted transfer function requires a lot of clicking, this preset can be used as a basis and shifted or slightly tuned as needed.

    • Add volume rendering options to Application Settings.

  • API

    • Add ability to load custom volume rendering presets. See r27160 commit message.

    • Move volume rendering properties from display node to 3D view node. Note that this change breaks backwards compatibility in terms of loading a scene containing special volume rendering settings, so those settings will not be loaded correctly. For more details, read r27240 commit message.

  • Fixes

    • Apply volume rendering preset when re-selecting current preset.

    • Volume rendering image data modified update bug fix. Volume rendering now triggers rendering when underlying image data of a displayed volume node is modified.

    • Fix volume rendering ROI scene compatibility issue

    • Fix old bug with volume rendering preset selection when changing volume. When the rendered volume was changed, then the preset combobox selection stayed at the previous selection, but that selection was not applied. Because of this, many times the user had to change selection to something else than back. In addition it was confusing. Now the selected preset is remembered, and set when the volume changes.

    • Fix volume rendering preset range issue

    • Fix hang when volume rendering in one-up 3D view.

    • Fix disappearing volume rendering.

Removed Modules

  • Remove EMSegment modules and disable support for Tcl and associated python-tcl bridges.

  • Remove OpenIGTLink from Slicer core. Instead, OpenIGTLink modules are distributed in an extension. This allows more frequent updates with fixes and new features.

Extensions

The Slicer extensions manager enables Slicer users to install more than 100 extensions written and contributed by their peers from around the world.

New

  • DiffusionQC: This extension provides a quality-estimation algorithm for diffusion-weighted MRI gradient images, paired with an interactive, graphical review and approval tool. It identifies bad gradients by comparing distance of each gradient to a median line. The median line is obtained from KL divergences between consecutive slices. After above processing, it allows user to manually review each gradient: keep or discard them.

  • LesionSpotlight: This extension implements a modern image segmentation and enhancement approaches allowing to highlight abnormal white matter voxels in magnetic resonance images. It provides the following modules: LS Segmenter: specific for hyperintense Multiple Sclerosis lesion segmentation on T2-FLAIR images. It implements a hyperintense T2-FLAIR lesion segmentation based on a hybrid segmentation algorithm, published by Senra Filho, A.C. See http://dx.doi.org/10.1007/s11517-017-1747-2, LS Contrast Enhancement: specific to increase the contrast of abnormal voxels of the same T2-FLAIR images and AFT Segmenter: A simple implementation of another recent MS lesion segmentation algorithm based on the method described in Cabezas M. et al. See http://dx.doi.org/10.1016/j.cmpb.2014.04.006

  • OsteotomyPlanner: This extension is used for arranging, cutting and bending closed surface mesh models that represent bone structures. It is an an open source implementation of an open-source tool for osteotomy simulation. It can be used for the planning of surgical procedures and analysis of the resulting structures. The input models for this module would typically be generated by segmenting a CT/MRI/etc dataset. This pre-processing should also include registering the model to a fixed space, in order to allow for direct comparison with reference models.

  • PathReconstruction: This extension is used for creating 3D surface models of catheters from a spatially tracked wire (e.g. transform updated through SlicerOpenIGTLink). The user specifies which transform corresponds to the wire then records points along the length of the catheters. The main output is a pair of model nodes for each catheter - one model node for storing raw points, and one for storing a surface representation of the catheter.

  • PedicleScrewSimulator: This extension is used for pedicle screw insertion training.

  • RegQAExtension: This extension enables quality assurance (QA) for image registration. It can perform different test, both qualitative and quantitative to estimate registration quality. It can also create output files, which can serve as documentation for specific registration QA.

  • SNRMeasurement: This extension provides a command line module (CLI) allowing to calculate signal-to-nose ratio of MR images using “difference image” method.

  • Sandbox: This extension is a collection of utilities that are not polished implementations but can be useful to users. It provides the LineProfile module allowing to compute the intensity profile in an image along a line.

  • SegmentMesher: This extension is used for creating volumetric meshes from segmentation using Cleaver2 or TetGen. Cleaver2 mesher is freely usable, without any restrictions. TetGen mesher is only free for private, research, and educational use (see license for details).

  • ShapeRegressionExtension: This extension enables the computation and visualization of time-regressed shapes in a collection of 3D shape inputs associated to a linear variable. It provides two modules: RegressionComputation and RegressionVisualization.

  • SkeletalRepresentation: This extension provides modules to establish, refine and visualize skeletal representation model of an object. The skeletal representation is then used as a model for shape analysis.

  • SlicerCaseIterator: This extension provides a simple scripted module allowing to iterate through a set of cases defined in a csv-file. It’s purpose is to streamline the segmentation of image datasets by handling loading and saving.

  • SlicerCochlea: The cochlea is a very important part of the inner ear. It is responsible for the transfer of audio signals to the brain. There are two modules in this extension: Cochlea Registration module allowing to register and fuse cochlea images from different modalities and Cochlea Segmentation module allowing to segment out the cochlea structure, scala tympani and other scalae (media and vestibuli) and to measure the length and the size of the scala tympani. Both modules require a few seconds to complete the tasks. They use a customized set of parameters from the elastix toolbox itself based on Insight Toolkit (ITK).

  • SlicerFab: This extension is used for fabrication of physical objects. It supports a bitmap-based multimaterial 3D printing workflow for the rapid and highly accurate generation of physical models directly from volumetric data stacks. Learn more, reading From Improved Diagnostics to Presurgical Planning: High-Resolution Functionally Graded Multimaterial 3D Printing of Biomedical Tomographic Data Sets.

  • SlicerJupyter: This extension provides a Jupyter kernel, which allows running Jupyter notebooks in 3D Slicer. There are two options to run the notebooks: Option 1: Run using Binder, no installation or setup is needed, just click on this link and start using Slicer via Jupyter notebook in your web browser. Option 2: Run Slicer and Jupyter on your own computer after following these instructions.

  • SlicerLayoutButtons: This extension facilitates the selection/display of labels or foreground/background images for a specific slice view. The module panel consists of “colored” buttons that are arranged with the exact same layout as the current slice view layout used in 3D Slicer. Anytime the slice view layout changes, the module widget will adapt its layout and buttons so that those buttons “mirror” the exact same layout. Furthermore information are provided for each button about the currently selected label and background/foreground image for each corresponding slice view.

  • SlicerOpenIGTLink: This extension adds OpenIGTLink communication interface to 3D Slicer to exchange real-time imaging, tracking, and other data.

  • SlicerPETPhantomAnalysis: This extension is used for the Analysis of Uniform Cylinder Phantoms in PET scans. Quantitative verification of calibration and spatial homogeneity of PET scanners is an essential prerequisite for quantitative analysis of clinical PET scans. For this purpose uniform cylindrical phantoms are commonly utilized. The provided module enables automated analysis of produced PET scans.

  • SlicerProstateAblation: This extension was designed to support the workflow of the in-bore MRI-guided therapies. It was developed and tested to support transperineal prostate cryo-ablation procedures in the Advanced Multimodality Image Guided Operating (AMIGO) at the Brigham and Women’s Hospital, Boston. Its applicability to other types of procedures has not been evaluated. See also https://ncigt.org/prostate-biopsy.

  • SlicerVASST: This extension contains a number of modules developed by the VASST laboratory at the Robarts Research Institute. It provides access to RobartsVTK, a library for visualization and image processing. It provides the following modules: EpiGuide, a guidelet used to perform image guided navigation for epidural needle insertions. It requires a Plus connections to an image and tracking server, as well as a single element transducer server, NeoGuidance, a loadable module enabling surgical guidance for NeoChord surgical procedures.

  • SlicerVideoCameras: This extension is used for interacting and calibrating videoCameras using 3D Slicer streamed from a PlusServer. It provides the following modules: Intrinsic calibration: Assuming a pinhole model, this module discovers the camera parameters using a 6x9 checkerboard or 4x11 circle pattern image. Tracker registration: This module enables the registration of an external tracker marker attached to the camera and the camera coordinate system.

  • SlicerVirtualReality: This extension enables user to interact with the 3D scene using virtual reality. The extension works with all OpenVR-compatible headsets, such as HTC Vive, all Windows Mixed Reality headsets (by Acer, Lenovo, HP, etc.), and with Oculus Rift. See this YouTube video as well as this Kitware blog post for some more background and application examples.

  • SlicerWMA: This extension provides the WhiteMatterAnalysis clustering and tractography analysis python package and its dependencies installed within Slicer’s Python environment.

  • T2mapping: This extension can be used to create a T2 Map from a 4D multi-echo MRI.

  • TOMAAT: This extension allows to run deep learning based analysis of medical volumes through inference service deployed on the cloud via TOMAAT. Learn more at https://tomaat.readthedocs.io

  • VASSTAlgorithms: This extension contains a number of algorithms for algebra, geometry, registration, and other library functions. It is a dependency of SlicerVASST and SlicerVideoCameras extensions.

Improved

  • DSC_Analysis

  • MarkupsToModel: Added multiple new algorithms for generating approximating curves from markup point list.

  • PkModeling

  • QuantitativeReporting

  • SlicerDMRI

    • Interactive multi-tensor unscented Kalman filter tractography.

    • New white matter atlas publicly released.

    • New module templates for the Extension Wizard for DWI and tractography data.

    • New utility modules to extract DWI shells and downsample tractography.

    • Improvements to multishell DWI I/O, display speed, and general fixes.

  • SlicerElastix

  • SlicerIGT: Fiducial registration wizard module can match two fiducial lists even if points are missing or out of order.

  • SlicerRT

    • Improved RT structure set import stability

    • Added capability to use external beam dose engines defined in a separate extension

    • Dose volume histogram

      • Added Dose surface histogram feature

      • Use new Plots infrastructure: more interactive and responsive charts, improved data interoperability for DVH tables

    • Isodose

      • Can now handle different isodose level sets for different dose volumes

      • Numerous fixes around dose scalar bars