Version 4.5.0, released on 2026-07-23
Version 4.5, released on 2026-07-18
ImFusionLib
| Tags | Description |
| Fixed | Fixed a bug where TrackingOutStream would crash if the underlying connection was removed. |
| Changed Fixed | CameraRegistrationAlgorithm computes the stereo reprojection error on optimal pose pairs. |
| Fixed | Fixed GlImage texture readback on macOS for 3-channel internal formats (e.g. GL_RGB32F). The glGetTexImage fast path is now skipped on macOS for 3-channel textures, as Apple's Metal-backed GL driver returns corrupted slice data. The FBO + glReadPixels path is used instead, which correctly handles 3-channel formats. Added a regression test to SelectChannelsOperation that tests 3-channel operations to catch the readback-stride bug on macOS. |
| Fixed | Fixed ImageComparison algorithm to use the correct shift/scale when comparing images. |
| Added | Added OIT support for rendering semi-transparent MPR images in VolumeViews (GlSliceIndicator::RenderMode3d::ImageContent). |
| Fixed | Fixed a bug in the in-place mode of ExtractImagesFromVolumeAlgorithm where it was ignoring the configured axis and always extracting along Z. |
| Added | Added OtsuThresholdAlgorithm. It computes the Otsu threshold of an image and can either center the image intensities at that threshold or return a binary label mask. |
| Added | Extended NrrdIoAlgorithm to set LABEL modality and to attach a LabelDataComponent when the NRRD header defines a 3D Slicer's segmentation labelmap. |
| Fixed Changed | MeshToLabelMapAlgorithm does not accept multi-channel images anymore, is more robust to user-defined iso-values. |
| Fixed | Fixed ImageInpaintingAlgorithm GPU path failing with int inputs images. |
| Added | Added ImFusionLib_RESOURCE_DIR to ImFusionLibConfig.cmake. It points consumers of the SDK to the directory containing externally compiled resources. |
| Changed Deprecated | The cmake function imfusion_compile_resource_repository now supports one or more targets via the TARGETS argument. Deprecated TARGET in favor of TARGETS. |
| Changed API-Break Deprecation |
|
| Changed | Improved efficiency of image resampling on CPU |
| Fixed | Fixed potential int overflow in SplitChannelsAlgorithm for large images with many channels |
| Added | Added pixel-aligned cropping helper functions in ImageDescriptorUtils.h |
| Changed API-Break | SharedImageSet::get methods are no longer virtual. Derived classes should customize access by overriding the protected SharedImageSet::getSharedImpl() instead. |
| Added | Added SharedImage::cloneWithImage() to create a clone that uses a given image instead of copying from the source; metadata is still taken from the source according to clone options. |
| Fixed API-Break | Reverted an unintentional breaking parameter reorder in ConnectivityAnalysis::computeConnectedComponents(). |
| Fixed API-Break | Reverted an unintentional breaking parameter reorder in ConnectivityAnalysis::computeConnectedComponents(). |
| Added | Added an option to use the new OpenCVCuda library which has Cuda OpenCV support in addition to all functionalities of the regular OpenCV. |
| Changed API-Break | Moved BackgroundFrameExporter from IO to Stream and renamed class to BackgroundImageExporter. The class decouples the lifetime of the SharedImageSet used for initialization (and previously also for finalization) from the export task. As a consequence:
- addFrame now takes a SharedImage (with an optional GL::SyncObject) and the associated timestamp
- the signal imageSaved was removed without replacement
|
| Added | Added support for bilateral filtering in ImageView2D and GlSliceRendererImage. |
| Fixed |
|
| Added | Added method for conversion of DataItem to and from ByteBuffer with compression settings. |
| Added Deprecation | Added CompressionSettings to ImFusionFile to allow setting compression settings for specific data by name. Deprecated the legacy ImFusionFilePlugin::save method without CompressionSettings argument. Deprecated int-based compression mode in ImFusionFile and ImFusionImage. |
| Changed API-Break |
- Changed the signature of SharedImage synchronization functions from virtual to non-virtual.
- Changed the signature of CustomImage creation functions from MemImage to accept a smart pointer instead of a raw pointer.
|
| Changed |
|
| Added | Added support for retrieving a a variant of type images from a MemImage. |
| Added | LicenseManagerSDK now uses a more fitting interface on builds with the new licensing system |
ImFusionAnatomyPlugin
ImFusionCT
| Tags | Description |
| Added | Added FluoroFiducialDetectionAlgorithm to perform fiducial detection using OpenCV blob detection. Preprocesses frames by using either morphological operations or ML and thresholding. |
| Added | Added OpenCV point detection to GridBasedDistortionCorrection |
| Fixed | Fixed unexpectedly hidden p_transformation widget when switching to Detector reference while p_useIsoCenterParameters is enabled in the Transformation setup widget. Fixed crash caused by deletion on a never-created widget for p_transformation in RelativeTransformationSetupWrapper. |
| Added Changed Fixed | Added tests for ConeBeamMetadata (modern geometry methods and parameters, signal/slot wiring, copy/move semantics, selection support, generator switching). Changed generator removal behavior: removing the selected generator auto-selects the last one in the list of generators. Fixed move constructor and assignment operator so that signal connections are set up correctly. Fixed signal accumulation issue when switching generators or calling setParentData() repeatedly: disconnect from all generators first, then connect only the newly selected generator. Fixed p_generatorUsesSelection parameter to trigger the generator update path when changed. Fixed MotionModelGenerator::isEqual() to call Base::isEqual(rhs) for equality comparison. |
| Added Fixed | Added tests for conversion from legacy geometry to modern geometry. Fixed modern geometry generator installation for cases where legacy geometry uses per-frame iso-matrices and per-frame projection matrices. |
| Added | Added CArmCalibration to perform distortion correction and geometry calibration based on a bead phantom. |
| Added API-Break | Added support cone-beam geometry visualization to GeometryAlgorithm. Added support factory creating GeometryGenerators and compute FullGeometryRepresentation for non-image data cases. Added 'GeometryUtils::GeometryDescriptor' to construct a modern cone-beam geometry for non-image data cases. |
ImFusionCore
| Tags | Description |
| Changed | GL::StateGuard now supports face culling states. |
| Fixed Changed | Fixed a bug in GlobalSettings::remove() where it would ignore individual values added with storeValue(). Changed Properties::removeParam() to return a boolean indicating whether the parameter was successfully removed. |
| Added | Introduced PolymorphicSubProperty, a specialization of SubProperty that supports polymorphic types in SubProperties, including default creation and copy-ability. |
| Fixed | LicenseSpringClient now implicitly activates a valid but inactive local license when doing the regular license check. |
| Changed | EGL is now supported in all configurations in Linux. By default GLX will be used with EGL as a fallback. The IMFUSION_GL_BACKEND environment variable can be used to enforce a backend (either 'glx' or 'egl'). To use the GL::ContextGLX and GL::ContextEGL classes directly, an application must link against ImFusionGLX or ImFusionEGL now. |
| Added | Added the Threading::Protected class, a convenience helper class to wrap a payload with a std::mutex for thread-safe access to shared variables. |
| Added | Added Container::SmallVector, a small-buffer-optimized variant of std::vector that stores up to N elements without heap allocation. Typical use cases are temporary working sets, per-frame buffers, or collections built in tight loops where avoiding frequent heap allocations improves performance. |
| Fixed | Fixed a bug in variant_alternative for Utils::Variant |
ImFusionCranialPlugin
| Tags | Description |
| Fixed | Fixed HypothalamusSegmentationAlgorithm on macOS by running the axial HypVINN model on CPU instead of the MPS backend, avoiding MPS-specific numerical differences. |
| Changed | Model upgrade and change of the latest model set version to "2026.v5" and addition of model set version "2026.v4". Changes related to the upgrade from set version "2026.v3" is an improved model for VesselSegmentationAlgorithm. Changes related to the upgrade from set version "2026.v4" is an improved model for VesselSegmentationAlgorithm for CTA, MRA and T1CE images. |
| Added | Added MultiVolumeRegistrationAlgorithm to coregister multiple images to a reference image. |
| Added | Added algorithm to detect the anterior and posterior commissures (AC/PC). Additionaly, the algorithm can determine a normalized orthogonal coordinate system where:
- the yAxis follows the anterior-posterior direction in the midsagittal plane
- the zAxis follows the inferior-superior direction in the midsagittal plane
- the xAxis follows the left-right direction
|
| Added | Added contrast-dropout confidence estimation to TumorSegmentationAlgorithm and multi-view consistenty estimation to FastSurferSegmentationAlgorithm. |
| Changed | Model upgrade and change of the latest model set version to "2026.v3". Change relative to the previous model set version "2026.v2" is the upgrade of the SkullStrip model used in the following algorithms: SkullStrippingAlgorithm, VesselSegmentationAlgorithm, TumorSegmentationAlgorithm, This is a breaking change for the affected algorithms and models. Old models can be used by setting the model set version to "2026.v2". |
| Changed | Model upgrade and change of the latest model set version to "2026.v2". Changes relative to the previous model set version "2026.v1" are improved sampling logic for models used in the following algorithms: SkullStrippingAlgorithm, VesselSegmentationAlgorithm, TumorSegmentationAlgorithm, CT-SkullSegmentationAlgorithm, MRISequenceClassificationAlgorithm. This is a breaking change for the affected algorithms and models. Old models can be used by setting the model set version to "2026.v1". |
ImFusionDicom
| Tags | Description |
| Fixed | Fixed C-STORE not returning false when the server returns an error. |
ImFusionGL
| Tags | Description |
| Fixed | Increased numeric precision/threshold of GL::OffscreenRenderHelper, avoiding clipping small alpha values in ColorPostProcessing::DivideBySqrtAlpha mode. |
ImFusionGraph
ImFusionLiveUS
| Tags | Description |
| Changed API-Break | Moved the following classes from the ImFusionLiveUSExp module to the ImFusionLiveUS module: VirtualImagingAlgorithm VirtualImagingStream |
| Changed API-Break | Consolidated the build configuration space of the LiveUS module. Now the module is always built with support for the Reg module. |
ImFusionML
| Tags | Description |
| Fixed | Fixed GammaOperationOperation producing NaN images when receiving constant-valued inputs. RandomLinearIntensityMappingOperation warns and skips if input is not finite. |
| Added Changed | Registered UnmarkAsTargetOperation as operation. |
| Added | Added a new operation called SequenceOperation, which wraps OperationsSequence and enables grouping and sequential execution of multiple operations. |
| Added Deprecation | Exposed the DataElement::CloneOptions enum to the Python bindings as imfusion.machinelearning.DataElement.CloneOptions, and changed DataElement.clone and DataItem.clone to take an opt: CloneOptions argument (defaulting to CloneOptions.EVERYTHING, so clone() keeps producing a full deep copy). This allows performing shallow clones (CloneOptions.SHALLOW) from Python, where image and vector data is shared with the original element while keypoints and bounding boxes are still deep copied. The legacy clone(with_data=...) overload is deprecated; it still works but now emits a DeprecationWarning. Migrate clone(with_data=True) to clone(opt=CloneOptions.EVERYTHING) and clone(with_data=False) to clone(opt=CloneOptions.CONTAINER) (for DataElement) or clone(opt=CloneOptions.NO_IMAGE_DATA) (for DataItem). |
| Added | Added equalize_label_classes parameter to ML::OrientedROISampler. When enabled together with sample_from_labels_proportion and a Modality::LABEL target, target-guided ROI centers are drawn with class-balanced sampling: a present label value is first picked uniformly at random and then a voxel of that class uniformly at random, so small and large structures are centered with equal probability (useful for training on imbalanced multi-class segmentations). Defaults to False to preserve the previous class-agnostic foreground sampling behaviour. |
| Fixed | Fixed missing header for KeepLargestComponentOperation in installer. |
| Fix | Fixed bug in LocalConvolutionalNetworkAlgorithm when an invalid target dimension with 0 value is passed. |
| Changed | The Python GIL lock is now released in the next binding for Dataset, allowing the use of Python scripts with prefetching and other DataLoaders. |
| Added | Added the possibility to fetch tags in a labels_project as VectorElement data type through the section tags (similarly to what happens already with layers). |
| Added | Added ML::ChannelDropoutOperation which sets specified input channels to zero while keeping all other channels unchanged. Added ML::RandomChannelDropoutOperation which randomly drops out channels with a configurable per-channel probability. |
| Added | Added processVectors to MakeFloatOperation. |
| Added | Added processVectors to SetModalityOperation. |
| Fixed | Fixed AddRandomNoiseOperation which was always generating the same noise pattern for non-gamma types. |
| Fixed | Bugfix: In the setter of DataElement::content Python bindings the input type was checked repeatedly against SISBasedElement instead of checking also against all the other classes derived by DataElement. |
| Fixed | Fixed CacheDataLoader discarding its partial cache on every reset() when lazy caching was used and the dataset was not fully consumed (e.g. due to max_iter_per_epoch). The loader now preserves partially filled lazy caches across resets, so cached items are served from memory on subsequent epochs instead of being reloaded from the underlying pipeline. |
| Fixed | Fixed a crash in PersistentCacheDataLoader when reload_from_disk is enabled but the cache folder is empty (e.g. on the very first run). Instead of throwing an exception, the loader now logs a warning and populates the cache from scratch, so reload_from_disk: True can be set from the start without needing a first run with reload_from_disk: False. |
| Changed Deprecation | Changed CacheDataLoader and PersistentCacheDataLoader to use the new DataItem serialization API for compression, removing their own custom ZSTD logic. Both loaders now accept a DataItemCompressionMode enum (None, LabelsOnly, All) instead of the old bool / int compressionLevel parameters. LabelsOnly compresses semantic segmentation label maps (Modality::LABEL) with ZSTD while leaving other fields uncompressed; All applies ZSTD to every field. The default for PersistentCacheDataLoader changed from no compression to LabelsOnly. ZSTD is preferred over LTE for deserialization speed. The old int compressionLevel constructor of CacheDataLoader and the old bool compression constructor of PersistentCacheDataLoader are deprecated; use the DataItemCompressionMode overloads instead. Dataset::memoryCache and Dataset::diskCache (and their Python equivalents Dataset.memory_cache / Dataset.disk_cache) accept a compression string argument ("None", "LabelsOnly", "All") in place of the old numeric or boolean compression parameters. |
| Changed | Bugfix: When the SplitIntoPatches operation was used on an image that is smaller than the patch overlap in any dimension; it returned the original image. This would then make a regular UNet fail and output nothing, as they require specific sized inputs. This is only applicable for models that use SplitIntoPatches explicitly. |
| Added | Added apply_to parameter to RunModelOperation. |
| Added | Added a shallowCopy option to CacheDataLoader (and Dataset::memoryCache / Dataset.memory_cache in Python). When enabled, the loader returns items that share the underlying DataElement objects with the internal cache instead of performing a deep copy, reducing per-fetch allocation overhead. The option is off by default because modifying the returned item in-place will modify the cache; only enable it when the downstream pipeline is guaranteed to be read-only with respect to the cache data. The flag is silently ignored when compressionLevel > 0, since decompression must write new pixel data into the cached DataElements. |
| Changed | Changed RemoveOperation constructor's parameter name from source to apply_to. |
| Added Changed | Added move semantics to MachineLearningModel::predict. When using move semantics, a deep copy of the input data is avoided; note that is the preprocessing alters this data in-place your input can be altered. It is up to the user to ensure proper use of this functionality. Added ImageDescriptorDataComponent to pass ImageDescriptors to be used in Operations. Changed DataItem::fields: it now returns a unordered_set of fields directly instead of an optional. Previously an empty optional meant all fields should be considered; now the function takes care of that for you. |
| Changed | Optimized CPU path of ArgMaxOperation using vectorization and OpenMP parallelization. OperationsSequenceAlgorithm now uses shallow copies for operations that don't modify input. |
| Fixed Deprecation | Fixed splitting not being applied for 2D data when using the V2 engine. Added MachineLearningModel::mustSplitImage() which correctly handles both V1 and V2 engine split configurations. Deprecated ModelConfiguration::mustSplitImage() in favor of MachineLearningModel::mustSplitImage(). |
| Added | Added helper functions CudaUtils::supportsFP16 and CudaUtils::supportsBFloat16 to check runtime compatibility with FP16 (resp. BFloat16) computation. |
| Fixed | Fixed default label value not being taken into account in ReplaceLabelsValuesOperation. |
| Changed | Improved runtime of Softmax CPU path by reducing expensive exp() calls, added OpenMP conditional for small inputs, and usage of Eigen::Map with row-major layout for better memory access patterns and potential SIMD vectorization by the compiler. Removed dead code. |
ImFusionNDI
| Tags | Description |
| Added Changed API-Break | Refactored NDI Polaris Vega tracking support and extended it with optical marker management:
- [Added] NDIPolarisTrackingStream is a dedicated concrete class for network-connected optical tracking.
- [API-Break] NDIPolarisTrackingStream is no longer a type alias for PolarisAuroraTrackingStream<NDISystemType::PolarisVega>.
- [Added] NDIPolarisTrackingStream now implements the OpticalTrackingInterface, enabling marker management via addTrackingMarker(), trackingMarker(), and removeTrackingMarker(). Instruments registered via registerTool() or addTrackingMarker() are visible in the instrument table immediately, before the stream is opened.
- [Added] New addTrackingMarker(filepath, name) method replacing the NDITrackingInstrumentInfo-based registerTool() overload.
- [Changed] NDIPolarisTrackingStream is now controlled by the generic OpticalTrackingStreamController from the Navigation plugin.
- [API-Break] Removed isInitialized() from NDITrackingStream and all derived classes. To check whether a stream connection is established, use stream.currentState() and verify that the state is not Closed, Closing, or Opening.
- [API-Break] Removed the deprecated uuid() overrides from all NDI stream classes.
- [API-Break] Deprecated registerTool(const NDITrackingInstrumentInfo&). Use addTrackingMarker(filepath, name) instead.
|
ImFusionNavigation
| Tags | Description |
| Added | Added OpticalTrackingMarkerDesignAlgorithm for designing optical tracking markers and evaluating their expected tracking precision. The algorithm allows configuring marker geometry (fiducial positions and a tip/target point in marker-local coordinates) and runs a Monte-Carlo simulation to estimate angular and positional error at the tip. |
| Added | Added abstract OpticalTrackingInterface for optical tracking systems providing methods to add, retrieve, and optionally remove OpticalTrackingMarker instances from a tracking system. It exposes additional Capabilities flags for optional hardware features such as marker removal (Capabilities::RemoveMarker) and per-fiducial position reporting (Capabilities::IndividualFiducials). Added OpticalTrackingStreamController for a TrackingStream also implementing OpticalTrackingInterface. It provides a marker management UI with a tracking instrument table, load-from-file support, marker creation, geometry optimization, and removal actions depending on the Capabilities flags. |
ImFusionPython
| Tags | Description |
| Fixed | Fixed PythonInterpreter::gil_scoped_release() crashing when the thread did not hold the GIL. |
| Fixed | Fixed ABI incompatibility related to ApplicationController (imfusion.app) between Suite compiled on Ubuntu 24.04 and Python SDK compiled on Ubuntu 22.04. |
| Changed Fixed | The Python interpreter in the PythonPlugin now releases the GIL after initialization. This prevents python code executed outside the main thread from starving. |
ImFusionSeg
| Tags | Description |
| Fix | Fix bug where mask was ignored in LabelToMeshAlgorithm if used in combination with closeHolesAtImageBoundaries |
| Fix | Removed depedency with ML introduced in LabelToMeshTest.cpp. |
| Fixed | Fixed LabelPainter (and therefore Brush) painting into multiple slices even with the 2D option enabled. This only happenend when the data had a rotation of 90 degrees in at least one dimension and a non-isotropic spacing. |
| Changed | Removed MeshProcessing::Cleaning::mergeCloseVertices from LabelToMeshAlgorithm::extractMesh. |
ImFusionSpinePlugin
| Tags | Description |
| Fixed | Fixed crash when clicking the Add Vertebra button twice. |
| Fixed | Fixed issue where during DeformableSpineSpineRegistration::compute discs were not being propagated correctly. |
ImFusionStream
| Tags | Description |
| Changed API-Break | Changed LiveStreamProcessingAlgorithm: removed createCompatible and inlined it in the two derived classes. Made onNewStreamData protected, dropped an initial wait for 100 ms in stopProcessingThread before querying the future status. Removed signalTrackingArrived, and added accessors for useDeviceTimestamps, imageBufferSize, and trackingBufferSize. |
| Fixed | Fixed a Boost 1.90 deprecation warning in UDPSession by switching from boost::asio::deadline_timer to boost::asio::system_timer and from expires_from_now to expires_after. |
| Added | Added TaskManager class for scheduling work on a thread pool, managing existing futures, and collecting results by task ID. Useful for parallelizing batch operations such as loading or processing multiple data items concurrently or for keeping track of diverse async tasks in a multi-threaded environment, while retaining easy access to individual results. |
| Removed API-Break | Removed BasicProcessingStream and BasicProcessingStreamAlgorithm classes as they are superseded by StreamAlgorithmExecutor. The BasicProcessingStream only supported image rotation (0°, 90°, 180°, 270°), which can be achieved more flexibly using StreamAlgorithmExecutor executing the Base.BasicImageProcessing algorithm ("Basic Processing"). |
ImFusionUS
| Tags | Description |
| Changed API-Break | Consolidated the build configuration space of the US module. Now the module is built with one of three feature levels: Minimal, Default, and Full. Builds with the Minimal feature level require only the Dicom module. Builds with the Default feature level add the functionality that requires the Reg, Seg, and OpenCL modules on top of Minimal. Builds with the Full feature level add the functionality that requires the ML module on top of Default. |
| Added Changed Fixed | Added a fragment shader path for the inverse pass of ScanConversion3D so that cartesian-to-scanline conversion can run on GPUs without compute shader support; Fixed the forward fragment shader to produce results consistent with the compute shader, aside from differences due to rounding. |
| Changed Fixed | Fixed FreehandUSFileIoAlgorithm: it is now possible to import Plus data in .mhd format. |
| API-Break | SliceToVolumeRegistrationController now creates and holds a SweepTrackingProperties instead of the deprecated SweepProperties. Its method setSweepProperties has been replaced by setSweepTrackingProperties |
| Added | Added US::Geometry3DDetectionAlgorithm to create US::FrameGeometry3D from an ultrasound volume |
| API-Break | Changed ScanConversion to use the frame geometry and/or the ultrasound metadata component in the image. Methods that set it up, like setCurvedGeometry, have been removed. Removed setUseGPU because algorithm always works on GPU. |
ImFusionVision
| Tags | Description |
| Added | Added support of OpenCV 4.12:
- Addressed change of the coordinate system.
- Addressed change in the Charuco pattern for even number of rows.
|
Version 4.4, released on 2026-01-30
ImFusionLib
| Tags | Description |
| Added Fixed |
- Extended computeCameraPose to support arbitrarily oriented planar targets.
- Prevented the computation of camera poses with negative target depth.
- Prevented out-of-bounds access in computeCameraPose.
|
| Changed |
- Added: Mesh splitting based on vertex or face labels, with the following options:
- Keep only triangles with a specified face label.
- Keep only triangles where all vertices have a specified vertex label.
- Keep only triangles where any vertex has a specified vertex label.
- Using an auxiliary label image, keep triangles where all vertices sample the specified label.
- Using an auxiliary label image, keep triangles where any vertex samples the specified label.
|
| Changed | Added CPU fallback implementation to GraphToLabelMapAlgorithm for systems without OpenGL 4.3 support. The algorithm now automatically selects GPU or CPU execution based on available hardware. |
| Fixed | Made NIFTI file loading more robust against ill-formed inputs. |
| Fixed | Fixed that InteractiveOverlay::setOverlay() did not have any effect. |
| Removed | Removed VideoCameraStreamOpenCV and VideoUrlIoAlgorithm classes. |
| Changed | Implemented non-linear refinement in ProjectiveGeometry::triangulatePoint. The feature is disabled by default, so previous behaviour is preserved. |
| Fixed | Fixed Math::findPrincipalComponents to use correct covariance matrix normalization. |
| Changed |
|
| Fixed | Corrected volume bounds used for forward ScanConversion3D and FrameFromVolumeOperation in pyramid mode to ensure the geometry is not cropped for beamStartDepth > 0. |
| Added | A new enum mode 'Parametric' was added to ImageRegistration::TransformationModel, together with the corresponding registration class 'OtherParametricDeformableRegistration', for the scenarios where any existing parametric deformation is to be optimized during image registration. This used to be a hidden feature of the 'TPS' mode (the old behavior is kept for backwards compatibility). |
| Added | MarkerHandEyeCalibrationAlgorithm: optimize marker board scale using stereo reprojection. |
| Added | MarkerHandEyeCalibrationAlgorithm: optimize marker board scale using stereo reprojection. |
| Fixed | LambdaEventHandler::handleInputEvent now correctly checks if the input view is of type GlCurvedView. |
| Added | Enabled plane clipping of Point Clouds in 3D views. |
| Added | Added TagStoreDataComponent to allow storing DICOM tags in Data. |
| Added | Added handling of stereo images to MarkerHandEyeCalibrationAlgorithm. |
| Added | Added handling of stereo images to MarkerHandEyeCalibrationAlgorithm. |
| Fixed Changed | Fixed MetaImage filename handling to preserve dots in raw data file names. |
| Added | Moved algorithms of general interest in Vision from RGBD to the Vision Plugin(DepthColorWarping, DepthMapToMeshAlgorithm, DepthMapToPointCloudAlgorithm, ...). Algorithms mainly can be used for projection between depth and color coordinate systems, texturing, registration, view synthesis from mesh, object to pointcloud fitting or object pose related tasks. RGBDDataComponent temporarily also remains in Vision now. |
| Added | Added forceCannotLoad flag to IoAlgorithm to allow disabling individual IoAlgorithms in the settings. |
| Added | Added GUI::Display::hideData() and GUI::Display::removeObject() member functions that enable you to conveniently remove a dataset or GlObject from all views it is potentially registered with. |
| Changed | Changed behavior of Framework::defaultLicenseInitFunction() if no active license exists, to first try to activate with the key in environment variable IMFUSION_LICENSE_KEY and if that is not set it will try to migrate a legacy license if one is available on the system. |
| Added | Added an alternative render path to GlVolumeRendererGlobalIllum that works also with OpenGL ES. You can use this renderer now also on MacOS and in the Web SDK. The shadowing behavior has slightly changed as a result. |
| Fixed | Fixed NiftiIO failing to load large files exceeding the 32bit address space. |
| Fixed | Fixed wrong timing of focus indicator and selection box in GlVitalsOverlay. |
| Added Changed Removed | Removed dependency on connexe library from ConnectivityAnalysis by providing own implementation. Removed unused hysteresisThresholding function. |
| Changed Added | Changed UltrasoundRegistrationAlgorithm::WeightingMode to a bitmask enum. Bumped Workspace to new version and added conversion for WeightingMode to bitmask enum. Added option to combine multiple weighting modes in UltrasoundRegistrationAlgorithm. |
ImFusionAnatomyPlugin
| Tags | Description |
| Changed | Removed deprecated variable p_identifiers and related code blocks from AnatomyPlugin/ASCRegistration.h/cpp. |
| Changed | Removed the deprecated KeyValueStoreDisplayHelper.h file. |
| Changed | Changed module name in factories to "Anatomy" from "AnatomyPlugin". |
| Fixed | Fixed a bug with ACRegistration::refine() where global matrices were extracted incorrectly. |
| Changed | AnatomicalStructureProcessing::ConvertToMultiLabelMap no longer considers images when creating a label map. All meshes are now considered if only an identifier is provided; to select only specific meshes, use the new identifier/key name syntax (e.g. "L3/ImFusion.Segmentation"). |
| Changed | ImFusionFiles from when ASCDisplayOptions was still called SpineDataDisplayOptions are now loaded to include the default spine plugin style sheet. |
ImFusionCT
| Tags | Description |
| Added | Added suppport new geometry for 2D/3D registration. |
| Fixed | Fixed index error in GeometryUtils::frameGeometryFromOpenCVMatrixComponents that occured for non-uniform detector spacing. Updated corresponding test to use non-uniform detector spacing. |
| Added | Added compatibility layer for fan-beam geometry. Added fan-beam support for new projectors. Added new geometry support for Utils::project |
| Added Fixed | Added support visualization of the new geometry and curved detector for non-image data case. Fixed missing detector border in geometry visualization. |
| Added Fixed | Integrated geometry presets into SpectralXRaySimulation, based on the approach used in the legacy ConeBeamSimulation. Implemented geometry presets in ConeBeamSimulationGeometryPresets.cpp. Updated SpectralXRaySimulation to move the simulation geometry onto the center of the input CT volume. Ensured that ConeBeamMetadata::p_reconSize and ConeBeamMetadata::p_intensityMode are set for the output cone-beam data in SpectralXRaySimulation. Incorporated detector spacing effects into the forward projection calculations. |
| Fixed | Fixed the copy constructor and assignment operator of ConeBeamMetadata to copy the generators' IDs. |
| Added | Added support new geometry and projection matrices loader to SpectralXRaySimulation. |
| Added | Added Poisson noise simulation to polychromatic simulation. |
| Added Deprecation API-Break | Added monochromatic mode in addition to polychromatic mode in SpectralXRaySimulation. |
| Fixed Changed | In ProjectionMatrixIoAlgorithm, introduced parameters p_width, p_height, and p_frames for configuration. Changed the constructors of ProjectionMatrixIoAlgorithm accordingly. Projection coordinate space and flip direction are now shown only for OpenCV matrix serialization format. For cone-beam data, width, height, and pixel spacing parameters are set with respect to each projection frame; for legacy/modern geometry, these parameters are set with respect to user-defined values. |
| Added | Added controller tests and widget lookup helpers to TestUtils.. |
| Added | Added polychromatic simulation including:
- Mesh support
- Functionality to read / generate realistic x-ray spectra
- Functionality to read x-ray attenuation coefficients
|
ImFusionCore
| Tags | Description |
| Added | Extend SubPropertyList API to match std::vector behavior (begin/end, cbegin/cend, back/clear, erase range). |
| Added | Added an insert method to the SubPropertyList class, allowing insertion of a new value at a given position. |
| Added Deprecation | Overhaul of the assertion library, which now provides two different types of assertions: "debug assertions" and "contract assertions":
- Contract assertions are new and defined via the IMFUSION_CONTRACT_ASSERT macro. They are always enabled and abort execution by throwing a Assert::ContractViolation exception if the condition is not satisfied.
- The already existing type of assertions is now called debug assertions. The IMFUSION_ASSERT macro has been renamed to IMFUSION_DEBUG_ASSERT. The functionality remains the same.
- Global assert-handling functions were renamed to follow a consistent naming scheme. The old names are deprecated and will be removed in the future.
|
| Added | Added methods to Properties for setting an individual parameter attribute. |
| Added | Added Platform::isDebuggerPresent, a cross-platform utility to detect is the program is running under a debugger |
| Added | Added Container::SparseArray, a sparse paged array for memory-efficient storage of sparse data. |
| Added | Added support for defining a custom date/time format in Log::Sink. |
| Added | Added support for Echo modes on StringParams through password attribute. This allow to supress or obsucre the text in the StringParams. |
| Added Removed | Removed Python 3.9 from the supported versions. Added Python 3.13 and 3.14 to the supported versions. |
| Added | Added setDebouncing and isDebouncing to Signals without payload types, which allows combining multiple emits into a single one. |
| Added Deprecation API-Break | Introduced a new plugin architecture that deprecates the existing plugin infrastructure:
- The ImFusionPlugin interface has been deprecated. It has been replaced with the new PluginBase base interface in ImFusionCore providing generic plugin functionality and metadata, as well as the more specialized ImFusionLibPlugin interface providing extra API and helper functions for usage with ImFusionLib and ApplicationController.
- All plugin-related functions in the Framework namespace have been deprecated. The corresponding functionality has been moved to the new PluginManager singleton in ImFusionCore.
- Plugins now have a descriptor with metadata about supported host applications, versions, build types. This allows for detecting incompatible plugins early.
- Plugins can define other plugins as dependencies. If a dependency is not met the plugin initialization will fail
- Two-step initialization: The loading of the plugin shared library and the initialization of the plugin (e.g. populate factories) has been split into two separate steps.
- Added extra functionality such as auto-registration of plugins if a host application links against it and the OS implicitly loads the library, and duplicate detection to avoid loading 2 different copies of the same plugin.
See Plugin Architecture for more details on the new architecture and ImFusionPlugin Migration for migration instructions.
|
ImFusionCranialPlugin
ImFusionDicom
| Tags | Description |
| Added | Added optional support for C-GET as an alternative to C-MOVE for downloading DICOM datasets from PACS in DicomPacsCommunication. C-GET can be enabled in the DICOM settings UI or in DicomPluginSettings on a per server basis. By default, C-MOVE will be used. |
ImFusionGL
ImFusionGraph
| Tags | Description |
| Fixed |
|
| Added Changed |
- Added GraphUtils::findLeafNodes to find leaf nodes in a graph.
- Added Graph::degree to compute the degree of a node in a graph.
- Changed enum GraphMatrixUtils::Degree to Graph::DegreeType.
|
| Added |
- Add GraphUtils::shortestGeometricPath to compute shortest path based on edge lengths.
|
| Fixed Changed |
|
| Fixed |
|
ImFusionML
| Tags | Description |
| Fixed Changed | MatrixBasedOperation now correctly collects and uses matrices from all ImageElements in a DataItem, instead of assuming all elements have the same matrices and only storing those from the first element. The operation now maintains a per-element cache of matrices that is used during processing, ensuring each ImageElement is transformed using its own matrices. RectifyRotationOperation now validates that all ImageElements have identical matrices to ensure spatial correspondence is maintained after rectification. |
| API-Break Removed | Removed old imfusion.machinelearning.AbstractOperation interface from the Python bindings - use imfusion.machinelearning.Operation directly. |
| Fixed | Compute Metric algorithm no longer loses data selections on UI refresh with the same metric type. |
| Added | Added FillLabelMapHolesOperation to fill holes in label maps. |
| Fixed | Fixed import and export of BoundingBoxSet. |
| Changed | Added num_item_repetitions to ``RandomizeDataLoader. This allows to repeatedly output data items in the DataLoader to improve data throughput. |
| Added | Added multiclass support to KeepLargestComponentOperation via the new multiclass parameter. When enabled, the operation binarizes the entire multi-label input, applies connected component filtering to the binary mask, and then uses the filtered mask to preserve only the original class labels that belong to kept components. This allows filtering small components while preserving multi-class segmentation labels. |
| Fixed | Bugfix: Torch python engine now preserves is_metric flag specified by the reference image. Bugfix: Python engines can now also output VectorElements and not only ImageElements.
|
| Fixed | Repeated visibility toggling of underlying data objects in data item now does not crash, because data item's display handler hide and show methods now do not call setVisibleData (which in its turns calls hide/show methods of each underlying object which causes recursion). Toggling ML.DataItem visibility now correctly toggles visibility of all underlying objects. |
| Changed | Dice metric now computes the Dice score for all labels present in the images as well as their LabelDataComponents. Labels that are not present in the ground truth nor prediction are deemed to be correctly segmented and will return a Dice score of 1. |
| Fixed | Tensor::numElements() now correctly returns 0 for empty tensors instead of 1. This allows for proper handling of empty TensorSetElement objects, such as when passing empty queries to warm up a model cache. |
| Changed | RandomOperation now prefers ImageElements over other element types when selecting an element for randomization. The selection logic first tries to find a non-target ImageElement, then falls back to any non-target element, and finally uses the first element if no non-target elements are available. If apply_to is specified, only these fields will be considered during these checks. |
| Changed API-Break | PreprocessDataLoader and SampleDataLoader don't offer a numParallelCalls in their constructors/configuration options anymore, for thread-safety reasons. Similarly the imfusion.machinelearning.Dataset.preprocess and imfusion.machinelearning.Dataset.sample functions don't offer the parameter num_parallel_calls anymore. |
| Changed Fixed | Fixed boundary calculation in LocalizeSegmentAlgorithm, preventing one-sided extended boundary beyond what is desired. |
| Changed | KeypointSetIoAlgorithm used to try loading KeypointSet and BoundingBoxSet as XML then JSON if the input file did not have any extension, which was leading to spurious error messages. Now it only tries the JSON format (XML is still supported, as long as the name has the xml extension). |
| Added | Added RandomizeDataLoader. This adds a DataLoader that keeps a local buffer of DataItems and randomly samples from them. Unlike the ShuffleDataLoader, it keeps the buffer filled and therefore reduces latency and decreases correlation. |
| API-Break Changed | Renamed all operations parameters to follow the guidelines: p_ prefix instead of m_ and public visibility. |
| Added Changed | Engine class can now load model artifacts from resource repositories via the newly introduced function Engine::loadModelArtifact. |
| Fixed | AddDegradedLabelsAsChannelsOperation now correctly handles active fields. |
ImFusionPython
| Tags | Description |
| Added | The PythonConsoleWidget now supports Ctrl+MouseWheel actions to increase or decrease the font size of its text. |
| Added Removed | Removed Python 3.9 from the production build versions. Added Python 3.13 and 3.14 to the production build versions. |
| Added Changed Fixed | The PythonConsoleWidget now supports multiline paste, history and cursor movement. The PythonConsoleWidget font has now fixed pitch. |
| API-Break Changed Added | Not strictly an API break but a major breaking change in how we build and distribute the Python SDK. All plugin bindings binaries are now individually packaged (imfusion-sdk-<plugin>). These packages contain only the bindings binary + other Python files. The ImFusionLib plugin and its dynamic dependencies are now also packaged separately (libimfusion(-<plugin>)). After building, all packages are installed into the build python_venv. Setting PYTHONPATH does not work anymore. Use python_venv instead or install the packages into a venv of your choice via python3 (<build>/<install>)/python/install_imfusion_sdk.py (-e). |
ImFusionRGBD
| Tags | Description |
| Added | Added a GlPointCloudRGBD, which is a GlObject that can be added to standard views. Deprecated GlPointCloudView and Interaction3D. A standard ImageView3D and InteractionView3D with GlPointCloudRGBD should be used instead. |
| Added | Added a SyntheticRGBDStream, which allows to simulate a real stream by using a supplied mesh, camera settings and poses either from the TrackingSequence or from the TrackingStream. |
| Changed | Updated to using the new plugin infrastructure. |
ImFusionReg
| Tags | Description |
| Added Changed API-Break | DeformableIcp:
- Use halved weight for bidirectional correspondence mode to yield the same rigidity as with unidirectional mode when using the same lambda.
- Made nearestNeighborDirectionPerRegion and weightPerRegion configurable.
- stoppingLogLambda (now: -4, before: -10) is now used as default stopping criterion instead of stoppingRelRmse (now: 0, before: 1%).
- Moved relaxationLogLambda, stoppingRelRmse, stoppingRelRmseDiff, maxIter, conjGradTolerance and conjGradMaxIterations to sub-property "advanced".
- Renamed NearestNeighborDirection to CorrespondenceMode with more intuitive names for its options.
|
ImFusionSeg
| Tags | Description |
| Fixed | Fixed potential segfault/dangling pointer in display when disabling/destructing a Seg::Brush after the input image has already been removed from the underlying views. |
ImFusionSpinePlugin
| Tags | Description |
| Added | Added new CT Spine Model Set 'ImFusion Standard v2025.Q4'. |
| Added API-Break Fixed | Added the VertebraUtils::vertebraStringToLabel helper function. Added, in the Python bindings, the following vertebra helper functions: vertebra_label_to_string, vertebra_string_to_label, vertebra_type_offset. In the Python bindings, VertebraType members are now uppercase. Fixed that, in the Python bindings, VertebraType was missing the SACRAL vertebra type. |
ImFusionStream
| Tags | Description |
| Added | Added multicast support for UDP communication |
| Added | Added ThreadSafeQueue: wrapper around std::queue for concurrent access |
| Removed API-Break | Removed OfflineStream interface without direct replacement, since it wasn't used in the framework anymore. |
| Deprecation | Deprecated getSupportedIglDevices in favor of getSupportedIgtlDevices due to typo in name. |
| Added API-Break Deprecation | Added option to StreamRecorderAlgorithm to retain none of the recorded data in the data model after stopping the recording with a new Parameter p_numberOfDataToKeepLimit. The getter and setter set/numberOfDataToKeep were deprecated. A deprecation layer was added to the old methods, but if configured for keeping none of the data (which was not possible before), the old getter numberOfDataToKeep will return an unspecified value. |
| Fixed API-Break | Signals of all network connection classes were changed from std::shared_ptr<Payload> to std::shared_ptr<const Payload> to ensure immutability in signal callback. |
| Changed Deprecation | Renamed ImageStreamData::images2 to ImageStreamData::images. A deprecation layer of the old method name was added. |
ImFusionUS
ImFusionVision
Version 4.3, released on 2025-09-23
ImFusionLib
| Tags | Description |
| Added | Added the ENCRYPT_ASYM option to the cmake-function imfusion_compile_resource_repository, following the addition of --generate-key-file and --encrypt-asym options to ImFusionResourceCompiler. The argument to ENCRYPT_ASYM must be an existing key-file generated with the --generate-key-file option of ImFusionResourceCompiler. This option signs resources with the given key, allowing to replace them without changing any of the source code that loads the resources. |
| Changed Added | Resources: Exposed to SDK users the EXTERNAL_STORAGE option of imfusion_compile_resource_repository in ImFusionLibConfig.cmake. The corresponding option of the Resource Compiler is also exposed. Added possibility of adding a custom resources directory as argument with EXTERNAL_STORAGE. This is mandatory for SDK users. To simplify development, the env-variable IMFUSION_RESOURCES_DIR can be specified at runtime to allow the Resource Management System to retrieve the resource. Resources created at a custom path are not automatically installed. Please refer to the documentation of imfusion_compile_resource_repository in ImFusionLibConfig.cmake for more detailed info. |
| Changed Removed API-Break | Removed the redundant m_fail flag from IoAlgorithm and deprecated the fail() getter method:
The deprecated fail() method now simply returns the algorithm’s status (unless overridden). Its usage should be replaced with a direct call to Algorithm::status().
All IO-algorithms in the ImFusionLib consistently set the Algorithm::m_status flag to indicate success or failure now. If your IoAlgorithm previously used the m_fail flag, you should replace m_fail = false with m_status = Status::Success and m_fail = true with an appropriate failure value from the Algorithm::Status enum or a custom error code. |
| Added | Moved several Mesh-related algorithms from Vision to ImFusionLib/Mesh: BallPivotingSurfaceReconstructionAlgorithm, MeshCreatorVision, MeshGeodesicDistance, MeshMeasurementsAlgorithm, MeshPointCloudCroppingAlgorithm, MeshRendering, PoissonReconstructionAlgorithm, TextureMappingAlgorithm |
| Fixed | Fixed DataGroupingModel not forwarding the dataChanged signal of its source model. |
| Fixed | Fixed incomplete DataItemModel if it was created with a non-empty DataModel. |
| Fixed | Fixed potential use-after-free when calling AlgorithmController::closeAlgorithm(). Added MainWindowBase::removeAlgorithmLater(). |
| Fixed | Fixed erroneous quantization/rounding of mouse event positions in DisplayWidget amd QtDisplayWrapperBase when using high-DPI scaling. |
| Added | Added documentation and a unit test for ImageSharpnessEstimationAlgorithm. |
| Changed | Snapshot workspaces now support all Data that can be written to *.imf instead of only SharedImageSet, Mesh and PointCloud. |
| Fixed | Fixed infinite loop in SliceViewDefaultEventHandler::setManualRegistrationImages when removing images (i.e. when passing a vector of nullptr images). |
| Added | Made the speed of all actions of SliceViewDefaultEventHandler and VolumeViewDefaultEventHandler configurable from the outside via SliceViewDefaultEventHandler::setActionSpeed() and VolumeViewDefaultEventHandler::setActionSpeed(). |
| Added Changed | Added Option to preserve the masked pixels in ImagePyramid::propagateUp Changed VectorFieldFlowAlgorithm to preserve the other deformation in the masked region, which is the new default. Added, Changed: The deformation field calculation in DemonsImageRegistration can now be constrained on the mask of the fixed image, which is the new default. |
| Changed API-Break | Added bookkeeping to InputEventHelpers::handleWithQt() so that QApplication::overrideCursors can only be removed again by the same handler that set them. This avoid a flickering behavior in InteractiveViews in case case input event handler 1 sets a cursor and subsequent handler 2 does not set one. |
| Added | Added Framework::InitConfig::licenseExpirationHandler so applications can handle app tier down gracefully within a given grace period if the license expires during runtime. Added support for floating licenses for Framework users. (only for LicenseSpring licensing system) |
ImFusionAnatomyPlugin
| Tags | Description |
| API-Break Added Removed | Renamed ASCToMeshIoAlgorithm to ASCIoAlgorithm Added to ASCIoAlgorithm the export of Images and metadata and added the import of ASC from a previous export. Added to ASCIoAlgorithm the support for .imf format. |
| API-Break Added | AnatomicalStructureProcessing::GenericASCFromMultiLabelMap now interprets label names like "foo/bar" as identifier foo, key name bar when extracing meshes. This means that identifiers with slashes are not supported any more. Added python bindings for AnatomicalStructure::identifier, AnatomicalStructure::is_2d, AnatomicalStructure::graphs(). |
| API-Break Added Removed | Added style sheets feature, a CSS-like styling of anatomical structures. Added ASCDisplayOptions::p_styleSheets a list of StyleSheet which initially contains a set of default style sheets. The styling can be extended or overridden by appending your own style sheets to the list. Removed ASCDisplayOptions::p_displayMode and ASCDisplayOptions::p_highlightFocus. Changed the type of ASCDisplayOptions::p_showImages from bool to ImageDisplayMode. Removed GlHighlightBall. |
ImFusionCT
| Tags | Description |
| Fixed | Added DefaultAlgorithmController for ProjectionMatrixIoAlgorithm. Auto-flip matrices if containing reflection. Fixed crash when loading matrices twice. Abort geometry setting if the number of frames and matrices mismatch. |
| Changed | Renamed the 2d3d registration classes to exclude the "Algorithm" suffix in Python bindings. |
| Added | Added frameGeometryFromOpenCVMatrixComponents helper function in GeometryUtils. |
| Fixed | Fixed Configurable interface of RelativeGeneratorMixin, fixed typo and crash in the SnapshotGenerator Configurable interface. |
| API-Break | Renamed ConeBeamMetadata::syncToNewGeometry() to ConeBeamMetadata::syncToModernGeometry(). |
| Fixed | Fixed an issue that destroyed the GeometryGenerator in the initial dataset if it gets cloned twice. |
| API-Break | Renamed Mesh2D3DRegistration::vma to Mesh2D3DRegistration::syntheticCTFromMeshAlgorithm. |
| Added Changed | Major update and restructuring of the Python bindings for the CT module:
- The bindings have been fully restructured for improved maintainability and clarity, grouping related functionality into submodules.
|
Python bindings have been added for the following components: Geometry: All core geometry classes and utilities are now accessible from Python. Simulation: The entire simulation pipeline, including ConeBeamSimulation and related classes, is now exposed. Reconstruction: Full access to reconstruction algorithms and data structures from Python. 2D3D Registration: All classes and methods for 2D/3D registration workflows are now available in the bindings.
- All bindings now follow ImFusion's Python binding coding guidelines: snake_case for functions, methods, variables, and parameter names PascalCase for class names CAPITAL_CASE for constants and enum values These changes provide a comprehensive and consistent Python API for CT workflows, enabling advanced scripting and integration.
Changed API-Break
Change p_dataType in ConeBeamSimulation from Image::Type to PixelType.
Changed Added API-Break
Renamed GeometryUtils::frameGeometryFromMatrix to GeometryUtils::frameGeometryFromOpenGLMatrix. Added GeometryUtils::frameGeometryFromOpenCVMatrix to create a FrameGeometry from an OpenCV matrix.
Fixed
Fixed ConeBeamDataLoader::loadInstance. It was missing the ConeBeamData with timestamp.
ImFusionCore
| Tags | Description |
| Changed | Extended Utils::Version class to support and implement the SemVer format, and additionally store a suffix ("pre-release") and metadata. Added isValidAndNotZero() member function to conveniently check whether a version is valid and not 0.0.0.
Furthermore, parsing strings via Utils::Version::fromString() no longer accepts edge cases such as 1.2.foo or 1.2bar. Suffixes/metadata must be delimited by a - or + respectively. |
ImFusionCranialPlugin
| Tags | Description |
| Added | Added algorithm for detection of Anterior Commissure (AC) and Posterior Commissure (PC) in MRI scans. |
| Removed Fixed | Removed RightThalamusProper in favor of RightThalamus. The WholeBrainSegmentationAlgorithm now outputs RightThalamus. |
ImFusionGraph
| Tags | Description |
| Added |
|
| Fixed Changed |
|
| Added |
- Added member functions to Graph class to remove specific node and edge features.
|
| Added |
- Added python bindings for importing and exporting graphs to .graphml
|
| Fixed |
- Fixed bug in GraphUtils::accumulateFeatureAlongSegments
|
| Added |
- Add option to visualize graph features as circles at centers of segments using averaged values.
- Extend BFS/DFS graph traversal to allow access to EdgeInfo (features) during traversal.
|
ImFusionML
| Tags | Description |
| Changed | ML Operations do not raise an exception when one of their active fields is not present in the input data item. Instead, they warn that the field was skipped. To raise, set the errorOnUnexpectedBehaviour parameter to true. |
| Changed Added | Extended StandardizeImageAxesOperation to support all possible right-handed coordinate systems. Removed CPU fallback in this operation as BakeTransformation now has CPU path. |
| Fix | Fixed missing input option 'Unknown' to function 'stringToPredictionOutput' |
| Fix | Fixed PlaceLabelsValuesOperation to respect the updateLabelsComponent setting. |
| Changed | Operations now throw an exception when one of their active fields is not present in the input data item. Up until now, they were silently failing, which could lead to subtle bugs. |
| Added | Added "padding_mode" parameter to the BakeTransformationAlgorithm. Possible values are "zero", "clamp", "mirror". |
ImFusionNavigation
| Tags | Description |
| Added | Added classes for passive optical tracking markers used in optical tracking systems:
|
| Added Changed API-Break | Added new Navigation module. Moved the following classes from Stream to Navigation:
|
ImFusionPython
| Tags | Description |
| Added Changed Fixed | The integrated IPython interpreter, enabled through the PythonInterpreterInterface class, is now available only in Qt6 builds and requires the following packages to be installed in the python environment: IPython qtconsole PySide6 shiboken6. |
ImFusionSpinePlugin
ImFusionStream
| Tags | Description |
| Changed | Changed the reference StreamAPI to Stream Plugin to be consistent with the rest of the SDK documentation. |
| Added Deprecation | Extended ImageStreamRecorder to support recording of image stream data with multiple images per sample into individual image sets. Added new signal ImageStreamRecorder::signalInputStructureChanged to notify about changes in the structure of the image stream data (e.g. number of images per sample, image size, channels). Deprecated the old signal ImageStreamRecorder::imageSizeChanged, which was used to notify only about changes in the size of the first image in the stream. |
| Added Changed | Changed ToolNavigationVisualization to accept splines:
- Splines can be selected from list then applied to the current visualization
- Added an way of loading folders containing exported splines files
- Added logging of distances from origin and to target and option to dump them to a file
|
ImFusionVision
Version 4.2, released on 2025-07-19
Version 4.1, released on 2025-07-18
ImFusionLib
| Tags | Description |
| Fixed | Fixed potential crash in case one called DisplayWidgetMulti::addView2D() or addViewGroup3D() with defaultOverlays set to false. |
| API-Break | Added license checks to Algorithm constructors. Instantiating an algorithm of a module which is not included in the currently activated license will throw a MissingLicenseException. |
| Removed API-Break | Removed buggy ClImage support from SharedImage:
The functions sharedCl(), hasCl(), cl(), and setDirtyCl() have been removed without a direct replacement. Their original implementation of the synchronization was logic partially broken and unfortunately not fixable due to the dependence on the ClEnvironment. Since a survey showed that this interface was only used in a very few places anyway it was removed without prior notice or a deprecation layer. If you need to migrate existing code calling SharedImage::sharedCl() use either std::make_shared<ClImage>(ClImage::IMAGE, ClImage::READ_ONLY, *sharedImage.mem(), 0, 0, env) or std::make_shared<ClImage>(ClImage::IMAGE, ClImage::READ_ONLY, *sharedImage.gl(), ClImage::COPY, env) to implement the existing behavior. |
| Added Changed | Added Framework::defaultLicenseInitFunction() which returns a function that tries to activate a license if no license is active by using the environment variable IMFUSION_LICENSE_KEY if it is set. Changed Framework::InitConfig::licenseInitFunction so by default it is now set to the result of Framework::defaultLicenseInitFunction(). Added LicenseManagerSDK::setLicenseKey() for online license activation which in contrast to LicenseManagerSDK::setKeyAndCode() should be used for license systems which do not support offline activation using a code. (e.g. LicenseSpring) |
| Added | Added support for IRMesHBoolean Library for MeshBooleanOperationsAlgorithm. |
| Changed | Extended the LiveHandEyeCalibration GUI with a list of the captured samples and tools to manage it. |
| Fixed | Fixed a bug that caused the last image of an image set to be left out during playback. |
| Added | Added legend support to PlotView. |
| Removed | Removed GlSpline::setRenderMode3d, which was controlling both 3d and 2d render modes. Use GlSpline::setRenderMode instead, which can control 2d and 3d modes individually. |
| Fixed | Fixed ColorPickerWidget to show the correct initial alpha value. Before, the slider was always set to max initially. |
| Added | Added class PointCorrespondencesVisualGuide to create a visual guide for defining PointCorrespondences. Added PointsOnDataManipulator::show/hideVisualGuideInViews to display the visual guide. |
| Added | Added GlImageRenderer to display images in slice view as GlObject. |
| Added Changed Fixed | Added GlPointBasedAnnotation::setLabelPixelOffset to be able to change the label's offset. Changed GlPointBasedAnnotation::labelPosition to now also use the GlPointBasedAnnotation::m_labelPixelOffset to calculate the result. The previously hardcoded offset is now the default setting of GlPointBasedAnnotation::m_labelPixelOffset. Fixed an issue where GlPointBasedAnnotation::renderPoint would cache the crosshair size (if enabled) on first call making it impossible to change its size later. |
| Fixed | Added an application setting to define the default pixel interpolation mode in the 2D views. |
| Fixed | Fixed race condition in ProgressDialog that could lead to a segfault on Progress::Task destruction. |
| Changed | Removed undocumented side-effect of GlVolumeView:setVr(newVolumeRenderer) to persist configuration of previously used GlVolumeRenderer instances and set that configuration to newVolumeRenderer. This logic has been moved to InteractiveViewOptionsOverlay. The newly assigned GlVolumeRenderer will now always remain unchanged when calling GlVolumeView::setVr(). |
| Fixed Changed | Fixed PropertiesWidget::configuration to now also return attributes of (Sub-)Properties, previously only attributes of Params got returned. Changed PropertiesWidget::configuration to now also return Params and (Sub-)Properties which have the attribute "hidden" enabled. The visibility behavior remains unchanged. |
ImFusionAnatomyPlugin
| Tags | Description |
| Added | Added algorithm to export all meshes from AnatomicalStructure into a tree-like folder structure. |
ImFusionCT
| Tags | Description |
| Fixed | If ConeBeamGeometry is used from the SDK, in Debug mode, and under Windows, there was an incorrect access which could cause a crash. |
| Fixed | Fixed copy constructor of RelativeGeneratorMixin that causes crash when cloning twice. |
| Changed | Moved legacy CT classes to a new plugin. |
| Added | Use Zernike polynomials to extrapolate displacements for missing points in grid based distortion correction. |
ImFusionCore
| Tags | Description |
| Added | Added Utils::Span, a polyfill implementation of std::span to describe a non-owning view into contiguous sequence of elements. |
ImFusionGL
| Tags | Description |
| Added | Added overloads with Utils::Span to GL::Buffer (and derived classes) member functions for setting data. Thus, callers are no longer required to allocate their data in a std::vector but can use any span-compatible type (e.g. a static array). |
ImFusionGraph
| Tags | Description |
| Changed API-Break |
- Refactor GlGraphDisplayOptionsWidget: separate general and feature visualization options
- Add legend overlay for graph line blending feature visualization
|
| Added | Add GraphReindexingAlgorithm to renumber nodes starting from a specified root using BFS traversal Add forEachNodeBFS member function to the Graph class for breadth-first traversal |
| Added | Add option to export node features to GraphMLIoAlgorithm. |
ImFusionML
| Tags | Description |
| Deprecation Changed | Deprecated the ML::Utils::ImageResampler::process functions, which were unnecessarily in-place. Use the new, out-of-place ML::Utils::ImageResampler::resample functions instead. Rotation and resampling operations are now defined as out-of-place (doesNotModifyInput now returns true), which may save a copy in some usecases. |
| Fixed | Changed the YAML parsing of vector parameters to fix a bug with the OperationsSequenceAlgorithm. |
| Changed | Several improvements to the OrientedROISampler. Improve efficiency Add CPU implementation Make the sample_from_labels_proportion parameter work more intuitively for num_samples=1 Add parameters to better control the random augmentations Renamed random_flipping_chance to random_flipping_probability |
| Added | Added CPU implementation for BakeTransformationAlgorithm and BakeTransformationOperation. |
| Changed | Introduces MachineLearningModel V2, which provides a new scheme and implementation logic for splitting and recombination. The MachineLearningModel now uses the SplitIntoPatchesOperation and RecombinePatchesOperation to split the input image into patches and recombine the predictions. Also, input padding relies on the PadDimsToNextMultipleOperation, while unpadding is done by the InverseOperation. The ModelConfiguration version has been bumped to 8 to accomodate the new scheme. Breaking change: The new scheme produces slightly different results. In order to avoid introducing regressions in existing models, the ModelConfiguration doesn't upgrade the config automatically to version 8, but stops at version 7 by default. To upgrade the configuration to the latest version, set the UpgradeToMLModelV2 flag to true in the YAML configuration file (Default is false). Checkout the User Documentation at this link for more details: https://docs.imfusion.com/suite/Machine%20Learning/inferenceyamlconfigchangelog.html#version-8 |
| Fixed | Fixed and improved timings of the DataLoaders (when verbose is set to True). |
| Added | Added CudaDeviceManager, a helper class to check at runtime which GPUs are compatible with the CUDA version. Made ML plugin compile with CUDA statically on Windows and Linux. |
| Added | Added InverseOperation, which allows to invert/undo a previously applied operation. |
ImFusionReg
| Tags | Description |
| Added | Added support for region-specific weights, regularization weights, a custom term and pre-iteration processing of fixed points to DeformableIcp. |
ImFusionSpinePlugin
ImFusionStream
| Tags | Description |
| Added Changed | Added PointsOnTrackingStream and PointsOnTrackingStreamManipulator to handle point correspondes of a TrackingStream.
|
| Deprecation | Stream base class method Stream::uuid was deprecated and should not be used for identification anymore. Since the method has been implemented very differently in derived classes (and not used in the ImFusion framework), the method will be removed in a future release without replacement. |
| Added Changed | Added utility function StreamUtils::preciseSleep:
- Introduced StreamUtils::preciseSleep as a high-precision replacement for std::this_thread::sleep_for, offering sub-millisecond accuracy across all platforms.
- Integrated StreamUtils::preciseSleep in the Stream base class to schedule doWork calls with improved precision.
|
| Added | Added slim data serialization interface for streaming and data transfer:
|
| Added Changed | Introduced base classes for UDP connection in the Network folder:
- Added UDP Socket for peer-to-peer UDP communication.
- Added UDP to the ConnectionFactory as third default connection.
|
ImFusionUS
| Tags | Description |
| Changed Fixed | Refactored UltrasoundGEExtension: Functionality to load GE Vivid 3D DICOM moved to standalone DatasetHandler GeVividScanlineVolumeDatasetHandler that can optionally load the scanline data and / or the scan converted volumes. Fixed the calculation of the 3D frame geometry parametrization from the GE DICOM data. |
| API-Break | Removed p_constantMotion option in SweepProcessingAlgorithm. |
| Deprecation | Deprecated setters and getters for parameters in UltrasoundRegistrationAlgorithm. Use public parameter member variables instead. |
| Removed API-Break | Moved protected MotionTrajectoryModel::demeanMatrices(const std::vector<mat4>& mat, std::vector<mat4>& demeanedMat) to the Pose namespace as a free function. |
| API-Break | GlSweepReconstruction::setSweep and setSweeps expect now const pointers of the sweeps to reconstruct. Compilation will break if setSweeps is called with a vector of non-const sweep pointers. |
Version 4.0, released on 2025-05-15
ImFusionLib
| Tags | Description |
| Added | Add support for label map modality in MetaImage loader (use Modality = MET_MOD_LABEL). |
| Fixed | Fixed CsvIoAlgorithm hanging if the separator could not be deduced automatically. |
| API-Break | Workspace conversion functions (see WorkspaceConversionRegistry) now require the full workspace file path to resolve relative paths within the workspace. |
| Added | Added MeshInterpolation::laplaceInterpolation() and MeshInterpolation::laplaceInterpolationMatrix() for Laplace interpolation of values from a subset of mesh vertices to all mesh vertices. |
| Fixed | AlgorithmFactory can now find algorithms with IDs auto-generated by deprecated registerAlgorithm() functions. |
| Changed API-Break | Changed the API for registering custom settings widgets with the SettingsDialog, allowing for dynamically updating the layout. |
| Fixed | Fixed DisplayWidgetMulti::addView() to correctly make ImageView3D and ImageView2D instances available through the DisplayWidgetMulti::view2D(), viewSlice(), and view3D() helper functions respectively if they are no algorithm views. Previously, this would only be the case if you were using addView2D() and addViewGroup3D(). |
| Removed | Removed old deprecation layers. |
| Added | Added custom url scheme imfusionsuite:// on Linux and Windows. Added ability to fetch and load files through http. |
| Added Changed API-Break | Added TrackedSharedImageSet::clear() which clears the tracking information and resets all member variables to their default value. SDK users that relied on the non-overridden base-class method SharedImageSet::clear should either call this method directly or use the helper TrackedSharedImageSet::clearSharedImageSet. |
| Fixed | Fixed crash when setting scale to zero in Transformation Editor. |
| Added Changed API-Break | Introduction of the new ImFusion::GUI framework providing a generic abstraction layer for visualization and handling user input events.
This is a major change adding many new interfaces, classes and concepts. ImFusion::GUI will eventually replace the Qt-based view framework. As of now, the old framework is not yet considered deprecated but the two coexist next to each other and even allow for using them in a mixed setup to allow for a smooth transitioning period. However, at some point in the future the old framework will become deprecated and removed eventually.
Please refer to the ImFusion::GUI Migration Guide for more details.
|
| Changed | Fixed scaling of GlGradient (old scaling was so that result was 2 times the gradient). |
| Added | Added Animations::cancelAllAnimations() helper function. |
| Added | Added move operator== to SharedImage. |
| Fixed | Changed the default transformation convention of ImageView2D::setMatrix() and ImageView3D::setMatrix() to Pose::TOWORLD so that animations are correctly interpolated if the matrix contains both a translational and rotational parts. Previously, the animation would follow a curved path through the world origin instead of a direct line between start and end matrix. |
| Changed API-Break | Changed API of setters/getters for mouse/touch speeds in ViewInteraction. Checks are performed for consistency with the underlying ViewActionMap. |
| Added API-Break | Added DeformationFactory and support for Deformation persistence in ImFusion files. Added pure virtual method Deformation::id(). |
| Changed | Allowed CombineMeshesAlgorithm to accept less than 2 input meshes. |
| Added | Added fast-sweeping distance transform and added ability to select underlying method and distance type to DistanceTransformAlgorithm. |
| Fixed | Fixed a regression from release 3.12 where PropertiesWidget::configuration() was dropping all but the last subproperty if there are multiple subproperties with the same name. |
| Added | Added option to use a TextEdit rather than a LineEdit for a string parameter. To switch to a TextEdit, use the "textBox" parameter attribute: p.setParamAttributes("myTextParameter", "textBox: true"); |
| Fixed Added | Fixed a bug in RandomROISampler reducing variability in case of padding. Added option to set ROI size to image dimensions in Random/CenterROISampler. |
| Added | AttachTrackingSequenceAlgorithm as well as AttachTrackingSequenceAlgorithmController were moved from the US module to the ImFusionLib library. |
ImFusionAnatomyPlugin
ImFusionCT
| Tags | Description |
| Fixed | Fixed visualization issue of Cone-beam data when attemping to hide the data in the 2D view. |
ImFusionCore
ImFusionCranialPlugin
ImFusionDicom
| Tags | Description |
| API-Break Changed | Extended the anonymisePatient setting from a boolean to a anonymisation profile selection. If it was enabled, the previous setting will be migrated to a relaxed profile that keeps UIDs. The new enum can be used with Utils::anonymize for migrating code from the old bool flag. The old behaviour of the bool flag corresponds to the 'Basic' enum value. |
| Changed | Split CT volumes according to "Acquisition Number" if the regular volume reconstruction does not produce proper volumes. This adds support for loading CT volumes that partially overlap. The "Acquisition Number" is not used when each frame has its own number or all frames have the same number. |
| Removed | Removed old deprecation layers. |
| Fixed | Fixed wrong padding when loading and saving DICOM segmentation images. The old version assumed that 1-bit PixelData is padded between frames to full bytes. This only worked for segmentations with a width * height * #segments as a multiple of 8. All other segmentations were exported with the wrong pixel data before. Additionally, the tolerance for detecting the correct slice spacing has been improved. |
| Changed | Trailing zeros in ImagePositionPatient are ignored now when computing the tolerance for the slice spacing. This change affects Dicom::VolumeReconstruction::maxTransformationDigits. |
| API-Break Fixed | DicomIoAlgorithm forwards errors from DatasetHandlers. Dicom::DatasetHandler::loadFromDataset requires a Dicom::ErrorRecorder as second argument now. Also Dicom::IOD_Registry::registerDatasetHandler was renamed to Dicom::IOD_Registry::registerDefaultDatasetHandler. |
| API-Break Fixed | DicomIoAlgorithm forwards errors from DatasetHandlers. Dicom::DatasetHandler::loadFromDataset requires a Dicom::ErrorRecorder as second argument now. Also Dicom::IOD_Registry::registerDatasetHandler was renamed to Dicom::IOD_Registry::registerDefaultDatasetHandler. |
ImFusionEndoscopy
| Tags | Description |
| Added | Added Endoscopy |
ImFusionGraph
| Tags | Description |
| Added | Add GraphMLIoAlgorithm which allows importing/exporting graphs from/to .graphml files. |
| Fixed | Fixed bug in averageDiameters in the ComputeCommonGraphFeaturesAlgorithm. |
| Changed API-Break | Renamed diameter circleVisualization in the GlGraph display options. |
| Added |
- add MinimumSpanningTreeAlgorithm to Graph Plugin
- add ComputeFeaturesAlgorithm to compute edge features (edge length, diameter, cross section) and node feature (degree)
- add NodeToEdgeFeatureAlgorithm to transform (e.g. sum, average) node features of neighboring nodes to connecting edge
- adapt GraphMatrixUtils::graphToSequentialIndex to return the reverse map
- improve accuracy of GraphUtils::computeDiameters
- add GraphUtils::removeThinTerminalEdges to remove terminal edges with a diameter below a given threshold
- add version of Graph::traverse with access to neighborIndexes
|
| Added | Added an algorithm to interactively create graphs or edit graphs. |
ImFusionLiveUS
| Tags | Description |
| Removed API-Break | Moved the following classes to the ImFusionLiveUSExp module: FreehandUltrasoundWorkflowAlgorithm FreehandUltrasoundWorkflowController LiveSliceOrientationEstimationAlgorithm LiveSliceOrientationEstimationController LiveSweepTrackingEstimationAlgorithm LiveSweepTrackingEstimationController BoneSegmentationStreamAlgorithm BoneSegmentationStreamController StreamClassificationAlgorithm StreamClassificationController TrackingEstimationWorkflowAlgorithm TrackingEstimationWorkflowController |
ImFusionML
| Tags | Description |
| Added | Added ML::DataListReader as a DataReader that reads a data item per row of a based on a tab-separated text file. |
| API-Break | Renamed Phase::Train to Phase::Training and Phase::Test to Phase::Inference. |
| Removed API-Break |
- Removed TrainingImageSynthesisAlgorithm: use ML::Operations to perform random data augmentations in a more flexible way.
- Removed GenerateTrainingDataAlgorithm: use HDF5IoAlgorithm.
- Removed ObjectDetectionAlgorithm: use Vision/YolactObjectDetectionAlgorithm or ML/Detectron2InferenceAlgorithm
- Removed FastSurferBrainSegmentationAlgorithm: use the WholeBrainSegmentationAlgorithm class in the CranialPlugin.
- Removed LandmarkAnnotationAlgorithm: use ImFusion Labels to annotate landmarks.
|
| Added | Added new parameter to ML::ReplaceLabelsValuesOperation and ReplaceValuesAlgorithm to assign a specific value to all non-zero label values. |
| Added | Added Verbose flag to the ML::EngineConfiguration for a more fine-grained control of the log messages. |
| Added | Added ML::StandardizeImageAxesOperation that allows to reorganize the memory buffer of a medical image to ensure anatomical consistency (see documentation). |
| Added | Added ML::RecombinePatchesOperation, which allows to recombine patches of an image into a full image. |
| Fixed | For 2D inputs only, ML::DeformationOperation now allows num_subdivisions to be 0 for the z-dimension. |
| Added | Added TensorSetElement, replacing the previous TensorElement. The TensorSetElement can contain a set of Tensors to match the DataElement API. The TensorSet is the main datatype that is used in the Suite. Tensor is not of type Data, instead the TensorSet should be used. |
| Changed | Extended SplitROISampler to allow extraction of all patches from an image. This is done by setting the extract_all_patches parameter to true. This is useful for running inference of machine learning models in a sliding window fashion. |
| Added | Added DataItemDisplayHandler for better visualization of DataItems. |
| Added Changed | ML::OrientedROISampler supports random scaling sampling in log-space. Changed the seeding to be deterministic across different systems. |
| Added | Added GenerateRandomKeypointsOperation. |
| Added | Added support for DataItem as input in OperationSequenceAlgorithm. |
| Added | Added a new filter function is_empty to skip empty DataItems. |
ImFusionStream
| Tags | Description |
| Changed Deprecation API-Break | The Stream signal for a new data sample has been changed from containing a constant reference to the StreamData to a shared pointer to const StreamData. This allows a stream consumer to keep the data alive and e.g. move it to a different thread without having to copy it. The old signal signalNewData has been deprecated and will be removed in a future version. The new signal is signalStreamData. Emitting and receiving the old signal will still work during the deprecation phase, but it is recommended to switch to the new signal as soon as possible. To facilitate the transition, StreamData has been extended with a clone method that returns a shared pointer to a copy of the data. All StreamData implementations need to implement this method. |
| Changed API-Break | StreamRecorder only takes one Stream as input to enforce 1:1 relationship between StreamRecorder and Stream. StreamRecorder for vector of streams not supported anymore. |
| Changed Deprecation Fixed | Stream base class has a more explicit interface defining the ThreadingMode.
- Added a enum ThreadingMode to configure whether a Stream should run an own worker thread or not.
- Deprecated method supportsAsyncOperation because the name is misleading.
- Fixed instantiation of worker thread. The stream was running a worker thread independent of the configuration before.
|
| Added | Added option to stream recorder algorithm to set the amount of images that are to be kept in memory while live recording streams to a file. |
| Added | Added configurable TrackingInstrumentTable for tracking stream controller:
- Shows the current state of the instrument including main instrument, id, name, active/inactive, and last tracking quality
- Supports to set main instrument, select instrument, rename instrument, and activate/deactivate instrument
|
| Added | Added TrackingToolCalibrationWizard for the calibration of a pointer-like TrackingInstrument:
- Interactive tracking recording for pivot and pointer direction calibration.
- Visual inspection of results.
- Applies the calibration to the TrackingStream.
|
| Added | Changed StreamRecorderAlgorithm to manage more than one recording task Added restart option to enable programmatic restart of recording. Changed takeOutput and takeOutputAsync behaviour to return all the data being recorded.
- The data is returned sorted by time, from latest to oldest.
- Starting a new recording clears the internal buffer.
- New function restart() creates a new recording without clearing the internal buffer. Added options to StreamRecorderController to restart the stream recording on user specified limits instead of stopping.
|
| Added | Added option to save images to disc while recording with setLiveStreamRecording in StreamRecorderAlgorithm. |
ImFusionUS
| Tags | Description |
| Added | Added a specialized version of the FrameGeometryConvex, the FrameGeometryConvexSteered that is intended for use with steered imaging. |
| Removed API-Break | Removed all CPU modes from GlSweepCompounding. Removed the following classes: GenerateDataForBoneExtentDetection, RFProcessingAlgorithm, SpeckleDecorrelationAlgorithm. Moved the following class to USExp: SteeredCompounding. |
| Removed API-Break | Moved the following classes to the ImFusionUSExp module: ThyroidFusionAlgorithm ThyroidFusionController |
| Removed API-Break | Moved the following classes to the ImFusionUSExp module: BKVolumeIoAlgorithm ConfidenceMapAlgorithm GlMultiSweepDeformation GlSweepDecompression JointSweepReconstructionAlgorithm LearningBasedTrackingEstimationAlgorithm ManualSegmentationAlgorithm ManualSegmentationController MultiSweepVisualizationAlgorithm MultiSweepVisualizationController Reconstruction2D3DAlgorithm Reconstruction2D3DController RemoveSkinStripe ResetSweepLinkedPose ScanConversion2 SimulationDataPreparationAlgorithm SimulationDataPreparationController SimulationOptimizationAlgorithm SimulationOptimizationController SliceOrientationEstimationAlgorithm SliceOrientationEstimationController SteeredCompoundingAlgorithm SteeredCompoundingController SweepDecompressionAlgorithm SweepDecompressionController SweepDeformationEditor SweepDeformationEditorController SweepFocusFramesRegistrationAlgorithm SweepFocusFramesRegistrationController SweepRegistrationAlgorithm SweepRegistrationController SweepScanlineTemporalCompensation TrackingAnalysis TrackingAnalysisController UltrasoundCalibrationAnalysisAlgorithm UltrasoundCalibrationAnalysisController UltrasoundDataLegacy VesselFromCenterlineAlgorithm VesselFromCenterlineController WireDetectionAlgorithm WireDetectionController |
| Removed | Removed old and previously deprecated US::UltrasoundGeometry. Use the US::FrameGeometry instead. |
| Removed API-Break | Removed deprecated loading and saving calibrations to the center of the image. Use calibration to the tip of the probe. Calibrations to the center of the image can still be displayed in the GUI for convenience. |
| Changed API-Break | Added argument checks to the constructor of US::UltrasoundSweepRingBuffer which cause an exception to be raised when not fulfilled. |
| Removed API-Break | Removed the backwards compatibility typedefs, that made the classes from the Ultrasound module available in the ImFusion namespace. Use the classes from the ImFusion::US namespace instead. Removed the backwards compatibility header files for renamed classes, specifically: UltrasoundBackwardCompounding.h, UltrasoundBoneLabelingAlgorithm.h, UltrasoundBoneSegmentationAlgorithm.h, UltrasoundBoneSegmentationBaseAlgorithm.h, UltrasoundBoneSegmentationController.h, UltrasoundFrameGrabbingConfigComponent.h, UltrasoundFrameGrabbingPresets.h, UltrasoundGeometryDetection.h, UltrasoundGeometryDetectionAlgorithm.h, UltrasoundGeometryDetectionController.h, UltrasoundRawDataAlgorithm.h, UltrasoundRawDataController.h, UltrasoundSimDataPrepareAlgorithm.h, UltrasoundSimDataPrepareController.h, UltrasoundSimOptAlgorithm.h, UltrasoundSimOptController.h, UltrasoundSweepToMeshAlgorithm.h, UltrasoundTrackingEvaluation.h, US2D3DReconstructionAlgorithm.h, US2D3DReconstructionController.h, USCalibrationInit.h, USConfidenceMapAlgorithm.h, USRFProcessingAlgorithm.h, and USSweepCalibrator.h |
ImFusionVision
| Tags | Description |
| Added | Added monocular depth estimation functionality and Depth Anything V2 small model as first implementation. |
Version 3.14, released on 2025-03-13
ImFusionLib
| Tags | Description |
| Added | Added additional mode to MeshToPointCloudAlgorithm for sampling interior points. |
| Fixed | Fixed CroppingMask::createExplicitMask() not returning a single channel mask image if the input reference image has more than one channel. |
| Fixed | Fixed unreliable conversion behavior of MatchWindowingAlgorithm. |
| Deprecation Added | Added VectorFieldFlowAlgorithm, which implements and extends the VectorFieldFlow class functionality. Deprecated VectorFieldFlow class.
Changed DemonsImageRegistration and GreedyDemonsImageRegistration to now use the VectorFieldFlowAlgorithm class where before the VectorFieldFlow class was used.
|
| Added | Added option to estimate and display fitting errors with colored highlighting for PointCorrespondences. |
| Added Fixed | Added DataDisplayHandler::onViewDeleted(InteractiveView& view) which is called when the given view is about to be deleted. The method has to be overridden by deriving classes to properly clean up internal references to the view. Fixed several issues where references to destroyed views in classes deriving from DataDisplayHandler were not cleaned up properly and could lead to access violations. |
| Fixed Changed API-Break | Fixed a problem in GlHistogramOverlay, where the histogram was not correctly updated when the corresponding image content was changed:
|
| Fixed Changed | Fixed OptionalParamControl not considering the default value for its inner ParamControl. createDefaultParamControl now accepts PropertiesDetail::Param as input argument rather than four separate arguments corresponding to its members. createDefaultParamControl now sets the value given through the input PropertiesDetail::Param argument (i.e., no longer need to set the value manually after calling this function). createDefaultParamControl has now been marked as IMFUSION_API, due to added tests in LibTest (tests for which now LibTest now requires createDefaultParamControl). |
ImFusionAnatomyPlugin
| Tags | Description |
| API-Break Added | Refactored ASCRegistration, large parts of the previous interface are now deprecated. May cause changes of registration behavior in some edge cases. |
| Fixed | Fixed issues where references to destroyed views in classes deriving from DataDisplayHandler (i.e. ASCDataDisplayHandler and ASCSetDisplayHandler) were not cleaned up properly and could lead to access violations. |
ImFusionCT
ImFusionCore
ImFusionDicom
ImFusionGL
| Tags | Description |
| Fixed | Fixed move semantics of GL::Blending so that a moved-from object will no longer restore the previous state. |
ImFusionGraph
| Tags | Description |
| Added | Added an algorithm to extract a point cloud from a graph. |
| Added | Move shortest path functionalities from Anatomy Plugin. |
| Added | Several extensions to the graph plugin
|
ImFusionLicensing
| Tags | Description |
| Added | Initial version of new Licensing library. |
ImFusionML
| Tags | Description |
| Fixed | Fixed that the saving of empty KeypointSet was not correct and, hence, their reloading was triggering an assertion. |
| Added | Added option to control padding behavior in machine learning models, by adding the EnsureInputImageMultipleOfDivisor sampling parameter. This is passed to p_ensureInputImageMultipleOfDivisor of the SplitImagesAlgorithm algorithm. A new inference version 7 is introduced, which disables the padding by default. Models before version 7 will automatically turn on the padding to match the old behavior, unless specifically turned off. |
| Changed | Improved efficiency of the ML inference pipeline, in particular on 2D image sequences for which the default code path has been changed. In general, to maximize performance for such applications, it is recommend to define the MaxBatchSize parameter (as well as SkipUnpadding to True and RecombineWeighed to False) - see User documentation for more details. |
| Added | Added PadDimsToNextMultipleOperation, which pads each dimension of the input image to the next multiple of the specified divisor. |
ImFusionSeg
| Tags | Description |
| Changed | Changed LabelStatisticsAlgorithm to now require an image and at least one label map as input. Besides the existing output via console the computed statistics are now also presented in a dialog window. |
ImFusionSpinePlugin
| Tags | Description |
| Added | Added RANSAC and Nearest Neighbor based sorting strategies to increase robustness of ordering of vertebrae in SpineData. The RANSAC replaces the previous z-positional ordering method as the default. |
ImFusionStream
| Tags | Description |
| Added Changed | Introduced base classes for TCP connection in the Network folder:
- Added TCP Socket Server, along with the associated Server Session and Listener.
- Added TCP Socket Client, along with the corresponding Client Session.
- Added NetworkUtils class for utility functions.
|
| Changed Deprecation | Changed TrackingStreamRecorder from an index-based identification to a ID based identification of a TrackingInstrument using the TrackerID::ID. Renamed methods from "device" to "instrument" (harmonization of naming with other classes). Added deprecation layer for old names and index-based identification. |
| Deprecation | Moved all the IGTL related code into its own folder IGTL inside Stream, and placed all the classes and functions into its own ImFusion::IGTL namespace. |
ImFusionUS
| Tags | Description |
| Added Deprecation | Deprecation of SweepProperties. Split its functionality into SweepTrackingProperties, to handle tracked image sets that can have a frame geometry, and FrameGeometryProperties, to handle the specific properties of frame geometries. |
| Fixed | Fixed Philips scanline volumes not containing neither an ImageInfoDataComponent nor a DataSourceComponent. |
| Fixed | Fixed blending behavior of semi-transparent ultrasound sweeps and image/volume sets. |
ImFusionVision
| Tags | Description |
| Added | Added the stereo submodule for the vising python bindings. |
Version 3.13, released on 2025-02-04
ImFusionLib
| Tags | Description |
| Deprecation Added | Added two new functions PngIO::writeImage() which take now a reference to MemImage instead of a pointer. One of the overloads is now newly capable of writing to a ByteBuffer instead of a file. Deprecated the old writeImage(). Its optional parameters bgr and preserveValueRange are not supported anymore. Instead their default behavior is now enforced. |
| Added | Added a static member function ImFusionFile::load() for conveniently loading an ImFusionFile from memory without having to create an additional copy of the underlying buffer. |
| Fixed | Fixed ImageProcessing::createPadded and ImageProcessing::computePadded when PaddingMode is 'Mirror'.
Mirror padding on the URB corner (and only there, the LLF corner side is handled correctly) starts by repeating the border image value in the padding region, instead than picking the image value at border - 1. This is fixed, but in order to avoid introducing subtle regression, both createPadded() and computePadded() now have a flag legacyMirrorPadding which defaults to true (non-breaking but incorrect behaviour). This will be deprecated and removed in the future. Furthermore, in case the padding size exceeds the image dimension, the mirroring was clamped at the last value along the dimension. Now it is fixed to infinitely mirror the original values.
|
| Fixed | Fixed normalization in mask support for ConvolutionFilter. Previously the normalization assumed that the kernel is normalized, i.e. sums up to 1. |
| Fixed | Adjusted SimilarityMeasureWrapper to set the mode and its attributes as values and keys. |
| Fixed | Fixed an issue in OptimizationDialog. When the dimension is zero the parameter list did not get cleared. |
| Fixed Changed | Several fixed and improvements to DefaultAlgorithmController:
- Improved the logic in DefaultAlgorithmController::onParameterChanged(const std::string&). Previously Subproperties were kept in the Properties object even if they were unrelated to the changed parameter. In addition changes in parameters of subProperties did not correctly remove everything else.
- Improved Error handling in DefaultAlgorithmController
- Added support to enable display updates triggered from the Optimizer in DefaultAlgorithmController
- Ensure that the algorithm is an OptimizingAlgorithm if handling the m_optDialog in DefaultAlgorithmController
- Prevent Algorithm::signalParametersChanged to be triggered in DefaultAlgorithmController::onCompute. Before this could happen e.g. if the optimizer was set.
- Fixed an issue were the optimizer in the m_optDialog was not updated if the parameters of algorithm changed.
- Fixed an issue in DefaultAlgorithmController where the optimizer from the m_optDialog was overwritten if the algorithm already had an optimizer.
|
| Fixed Changed | Fixed several issues in PropertiesWidget and PropertiesWidgetParamControls:
- SplitCamelCase is not propagated to SubProperties
- Replaced m_subPropertiesPath by a function based on the m_parameterName. Previously the m_subPropertiesPath was not correctly set if the widget was reused for a different SubProperty
- Minor fix for BoolParamControl where the control was not properly disabled if the read-only option was enabled.
- Fixed an issue where the attributes of an optional were empty in OptionalParamControl::updateValue()
- Fixed an issue where attributes of an optional where ignored, if the optional didn't have a value.
- Fixed an issue in OptionalParamControl where the read-only attribute was not considered for the checkbox
- Fixed a bug in the ParamControl of optionals where the clicking of the checkbox did not trigger a valueChanged signal.
|
| Deprecation API-Break | Replaced the originally separate Bounds class with a typedef to the new Geometry::AlignedBox (cf. changelog of ImFusionCore). All interfaces in ImFusionLib and plugins previously using Bounds have been changed to use Geometry::AlignedBox instead. Some of the member functions of Bounds were renamed to follow existing naming conventions.
Both classes represent the same semantic concept of an axis-aligned cuboid, however were historically used for different use cases. This change allows for removing Bounds in favor of using only Geometry::AlignedBox.
|
| Changed API-Break | Refactored ParameterOptimization. |
| Changed | Adjusted blending behavior of GlSlice:
It now also correctly shows the transparency of the first-shown image. Previously, the first image was always rendered fully opaque. Use GlSlice::setRenderFirstImageWithFullOpacity() to restore the original behavior.
Furthermore, internally GlSlice now uses pre-multiplied alpha compositing to avoid color bleeding artifacts when showing multiple semi-transparent images.
|
| Changed | Changed PointsOnImageManipulator class to show feature points on Shared Image Sets by creating point cloud annotation Changed FeatureDetectionController and CameraCalibrationController to use FeatureVisualization |
| Changed API-Break | User documentation for algorithms now looks for a file matching the algorithm ID rather than the GUI name. |
| Changed | Changed the structure and order of the "Import" menu in the Suite. The import menu now supports submenus based on the levels of categories in the guiName argument of the AlgorithmFactory::registerAlgorithm function. |
| Fixed | Fixed that interactive mesh picking using MeshPickingManipulator / InteractiveMeshInfoOverlay was not working with certain meshes. |
| Changed API-Break | Refactored MeshGl buffer handling to split individual vertex attributes into separate buffers. This enables us to correctly combine different buffers for the various use cases, for instance per-vertex normals vs. per-face normals. Also, MeshDisplayOptions::p_useFaceNormals has been moved to individual settings of GlMeshRendererSurface::DisplayOptions and GlMeshRendererNormals::DisplayOptions. |
| Fixed | Apply black screen hotfix for Qt5 and Qt6 when using XCB_EGL on Linux platforms. |
| Added Removed API-Break | Added DisplayOptions2d::alpha parameter to allow for per-dataset configuration of opacity/blending. This supersedes the global opacity parameter of GlSliceRendererImage. |
| Added Changed | Added GatedLinear4dImageRegistration to support 4D-4D registration with GatingMetadata on either of the two volume sets. To support this, the LC2 preprocessing in ImageRegistration now runs on all frames, not just on the focus frame. The 4D-4D registration needs to be turned on in the SDK for now, it is not possible to use this feature using the ImageRegistration in the Suite yet. However, the UltrasoundRegistrationAlgorithm exposes the feature to the GUI. |
| Added | Added SetGatingMetadataAlgorithm to allow manipulation of gating metadata and automatic computation of the phase signal from a VitalsDataComponent (ECG or pulseoximetry signal). Added synchronized visualization via the new Gated4DImageSetDisplayDataController. |
| Added Changed Deprecated API-Break | Replaced most usages of QSettings with the newly introduced GlobalSettings interface from ImFusionCore.
- Added migration logic to transfer old settings to the new system.
- Deprecated multiple interfaces in Settings and SettingsDialog. Refer to Settings Migration Guide for more information.
- The parameters "testSuite" and "testCase" in the TestRunnerAlgorithm were renamed to "testSuiteToRun" and "testCaseToRun" respectively.
|
| Fixed | Fixed the issue where the attributes of an optional were ignored if the optional did not have a value. |
| Fixed | Fixed GlVolumeView changing the clip plane of GlMeshes inside also if GlVolumeView::setApplyClipPlaneToGlObjects() was set to false. |
ImFusionAnatomyPlugin
| Tags | Description |
| Added | Replaced deprecated Bounds class by Geometry::CuboidAA |
| Added | Added ModelFactory class which can be used to create model factory singletons for Algorithms of dependent Plugins. |
ImFusionCT
ImFusionCUDA
| Tags | Description |
| Added | Added DeviceBufferImage class as a CustomImage representation of CUDA linear memory blocks |
ImFusionCore
| Tags | Description |
| Added | Log::setGlobalLevel() now returns the old level to reduce boilerplate code on the call site (often you want to restore the original level later). |
| Added Removed | Added the DeprecatedSignal class to the Signal framework, which allows for providing a deprecation layer for Signal name and signature changes. Removed the deprecated SignalImpl::emitSignalRecursive() function. Use SignalImpl::allowOneRecursion() and SignalImpl::emitSignal() instead. |
| Changed Deprecation | Renamed Geometry::CuboidAA to Geometry::AlignedBox and Geometry::RectangleAA2D to Geometry::AlignedRectangle2D. |
| Changed | Merged the functionality of ImFusionLib's Bounds class into Geometry::CuboidAA so that it can take over its responsibilities. Both classes represent the same semantic concept of an axis-aligned cuboid, however were historically used for different use cases. This change allows for removing Bounds in favor of using only Geometry::CuboidAA. |
| Added |
|
| Fixed | Fixed Platform::memoryInfo() incorrectly returning kiloBytes instead of Bytes on Linux systems. |
| Fixed | Fixed a bug in the Parameter<T> move ctor where the newly created instance would fail to have the original value for non-trivial types such as std::string. |
| Added | Added Properties::clearParamsOnly() to clear all parameters but keep the sub-properties. |
| Added | Added String::splitCamelCase() to split camel case strings into words. |
| Added | Added Container::casted<T>() convenience function to perform a static_cast on all elements of a container. |
| Added |
- Added support for dynamic Eigen-Matrices in Properties.
- Added overload of Properties::setParam with ParamType argument. This allows saving the type of a parameter passed to Properties via an initializer list.
|
ImFusionCranialPlugin
| Tags | Description |
| Added | Added algorithms for skull segmentation in CT scans. |
ImFusionDicom
| Tags | Description |
| Added | Added a dialog for overriding the anonymization profile to DicomEditor. |
ImFusionGL
ImFusionGraph
| Tags | Description |
| Added | Added an algorithm to partition a graph into its connected components. |
| Added | Added an algorithm to combine multiple graphs into a single unified graph. |
ImFusionML
| Tags | Description |
| Removed | Removed deprecated LabelTag and MarkAsLabelOperation and related utils functions. Use TargetTag and MarkAsTargetOperation instead. |
| Added | Added ML::hasNoZeroTargetImage filter and registered has_zero_target_image function to create training pipelines that filter out images with empty target images. |
| Added | Added PadOperation and PadDimsOperation, which allow to pad an image by respectively specifying the padding widths or the target dimensions. |
| Added | Added RemoveMaskOperation, which allows to remove the mask of input images. |
| Changed Deprecation | Overhaul of ModelConfiguration class design. The class is now a Configurable object grouping together Parameters for correctly configuring a MachineLearningModel. Configuration of the Engine and of the Sampling strategy are now sub-configuration objects as well. The previous setter/getter interface of ModelConfiguration is deprecated, instead the user can directly access the Parameters. Additionally, version 6 of the Yaml Configuration is introduced, where all parameters related to the Engine are now grouped together under the Engine keyword. This allows the user to define and parse parameters specifically for an Engine, rather then adding a new field to ModelConfiguration. See Machine Learning/Changelog of the Inference YAML Configuration in the User Documentation. |
| API-Break Changed | Make deprecated Operation::processImages/processPoints/etc functions protected. To execute an operation easily, you should now use the Operation::process functions instead. |
| Added | ResampleKeepingAspectRatioOperation, which allows to resample to fixed width/height/slices while keeping aspect ratio. |
| API-Break | CheckDataOperation bindings argument name changed from label_values_check_subset to check_label_values_are_subset |
| Changed Fixed | Fixed ForegroundGuidedLabelUpsamplingOperation boundary refinement to prevent specific labels from being removed. |
| Fixed | Changed processing policy of InvertOperation so that labels are not processed by default. |
| Fixed | Fix uncaught exception in OperationSequenceAlgorithm when an image sampler is provided an invalid ROI size. |
| Changed Breaking Fixed | OperationsSequenceAlgorithm::outputBoundingBoxes() now returns an optional BoundingBoxSet by value instead to avoid dereferencing nullptrs. |
| Changed Breaking | Simplified DataElement to make better use of the underlying Data types. The methods content and setContent are now part of the base DataElement class, with setContent a pure virtual to allow specific behaviour in derived classes. Breaking change: the content() method in classes derived from DataElement now return std::shared_ptr<Data> instead of the specific type. Each derived class now has additional methods for directly accessing the underlying typed data, i.e. std::shared_ptr<SharedImageSet> SISBasedElement::sis(), std::shared_ptr<KeypointSet> KeypointsElement::keypoints() and so on. Breaking change: In the python bindings of KeypointSet and BoundingBoxSet the implicit conversion from numpy arrays was removed. Note: This PR introduces a lot of forward declarations in DataElement/DataElements/DataItem headers. If you experience any issues at compile time, you probably need to include one of the following headers: ImFusion/ML/DataElements.h, ImFusion/Base/SharedImageSet.h, ImFusion/ML/KeypointSet.h, ImFusion/ML/BoundingBoxSet.h, ImFusion/ML/Tensor.h, ImFusion/GL/GlFilterSet.h |
| Fixed | Fix OneHotOperation when using the GPU and more than 4 output channels leading to truncated channels. |
| Changed Breaking | PersistentCacheDataLoader now directly saves/loads cached item in imf format. This breaks existing disk caches, which need to be regenerated. |
ImFusionReg
| Tags | Description |
| Added Changed | Added DeformableIcpAlgorithm for deformable registration of meshes or point clouds representing curves. |
ImFusionSeg
| Tags | Description |
| Added Changed | Added the parameter p_closeHolesAtImageBoundaries to LabelToMeshAlgorithm signaling if the resulting mesh should be closed in case the corresponding label touches any of the image boundaries. Changed the behavior such that p_closeHolesAtImageBoundaries is now enabled by default. |
ImFusionSpinePlugin
| Tags | Description |
| Added | Added segmentPelvis() function to SpineBaseAlgorithm to enable new segmentation models. Added segment_pelvis python bindings. For new models, segmentPelvis() will be required. For older models, segmentPelvis() calls segmentSacrum() and segmentIlium() when necessary. |
| Changed API-Break | Refactored SpineLocalization2DAlgorithm and added it to the algorithm factory. |
ImFusionStream
| Tags | Description |
| Added Changed | In LiveTrackingPointRegistrationAlgorithm and LiveTrackingPointRegistrationController:
- Added support for relative tracking with two options: adjusting the calibration matrix of the relative tracker or adjusting the registration matrix of the volume
- Added drawing of volume points to be updated when image matrix changed
- Changed point correspondences to be configurable
- Changed volume points to be stored in image coordinates In ToolVisualizationAlgorithm
- Calibration of relative tracker is now taken into account
|
| Added | Added TrackingInstrumentComboBox to autofill and update a QComboBox with all instruments of a TrackingStream |
| Added | Added DisplayHandler and associated widget to visualize polydata streams. |
| Changed Deprecation API-Break | Renamed LiveTrackingStream to TrackingStream. A deprecation layer is in place so that code using LiveTrackingStream still works. There is one minor exception: forward declarations of LiveTrackingStream must be replaced with TrackingStream.
- The class LiveTrackingStream was renamed to TrackingStream to make it more consistent with other streams within the Stream Plugin, which are all supposed to be "live".
- Data kind LIVETRACKINGSTREAM was renamed to TRACKINGSTREAM.
- As a corollary, related classes such as LiveTrackingProperties and SmoothedLiveTrackingStream, functions, members, and factory names have been renamed as well. Note that the class TrackingSequence was called TrackingStream prior to version 3.0 with a deprecation layer up until version 3.10.
|
| Added Deprecation Removed API-Break | Extended LiveTrackingStream interface to manage its TrackingInstruments. Added protected helper functions to easily create/update/remove a TrackingInstrument and emit updated TrackingStreamData. Deprecated accessing main instrument by index in LiveTrackingStream. The instruments should be preferably accessed and identified by the unique id (or alternatively by name). Removed deprecated updateListenersDeviceSet of LiveTrackingStream. Renamed TrackingInstrument member buttonStatus to statusFlags. |
| Added | Added StreamGroup and CompoundStreamData for grouping and joint handling of multiple streams |
| Added Changed | Renamed FusedLiveTrackingStream to CombinedTrackingStream. Added CombinationInstruction configurable for simple algorithm configuration based on stream name and instrument TrackerID. Added controller for CombinedTrackingStream to configure stream within the Suite. |
ImFusionUS
| Tags | Description |
| Fixed | Sweep cropping algorithm works now with any shared image set data. If tracking or frame geometry data is present, it will also correct tracking by calibrating the tracking matrix, or flip/and offset the frame geometry if requested. |
| Fixed | Fixed assertion when deleting data being used by the USCalibration algorithm. Deleting sweep data used by the USCalibration algorithm now correctly closes their associated properties windows. |
| Added | The UltrasoundRegistrationAlgorithm now supports 4D-4D registration with GatingMetadata on the US volumes, as long as no deformation model is turned on (i.e. only in the linear transformation case). |
Version 3.12, released on 2024-10-02
ImFusionLib
| Tags | Description |
| Fixed | Added LinkHandler in LinkPose. Handlers can be registered e.g. from custom plugins to support pose linking for custom Data types. |
| Changed Deprecation | Changed MeshPostProcessingAlgorithm into MeshProcessingAlgorithm Deprecated MeshPostProcessingAlgorithm |
| Fixed | Fixed a crash in DefaultAlgorithmController when the focus widget got destroyed during reconfiguration of the Controller |
| Removed | Removed AlliedVision, IDS and JAI industrial cameras related code. All this functionality has been migrated to the new plugin IndustrialCameraPlugins |
| Fixed | Fixed that EnumParamControl was not updating the ComboBox items when the parameter values deriving from its attributes had changed. Before only a change in the number of ComboBox items was triggering its update. |
| Changed API-Break Added | Added class TrackerID for tracking instrument identification. TrackingInstrument holds a member TrackerID that replaces members id, name, modelNum now. |
| Added | Added GlVolumeView::RenderBufferWrapper to allow surrounding the entire rendering pipeline with a custom render buffer and thus modifying the rendering output before visualization with a custom shader. |
| Fixed | Fixed dense pointcloud storage to be able to correctly load pixel-to-index maps again. |
| Fixed Added Changed | Fixed mesh not updating in view after certain postprocessing tasks. Added an overload to MeshPostProcessingAlgorithm::setDecimationParam that allow specifying the maximum surface error Changed the default maximum surface error in the legacy implementation to something less prohibitive (now depends on maxEdgeLength) |
| Fixed | Fixed crash in TrackingSequenceIO::configure when location ends in ".csv". |
ImFusionAnatomyPlugin
| Tags | Description |
| Changed | ConvertToMultiLabel uses AS identifiers to map meshes to label values. Label map values are consistent across frames and identifiers are encoded in a LabelDataComponent. This joins the labels maps of AS have identical identifiers whereas they had separate values based on their indices before this change. |
| Fixed | Fixed GenericASC::cloneImpl to correctly clone AnatomicalStructure level structures too. |
| Changed | Refactored the visualization infrastructure used by the AnatomicalStructureCollectionDisplayHandler to perform fewer full-ASC updates. Changes to KeyValueStore objects now also trigger a signalKeyValueStoreChanged signal for non-Data objects on matrix changes. |
ImFusionCT
ImFusionCore
| Tags | Description |
| Fixed | Fixed move and copy semantic in Parameter and SubProperty. Previously, when (move) assigning one parameter to another only the value was copied or moved but not the rest of the object. |
| Added |
|
| Added | Added GlobalSettings, a framework for persistent platform-independent application settings. |
ImFusionCranialPlugin
| Tags | Description |
| Added | Added algorithms for skull stripping, MRI sequence classification, tumor segmentation and vessel segmentation. |
| Added | First commit of the Cranial plugin with algorithms for brain parcellation and hypothalamus sub-structures segmentation. |
ImFusionDicom
ImFusionML
ImFusionStream
| Tags | Description |
| Added | Added ConnectionFactory.h and moved the ConnectionBase.h, ClientConnectionBase.h, ServerConnectionBase.h, files to a dedicated Network folder (under ImFusionLib/Source/Stream/). Updated the includes in the WebsocketConnection.h. Added a ConnectionFactory.cpp file that creates, manages available connection protocols and allows for the creation of connections. Updated the CMakeList.txt with the new entries. |
| Changed | Members m_state, m_nextRequestedStateChange, and m_workContinuation of Stream have been made private to make the behavior of the state machine and streaming loop more explicit. |
| Added Changed | Moved kind() method of various images streams to base class, and added a signal for the case that the stream's dimensionality changes. This allows stream controllers to update stream visibility in compatible views. |
| Removed | Removed finalizeRecording from Stream. Finalization of recordings should be implemented in the recorder itself. |
Version 3.11, released on 2024-08-09
ImFusionLib
| Tags | Description |
| Changed | Changed the default behavior of the ImageResamplingAlgorithm::p_createNewImage parameter for images of modality ULTRASOUND: Previously, it would be true for all images except for ultrasound images where it would be initialized with false. The new behavior is that the default value of that parameter is always true, which is now also reflected in the header. |
| Added Changed | Added SharedImage::bounds() function. Fixed SharedImageSet::bounds() function to correctly incorporate the half-pixel extent around the pixel centers of the edge pixels. |
| Changed API-Break Added | Renamed GlFFDeformation to FreeFormDeformation, added bindings for FreeFormDeformation |
ImFusionAnatomyPlugin
| Tags | Description |
| Changed | AnatomicalStructureCollectionDisplayOptions::id() now correctly returns "ASCDisplayOptions" as opposed to "SpineDataDisplayOptions". Old files are loaded with the new data component. |
| Changed | KeyValueStore::set now also accepts invalid input, but returns false in this case and clears the entry for the given key. |
| Changed API-Break | Make AnatomicalStructureCollection::empty() not equivalent to size() == 0 but to size() == 0 AND AnatomicalStructure::empty() |
ImFusionCT
ImFusionCUDA
| Tags | Description |
| Added | Added Program class for kernels compiled at runtime |
| Added | Added KernelBuffer and some utility functions for use in device code |
| Added | Added DeviceBuffer and ArrayBuffer, as well as associated memory management functionality |
ImFusionCore
| Tags | Description |
| Added | Added the String::fromDouble helper function which returns the string representation of a double value. |
ImFusionDicom
ImFusionGL
| Tags | Description |
| Changed | Added convenience member functions to GL::Viewport. Changed the default-constructed state of GL::Viewport to be empty (width = height = 0). |
ImFusionImageMath
| Tags | Description |
| Added Changed | Added binding for IM::Variable. Removed has_variable assertion in PolyWrapper |
ImFusionML
| Tags | Description |
| Changed | Display warning when a parameter passed in Operation::Configure is not used or cannot be parsed (which might indicate a typo). Changed the way manually configured parameters of ML::Operations should be declared. Now all parameters are expected to be registered into their operation (the third argument of their constructor should be this instead of nullptr). Then, their auto-configuration needs to be disabled, for instance by calling Operation::setManuallyConfiguredParameters in the constructor of the derived operation). |
| Changed | Bumped version number of YAML files for model deployement (4 -> 5). In the new version, Sampling/SkipUnpadding defaults to True for better performance. |
| Changed | Changed type of background_threshold parameter in ML::ArgMaxOperation to optional. |
| Added | Added runKeypointGnn and GNN namespace to facilitate running Graph Neural Networks together with the Graph plugin. |
| Added | Adds ML::Tensor and ML::TensorElement classes. These experimental classes allow direct control of the tensors that are passed to and received from the MachineLearningModel, unlike the SISBasedElements that go through various manipulations and have limits on their dimensionality. |
ImFusionStream
| Tags | Description |
| Fixed | Fixed a bug in the ToolVisualizationAlgorithm for the translation only more, i.e. p_linkWithRot == false. The matrix for the axial view was not correctly computed which resulted in a constant flipping of the view. |
| Added | Added several features to the ToolVisualizationAlgorithm:
- p_projectiveRendering can now be set to enable projective rendering of the tool in the MPRs.
- p_snapToClosestAxis can now be enabled which will ensure that the first view will remain an axial view, etc..
- p_ignoreInPlaneTranslation can now be set to ignore the in-plane part of the translation. I.e. the position of the dataset in the views can be chosen more freely.
|
Version 3.10, released on 2024-07-08
ImFusionLib
| Tags | Description |
| Added API-Break | Next iteration of mesh rendering refactoring to allow for more modularity:
- Extracted individual low-level renderer classes GlMeshRendererSurface, GlMeshRendererIntersection, GlMeshRendererNormals, and GlMeshRendererContours implementing concrete mesh rendering techniques. Each has their nested DisplayOptions nested struct encapsulating their rendering options.
- Introduced MeshGl class to store and synchronize vertex and texture data of a Mesh on the GPU. Instances of this class serve as main input to the render() function of the renderers above.
- Refactored MeshDisplayOptions: This class does no longer duplicate the settings of GlMesh as individual parameters but instead aggregates the DisplayOptions from the renderers above.
- The internal implementation of GlMesh was adjusted to use the renderers above. However, to the outside it should behave the same as before.
|
| Added | Added new DataAnnotationFactory::cloneData() interface which plugins can overwrite to enable the cloning of custom types in Base. Also added cloneData() convenience method to FactoryRegistry for easier usage. |
| Fixed | Explicitly check for cycles in ImFusion::TrackingSequence::setRelativeTracking() and do not change the relative tracking if a cycle would be created. |
| Changed | Constructor of SharedImageSet now sets topDown property to true. |
ImFusionCore
| Tags | Description |
| Fixed | Fixed a bug in Signal where calling emitSignal() would erroneously move the payload into the first connected receiver and subsequent receivers would only see the moved-from state. |
| Added | Properties::Param of type Properties::ParamType::Path can be returned as, or created from, std::filesystem::path. |
| Fixed | Fixed the handling of numeric_limits<double>::max in Properties, which was leading to broken double Properties params. |
| Added | Added Transform and Vector to define explicit coordinate frames for matrices and vectors. |
ImFusionDicom
ImFusionGraph
ImFusionImageMath
| Tags | Description |
| Fixed | Fixed a faulty check in the IM reduction CPU path (also affects runtime polymorphic reduction path). It was treating single-frame SIS as SI. |
ImFusionML
| Tags | Description |
| Added Changed | After upgrading pytorch to 2.2, many previously unsupported pytorch operations are now supported in float16 on the CPU. However, due to various reasons, the performance is much worse than in float32. Therefore, casting to float32 for CPU inference is introduced if the dtype of any layer of the module is in float16 or bfloat16. This also fixes float16 CPU inference for pytorch 1.13. This does not affect model weights in float64, or any other dtypes, such as int8, int4, etc. |
| API-Break | ML::ApplyTopDownFlagOperation sets topDown=true as opposed to topDown=false now. This is to be consistent with the rest of the framework. ApplyTopDownFlagOperation sets topDown=true as opposed to topDown=false now. This is to be consistent with the rest of the framework. |
| Changed | Changed random distribution of RandomChoiceOperation implementation to avoid compiler / platform dependent results. |
| Added Changed | Defined more clearly the difference between ML::VectorElement and ML::ImageElement: VectorElements can only be created from 1x1x1 images, all other images should be ImageElements. An exception is raised if this is not the case. Added some helper methods to convert these elements to/from torch tensors. |
| Added | Renamed parameter reload of ML::PersistentCacheDataLoader to reload_from_disk to make it less ambiguous. reload is deprecated but should still work. Renamed parameter reload of PersistentCacheDataLoader to reload_from_disk to make it less ambiguous. reload is deprecated but should still work. |
ImFusionSpinePlugin
| Tags | Description |
| Changed | Removed model path parameters from SpineBaseAlgorithm. Use modelSet() to set and access model paths if needed. |
ImFusionStream
ImFusionUS
Version 3.9, released on 2024-05-29
ImFusionLib
ImFusionDicom
| Tags | Description |
| Fixed | Fixed a crash when loading a DICOM file with missing SpecificCharaterSet and non-ASCII, non-UTF8 encoding. |
ImFusionGL
| Tags | Description |
| Fixed | Fixed a bug in the dependent shader includes if multiple multi includes use a dependent include of the same type but each yields different shader code. |
| Added | Introduced GL::LineRenderer, a helper class dedicated for high-quality thick and stippled line rendering. Its functionality partially overlaps with the line rendering feature of GL::FixedFunctionPipeline, however they have slightly different use cases:
- FixedFunctionPipeline is general purpose and allows for directly rendering any vertex buffer. However, it requires geometry shader support which is absent in OpenGL ES environments.
- LineRenderer also works in OpenGL ES contexts since it only uses basic vertex and fragment shaders. However, therefore it requires some preprocessing of the input vertices on the CPU.
|
| Added | Migrated GL::ProgramCache, a base version of GlProgramIncludeManager, from ImFusionLib to ImFusionGL. |
| Changed Depreaction | Migrated GL::ObjectPicking from ImFusionLib to ImFusionGL. The functionality has essentially remained the same. Instead of using GlObject pointers to identify object it now uses plain void pointers. GlObjectPicking has become deprecated. |
ImFusionImageMath
| Tags | Description |
| Fixed | Fixed a bug in the deformation and mask support for multi-includes. If e.g. you had two OperandMasks of different masks the shader code was not correctly generated. |
| Fixed Changed | Reduced object sizes for ImageMath expressions. Introduced ImageMath::internal::TaggingIndex to support more complex hashing during tagging of the expressions. |
ImFusionSpinePlugin
| Tags | Description |
| Changed | In all vertebrae of the SpineTemplate, adjusted pedicle keypoints to be in center of the pedicles. Also modified body positions in cervical vertebrae. These changes affect vertebrae position keypoints of all vertebrae. |
ImFusionVision
| Tags | Description |
| Added | Added optical flow and stereo reconstruction algorithms based on machine learning (named RAFT and RAFT-Stereo). Refactored Optical flow classes. |
Version 3.8, released on 2024-04-26
ImFusionLib
| Tags | Description |
| Added | Introduced new DataLogger::addAsFile methods that allow to log data to a temporary folder, and automatically receive it on an ImFusion Suite instance on the same computer. |
| Deprecation | Deprecated Image::operator==() in favor of ImageDescriptor::operator==(). |
| Changed | DataSourceComponent now store their history (instead of just the latest file it comes from). This means that the history of an image is now saved and stored, which is particularly useful for traceability purposes. |
| Added | Add support of IMFUSION_PLUGIN_BLACKLIST environment variable to prevent the framework to load a subset of plugins. This variable is expected to contain a list file names separated by a semi-colon, e.g. Foo.dll;Bar.dll. |
ImFusionCore
| Tags | Description |
| Fixed | Fixed serialization of std::vector<Filesystem::Path> and std::vector<Filesystem::Url> to and from Properties instances. |
| Fixed API-Break | Fixed a potential race condition in Threading::ThreadPool::enqueueSignaled() where the signal callback function could be called before the result of enqueueSignaled() was assigned to the future. The new version of the function no longer returns a std::future but instead has the callback function consume the return value of the asynchonous operation. |
| Changed API-Break | In PropertiesIO, extended Xml1_1WithAttributes format to also store a "type" attribute for the parameters. Introduced the new formats Json2_0 and Json2_0NoPreamble, which also maintain type information except for the ParamTypes Vector and Matrix (due to lost information about their dimensions after serialization). The type information is then reloaded when the appropriate PropertiesIO's load functions are called.
Breaking changes:
- The PropertiesIO::saveToXML() and PropertiesIO::saveToJSON() have been refactored to accept the format as third parameter instead than as forth parameter. Also, this format parameter does not receive a default argument anymore.
- JsonNoPreamble has been renamed as Json1_0NoPreamble.
|
| Added Changed | Added convenience functions for Properties:
|
| Added | Added Container::LRUCache::extract() member function. Allow a maximum cost of 0 for Container::LRUCache to disable caching. |
ImFusionGL
| Tags | Description |
| Changed API-Break | Improved implementation of GL::OffscreenRenderHelper: Made call to blendToParent() optional to allow for use cases where you want to perform custom blending. This also improves the lifetime semantics of GL::OffscreenRenderHelper::RenderBuffer so that you can no longer accidentally leak resources. RenderBuffer is now a move-only type that automatically disposes its resources on destruction. |
ImFusionStream
| Tags | Description |
| Removed | Removed previously deprecated legacy stream compatibility layer StreamLegacy and StreamListener. These previously had been replaced by the Signal-based classes Stream and SignalReceiver respectively. |
ImFusionUS
| Tags | Description |
| Added | Extended US::GlSweepCompounding to support float and int16 data types in addition to uint8. Extended US::GlSweepReconBackward to support the float in addition to uint8, as well as up to four channels. |
Version 3.7, released on 2024-03-22
ImFusionLib
| Tags | Description |
| Changed | Extended SequentialImageProcessor interface to be able to also accept and return a DataComponentList in addition to the images. |
| Added | Introduced the new VitalsDataComponent for storing vital sign data, such as heart rate, ECG, and oxygen saturation. |
| Added | TrackedSharedImageSetPropertiesAlgorithm now supports defining sampling timeout criteria, so it becomes possible to overcome the median gap issues with very high frame rates when performing robotic ultrasound sweep. The feature is available via the TrackedSharedImageSetProperties.ui, where the user can define the timeout in ms by selecting average or median value computed from the TrackingSequence or SharedImageSet timestamps accordingly. Additionally, a manual adjustment of the computed criteria is also available. |
| Fixed | Fixed PngIO loader when opening PNG files with format PNG_COLOR_TYPE_GRAY_ALPHA. |
| Added | Added numeric color values (HSV+A and RGB) to ColorPickerWidget |
ImFusionCore
| Tags | Description |
| Changed | Changed minimum required C++ standard version for ImFusionCore to C++ 20. The other components of the ImFusion SDK retain the C++17 standard. |
| Changed Fixed | Changed implementation of Random::Generator::shuffle() to make it platform-independent. It will now exhibit the behavior of MSVC 2019 on all platforms. |
ImFusionDicom
| Tags | Description |
| Changed | Dicom::VolumeReconstruction::maxTransformationDigits now also works with ImagePositionPatient tags which are stored inside a sequence. This extends support for low precision of ImagePositionPatient values to e.g. EnhancedCTImage or EnhancedMRImage SOPs. |
ImFusionImageMath
| Tags | Description |
| Fixed | Several fixes for image math:
- Fixed ChannelWiseScalarGl and ScalarGl for multi includes. There was a bug which prevented the uniforms from being set.
- Removed unintentional operator in ExprBaseTpl.h
- Fixed a bug in MaskLeafGl which resulted in uninitialized uniforms
- Adjusted a static_assert in ResampleTpl to be less strict.
|
ImFusionML
| Tags | Description |
| Added | Added new machine learning inference engine pycoreml using the Python engine interface. CoreML is Apple's framework for accelerated machine learning utilizing CPU, GPU, & Neural Engine on Apple platforms. As of now, model conversion is not included to allow fast cold starts and avoid dependencies to pytorch. |
| Added | Added functionality for Graph based pipelines with multiple sources. With this change, DataLoaders now can have multiple sources, and data loader specs have an inputs and output field to construct the graphs This is backwards compatible with regular DataLoader flows. |
| Added | Added hasNoZeroInputImage function, and registered 'has_zero_input_image' filter. Can be used to filter out input images that only contain zeroes by providing 'has_zero_input_image' as a 'filter_function_key' to a FilterDataLoader. |
| Added Changed | Added ML::BakeDeformationOperation to apply the deformation to the input images. Changed ML::DeformationOperation to not attach anymore a deformation to the input images. |
| Changed | Added ML::RandomSmoothOperation. Allow smoothOperation parametrization in mm and anisotropism. |
| Changed Fixed | Changed ML::ArgMaxOperation to select the first channel in case of a tie instead of the last. Fix to ImageResamplingAlgorithm when resampling outside the reference image on the CPU. |
| API-Break | DataItem::Elements is changed to OrderedMap instead of std::map for now. You can rely now on insertion ordering. |
ImFusionStream
| Tags | Description |
| Added Deprecation Removed | Extended ImageStreamData to allow per element DataComponents for the annotation of multiple samples. Deprecated constructor of ImageStreamData taking MemImage pointer. Removed deprecated getter and setter of ImageStreamData. |
ImFusionUS
| Tags | Description |
| Added | Added loading of ECG data and heart rate to the Philips 3D DICOM data loader. |
| Added | Added inverse operation mode to ScanConversion3D and a DataComponent FrameGeometry3D, that describes the frame and scanline geomety of a 3D US image. Added support for labelmaps to ScanConversion3D. |
| Added | Philips 3D DICOM data loader: Introduced settings defining which type of data to load (Screencapture, scanlines, or scancoverted volumes). |
| Added | Added parameter to ScanConversion3D that specifies the desired output volume spacing. |
Version 3.6, released on 2024-02-22
ImFusionLib
| Tags | Description |
| Added API-Break Changed | Added free functions GlUtils::shiftScaleStorageToNormalized and GlUtils::shiftScaleOrignalToNormalized to retrieve storage and normalization constants. Added CPU cross correlation function for 3D images. Changed return type of Math::crossCorrelation to std::unique_ptr<TypedImage<float>>. Adapted GlConvolutionFilter to support 1D kernels for 3D images and signed input and output types. |
| Changed | Changed behavior of GlSliceRendererImage to always use blending for all images. Previously blending was used for all but the first image. |
| Changed | A volume view's clipping plane is by default automatically applied to applicable GlObjects rendered in it, most notably meshes. Any clipping planes set to meshes rendered in a 3D view before will thus be overwritten. This behavior may be turned off by via GlVolumeView::setApplyClipPlaneToGlObjects(). |
| Changed | ImageResamplingAlgorithm skips the computation if no resampling is necessary. If the algorithm is configured not to work in place, then a simple copy of the input image will still be created. |
| Fixed | Fixed a bug in ImageResamplingAlgorithm which was padding images with a signed type with non-zero values. The issue only appeared when resampling an image on the GPU, with a reference image. |
| Fixed | Fixed a potential driver timeout/crash in the GPU path of MeshToLabelMapAlgorithm in cases where the dataset/output volume resolution becomes too large. |
| Changed | Add the DefaultAlgorithmController::setAddAlgorithmToHistory() parameter allowing to enable/disable algorithm workspace registration on compute. This is needed when an algorithm is added as a SubProperties in another algorithm controller, where it would otherwise create a redundant entry in the configurable properties with empty algorithm name. |
| Added Changed Deprecation |
- Introduced unique IDs for algorithms independent of their GUI names.
- Deprecated and replaced large portions of AlgorithmFactory, and FactoryRegistry interfaces.
- Deprecated IoAlgorithmFactory. To update plugins:
- Update your Factory registration to use IDs in addition to GUI names.
- If you have an IOAlgorithmFactory, merge it into your AlgorithmFactory.
- Update all calls to createAlgorithm(), createIoAlgorithm(), and compatibleAlgorithms() to the new API.
|
ImFusionAnatomyPlugin
| Tags | Description |
| Changed API-Break | Overhaul of predefined keys for KeyValueStore. Keys are now defined and automatically added to a KeyRegistry using macros in Keys.h. The KeyId enum and the KeyString class have been removed. KeyValueStore now directly uses std::string instead of KeyString as key type. Old key strings stored in imf files are automatically converted to new ones during loading. |
ImFusionCT
ImFusionCore
ImFusionDicom
| Tags | Description |
| Changed Fixed | By default AdvancedDicomSCP does not offer all possible transfer syntaxes, but only JPEG2000Lossless (if available) and the default uncompressed formats. This avoids situations where a PACS server would send datasets that then cannot be decoded correctly. It also avoids the unlikely case that a PACS would send lossless data with a lossy compression. The old behavior can be restored by supplying a configuration file for pacsClientConfiguration in DicomPluginSettings. |
| API-Break | Some members of RTStructureDataComponent have been changed. The color attribute is now part of the RTStructureDataComponent and no longer of the individual contours. Even before, only the color of the first contour was used, so there is no functional difference in the new version. The referencedFrameOfReferenceUIDs member has been changed to referencedFrameOfReferenceUID. Each RTStructureDataComponent therefore only references one dataset now. This reflects how datasets are referenced in DICOM: each ROI (i.e. PointCloud with RTStructureDataComponent) has exactly one ReferencedFrameOfReferenceUID. The ReferencedFrameOfReferenceSequence, that was used before, is optional in DICOM and its absence would have broken the rendering of the RTStructs. |
| Changed Fixed | The location URL used by DicomIoAlgorithm now also supports a 'study' query that should contain a StudyInstanceUID. This query is now always set when a PACS URL is created. The StudyInstanceUID will be added to any SERIES or IMAGE level C-FIND and C-MOVE request, as required by the standard. This change improves interoperability with different PACS vendors. |
ImFusionGL
| Tags | Description |
| Changed API-Break | Added support to rendering from multiple VertexBuffers at the same time. This can be achieved using the revised VertexArrayObject interface. - Warning
- The behavior and correct way to use GL::VertexArrayObject has changed and you must update your code accordingly.
|
| Added | Added GL::SyncObject wrapper class for using OpenGL sync objects (fences). |
ImFusionLiveUS
| Tags | Description |
| Deprecation API-Break | Moved all classes of the module into the ImFusion::US namespace, and renamed the classes listed below. If there are forward declarations to classes from the US module, it is required to either change the forward declaration to the namespace ImFusion::US, or remove it and include the class header instead. Example compiler message for that situation: error C2371: 'ImFusion::UltrasoundSweep': redefinition; different basic types.
Renamed classes:
- FreehandUSWorkflowAlgorithm renamed to FreehandUltrasoundWorkflowAlgorithm
- FreehandUSWorkflowController renamed to FreehandUltrasoundWorkflowController
- LiveUltrasoundGeometryDetectionAlgorithm renamed to LiveGeometryDetectionAlgorithm
- TrackingEstimationUSWorkflowAlgorithm renamed to TrackingEstimationWorkflowAlgorithm
- TrackingEstimationUSWorkflowController renamed to TrackingEstimationWorkflowController
- UltrasoundBoneSegmentationStreamAlgorithm renamed to BoneSegmentationStreamAlgorithm
- UltrasoundBoneSegmentationStreamController renamed to BoneSegmentationStreamController
- UltrasoundFrameGrabbingAlgorithm renamed to FrameGrabbingAlgorithm
- UltrasoundFrameGrabbingController renamed to FrameGrabbingController
- UltrasoundStreamClassificationAlgorithm renamed to StreamClassificationAlgorithm
- UltrasoundStreamClassificationController renamed to StreamClassificationController
- UltrasoundStreamDisplayDataController renamed to StreamDisplayDataController
- USSweepRecorderAlgorithm renamed to SweepRecorderAlgorithm
- USSweepRecorderController renamed to SweepRecorderController
- Original names outside of the namespace are preserved but are marked as deprecated
|
ImFusionML
| Tags | Description |
| Deprecation | Deprecated GenerateNetworkTrainingDataAlgorithm, LandmarkAnnotationAlgorithm, ObjectDetectionAlgorithm. |
| Changed | Renamed "greedy" flag of the cache data loaders into "lazy" to make it more understandable. |
| Added | Added operationWeights parameter for non uniformly sampled RandomChoiceOperation. |
| Added | Added GPU recombination mode for MachineLearningModel, for increased performance. Added GPU recombination mode for MachineLearningModel, for increased performance |
| Added API-Break | Python interoperability for ML::Engine. It is now possible to implement a new Engine from Python. An example using the OpenVino framework can be found in imfusion.machinelearning.openvino_engine. Breaking change: ML::EngineInterface is now renamed ML::Engine. |
ImFusionReg
ImFusionSpinePlugin
| Tags | Description |
| Changed | Lowered smoothing factor of mesh smoothing for more precision. |
| Changed API-Break | Overhaul of predefined keys for KeyValueStore. Keys are now defined and automatically added to a KeyRegistry using macros in Keys.h. The KeyId enum and the KeyString class have been removed. KeyValueStore now directly uses std::string instead of KeyString as key type. Old key strings stored in imf files are automatically converted to new ones during loading. Keys in the spine template have been changed to the new ones. Examples:
- Old: KeyId::Vertebra = "imfusion.vertebra" New: Keys::Spine::Vertebra::key = "ImFusion.Spine.Vertebra"
- Old: KeyId::SuperiorEndPlate = "imfusion.superiorEndPlate" New: Keys::Spine::Vertebra::SuperiorEndPlate::key = "ImFusion.Spine.Vertebra.SuperiorEndPlate"
|
ImFusionStream
| Tags | Description |
| Fixed | Fixed ImageStreamCache image update signaling, enabling stream visualization of 3D streams in volumetric views. |
| Added | SharedImageRingBuffer now allows specifying where a new buffer shall be allocated (RAM or VRAM). |
| Fixed | Added SpaceMouseViewManipulationAlgorithm to allow view manipulation via SpaceMouse device. |
| Fixed | Fixed a race condition when accessing OpenGL textures in ImageStreamCache, where the rendered image stream would flicker. |
ImFusionUS
| Tags | Description |
| Removed | Removed deprecated class PointCorrUS. Use PointsStorageComponent and PointsOnImage to store point correspondences on image sets, and the US::SweepGlobalInitAlgorithm for 3D pose initialization of an ultrasound sweep wrt. a volume. |
| Added | Added GPU implementation of 3D Scan Conversion, which is active by default. |
| Added | It is now possible to specify a calibration to be used as a default for any UltrasoundSweep acquired with a given LiveTrackingStream. This calibration should be contained in the InstrumentCalibrationDataComponent with a name in the format *-TrackingInstrumentName, and it will be used by the SweepCalibrator instance when a calibration with the exactly matching name ImagingProbeName-TrackingInstrumentName is not found. |
| Deprecation API-Break | Moved all classes of the module into the ImFusion::US namespace, and renamed the classes listed below. If there are forward declarations to classes from the US module, it is required to either change the forward declaration to the namespace ImFusion::US, or remove it and include the class header instead. Example compiler message for that situation: error C2371: 'ImFusion::UltrasoundSweep': redefinition; different basic types.
Renamed classes:
- UltrasoundBackwardCompounding renamed to BackwardCompounding
- UltrasoundBoneLabelingAlgorithm renamed to BoneLabelingAlgorithm
- UltrasoundBoneSegmentationAlgorithm renamed to BoneSegmentationAlgorithm
- UltrasoundBoneSegmentationBaseAlgorithm renamed to BoneSegmentationBaseAlgorithm
- UltrasoundBoneSegmentationController renamed to BoneSegmentationController
- UltrasoundFrameGrabbingConfigComponent renamed to FrameGrabbingConfigComponent
- UltrasoundFrameGrabbingPresets renamed to FrameGrabbingPresets
- UltrasoundGeometryDetection renamed to GeometryDetection
- UltrasoundGeometryDetectionAlgorithm renamed to GeometryDetectionAlgorithm
- UltrasoundGeometryDetectionController renamed to GeometryDetectionController
- UltrasoundRawDataAlgorithm renamed to RawDataAlgorithm
- UltrasoundRawDataController renamed to RawDataController
- UltrasoundSimDataPrepareAlgorithm renamed to SimulationDataPreparationAlgorithm
- UltrasoundSimDataPrepareController renamed to SimulationDataPreparationController
- UltrasoundSimOptAlgorithm renamed to SimulationOptimizationAlgorithm
- UltrasoundSimOptController renamed to SimulationOptimizationController
- UltrasoundSweepToMeshAlgorithm renamed to SweepToMeshAlgorithm
- UltrasoundTrackingEvaluation renamed to TrackingEvaluation
- US2D3DReconstructionAlgorithm renamed to Reconstruction2D3DAlgorithm
- US2D3DReconstructionController renamed to Reconstruction2D3DController
- USCalibrationInit renamed to UltrasoundCalibrationInit
- USConfidenceMapAlgorithm renamed to ConfidenceMapAlgorithm
- USRFProcessingAlgorithm renamed to RFProcessingAlgorithm
- USSweepCalibrator renamed to SweepCalibrator
- Original names outside of the namespace are preserved but are marked as deprecated
|
ImFusionVision
Version 3.5, released on 2023-12-12
ImFusionLib
ImFusionAnatomyPlugin
| Tags | Description |
| Added | Added 2D/3D registration and shape models. |
ImFusionCT
ImFusionCore
ImFusionDicom
| Tags | Description |
| Fixed | Fixed a bug when loading a PET volume that contains different shift and scale values per frame. Previously we assumed that applying shift and scale does not exceed the range of the underlying type (e.g. 16bit). However, this assumption doesn't always hold for PET. When the shift/scaled values exceed the underlying type value range, we now convert all the slice images to float before reconstructing the volume. |
| Added | When exporting labelmaps as DicomSeg, the TrackingID and TrackingUID tags are now written. Since we are not supporting tracking of multiple structures in a single label (e.g. different lesions in a single label called "Lesions"), the tracking ids just correspond to the segment sequence items. We also don't support loading tracking ids from existing datasets. |
ImFusionImageMath
| Tags | Description |
| Added Changed | Introduce polymorphic CastWrapper and DeviceStrategyWrapper. Relevant changes:
- Renamed Tpl/CastWrapper to Tpl/CastWrapperTpl, and Tpl/DeviceStrategyWrapper to Tpl/DeviceStrategyWrapperTpl
- Introduced Poly/CastWrapper and Poly/DeviceStrategyWrapper
|
| Added Changed | Introduce polymorphic ReductionWrapper. Relevant changes:
- Renamed Tpl/ReductionWrapper to Tpl/ReductionWrapperTpl.
- Introduced Poly/ReductionWrapper.
- Added ReductionWrapperGl::reduceGl()
- Added ExprBase::reduce<>()
|
| Added Changed | Introduce polymorphic ChannelSwizzleView. Relevant changes:
|
| Added Changed | Several ImageMath improvements:
- Introduced ArrayGl::assignGl() which enables direct evaluation of a GlExprInterface.
- Added support to ExprBase to directly evaluate on the GPU without temporary evaluation. Previously e.g. for BinaryOp the two subtrees got evaluated separately using a temporary image.
- Simplified variable substitution in ExprBase.
- Renamed Array::block_access_enabled_type to Array::block_access_enabled.
|
ImFusionML
| Tags | Description |
| Added | Exposed the engine execution provider. |
| Added API-Break | Added RandomKeypointJitterOperation for augmenting all keypoints in all KeypointElements of the DataItem with random jitter that follows a normal distribution with a specified standard deviation and a mean of zero which is individually sampled for all dimensions and added to the keypoint value. DataItem::Elements was changed to std::map instead of std::unordered_map for now. WARNING: Don't rely on the ordering of std::map as it will be replaced with an insertion ordered type in the near future. |
ImFusionSeg
| Tags | Description |
| Changed | Improved the appearance of GlIsolineRenderer. It produces less artifacts when a slice view is not aligned to the voxel grid. However, in some cases, the isoline contains gaps now, which are only visible when zoomed in. |
| Added | Added the ContoursStorageComponent. |
| Added | Added the LabelToFrameBasedPointCloudAlgorithm that creates a FrameBasedPointCloud from a label map and a TrackedShaderImageSet. |
ImFusionStream
| Tags | Description |
| Added | Added an integration for the 3Dconnexion SpaceMouse. The SpaceMouseTrackingStream can report the output of the device as a Cartesian velocity, or optionally accumulate it into a position from the world frame. |
| Fixed | ImageStreams no longer crash when the dimensionality of incoming images change. |
ImFusionUS
| Tags | Description |
| Changed API-Break | Added mode for ultrasound simulation to mask out speckle noise in some areas, e.g. in blood pools. |
| Changed API-Break | The SweepInit3D Algorithm and Controller was split in two modules, named SweepPointCorrAlgorithm (for everything concerning point correspondences) and SweepGlobalInitAlgorithm (for the global registration initialization algorithms as well as penalty functions), each with own Algorithm and Controller classes. |
Version 3.4, released on 2023-11-08
ImFusionLib
ImFusionCT
| Tags | Description |
| Changed Fixed | Changed CT::ConeBeamSimulation to initiate from the pose of CT volume and to include the transformation of CT volume during simulation. Refactored ConeBeamCalibrationSimulationAlgorithm to ensure compatibility with cone beam simulation. Resolved the synchronization issue between the geometry of ConeBeamSimulation and the visualization of projections. |
| Changed | Fixed handling of EOS data which does not have a spacing of 0.179363. Note: The frontal shot is no longer padded, i.e. the two shots have different number of pixel in the x direction. |
| Changed | Extended ConeBeamDisplayOptions with new RenderMode3d::Images to show all images without annotations. ConeBeamDisplayOptions::setRenderMode sets any RenderMode3d if ConeBeamData is available and ConeBeamGeometryVisualisation uses the render mode from ConeBeamDisplayOptions component if present, e.g. set via ConeBeamDataDisplayHandler. |
| Fixed | Fixed scaling issue on fan beam data when changing the source detector distance. |
ImFusionCore
ImFusionGL
| Tags | Description |
| Added | Added support for line-rendering with adjacency information in GL::FixedFunctionPipeline, see ShaderSelection::LineAdjacencyRendering. |
ImFusionSpinePlugin
| Tags | Description |
| Changed Deprecated Added | Refactoring of vertebra cropping. Introduced CropAroundVertebraeOperation, and Operation creates vertebra crops using body, left, and right pedicle keypoints. SpineBaseAlgorithm added segmentVertebraAsImage which yields the prediction of the current segmentation model for the vertebra at the specified index and deprecated methods exportDataCrops, exportLabelCrops and parameters p_exportDataCrops, p_exportLabelCrops. Deprecated CropUtils::createKeypointImage, CropUtils::createCropImage, and CropUtils::CropConfig. Either use MachineLearningModel::preprocessingSequence for the full preprocessing pipeline or CropARoundVertebraOperation and BlobsFromKeypointsOperation for custom crops. |
ImFusionVision
Version 3.3, released on 2023-09-14
ImFusionLib
| Tags | Description |
| Added Removed |
- Added DataGroupingModel to the model hierarchy. This model can group Data displayed in the DataWidget according to their Patient/Study-IDs. The groups are internal to the DataGroupingModel and are not added to the general DataModel. The grouping modality ("None", "Patient ID", "Study ID") can be changed via the options of the DataWidget.
- Removed obsolete grouping functionality in Dicom-Browser and DicomIoAlgorithm
|
| Changed API-Break | Changed the rendering behavior of masked images from per-view settings to per-dataset settings. It is now configured through DisplayOptions2d::maskingMode() and DisplayOptions3d::maskingMode(), respectively. Their boolean useMask setting has been superseded by the more powerful MaskingMode enumeration. The MaskRenderingDecorator interface as well as the maskRenderingMode/maskRenderingColor member functions from ImageView2D/ImageView3D and related classes have been removed. Use the new corresponding member functions in the DisplayOptions classes instead. |
| Fixed | Fixed the jumping of subproperty widgets inside a PropertiesWidget upon reconfiguration. |
| Added | Added support for displaying Deformations to GlVolumeRendererGlobalIllum. This feature is off by default due to the high computational complexity. Use GlVolumeRendererGlobalIllum::setShowDeformations() to enable it. |
| Added | Added a new modality (Data::Modality::DISTANCE) for distance maps, i.e. images representing the distance to some nearest obstacle (e.g. a boundary pixel in a binary image or the surface of a mesh). New algorithms that take a distance map as input should check for this modality. |
| Added | Added LinkSelection class allowing for linking the Selection of multiple dataset implementing the Selectable interface. |
| Changed | SelectionWidget now can handle selections of multiple Selectable Data at the same time provided they have the same size. Playback and selection are separated in UI within the SelectionWidget. |
ImFusionML
ImFusionStream
| Tags | Description |
| Added API-Break | Added enqueueFuture to BackgroundThreadQueue, returns a future to keep track of the task. Extended BackgroundExporter with this functionality, it also returns futures for the async saving tasks. |
ImFusionVision
Version 3.2, released on 2023-07-26
ImFusionLib
ImFusionAnatomyPlugin
ImFusionCT
| Tags | Description |
| Fixed | Fixed issues relating to the recording of cone beam simulation algorithm. Fixed issues relating to the loading of the configuration of cone beam simulation algorithm from workspace file. |
| Changed Fixed | Changed default similarity measure from NCC to LNCC. Fixed optimizer direction issue when switching similarity mode in GeometrySelfCalibration. |
ImFusionCore
ImFusionML
Version 3.1, released on 2023-06-14
ImFusionLib
| Tags | Description |
| Added | Added CombineIntoTrackedSharedImageSetAlgorithm for creating a TrackedSharedImageSet from a SharedImageSet and a TrackingSequence. |
| Fixed Changed | Fixed ImageSetIoAlgorithm to also number the first image in a set when exporting more than one image. Changed ImageSetIoAlgorithm to create separate directories for each image set when exporting more than one set. Changed ImageSetIoAlgorithm to load images in the natural sorting order rather than alphanumeric sorting order. |
| Changed API-Break | Refactored our Animations Framework to no longer have a hard dependency on Qt:
- The Animations::Animation class no longer inherits from QPropertyAnimation. Therefore, it's interface has changed to some extent. However, the majority of the original functionality is still available. The support for a dedicated finalization function has been removed. However, you can check for t = 1.0 in your update function, since the backend guarantees that this is always called at the very end of an animation unless canceled.
- You can now choose between different backends depending on the GUI/event loop framework that you use in your application.
- The animationsEnabled() state is now considered when running a new animation: if you run a new animation while the backend is disabled, it will not dispatch the animation but only call its update function once right away with t = 1.0. This should simplify client-side code significantly, since you no longer need to check the enabled state yourself.
- The new Animations::UniqueId interface can help you reducing bookkeeping efforts on the client-side.
|
| Added | Added CompoundData interface to enable Data to expose internal datasets to the outside in a generic fashion. The interface is used by DataItemModel and DataWidget. TrackedSharedImageSet implements the interface to optionally expose the internal TrackingSequences, cf. TrackedSharedImageSet::setExposeTrackingAsChildren(). |
| Fixed | Fixed MeshProcessing::Geometry::findDominantPlane using all faces for plane fitting instead of the ones provided by RANSAC scheme, fixed incorrect normal check and other issues. |
| Fixed | Added more generic version of PythonInterpreter::eval function to execute Python code from C++. |
ImFusionCT
ImFusionCore
Version 3.0, released on 2023-05-12
ImFusionLib
| Tags | Description |
| Changed Removed | The update to the new major version 3.0 of the SDK removes the majority of deprecation layers and brings a couple of additional changes:
- TrackingStream was renamed to TrackingSequence to make it clear that is has nothing to do with the Stream Plugin. A deprecation layer is in place so that code using TrackingStream still works. As a corollary, all related classes (such as GlTrackingStream) as well as functions, members, and factory names have been renamed as well.
|
The old Geometry interface from ImFusionLib has been renamed to GeometryLegacy and will continue to exist for a few months. The new Geometry Library in ImFusionCore has been renamed to Geometry.
- The set of clone2() member functions have been renamed to clone().
- Many left-over headers in ImFusionLib forwarding to the actual implementation in ImFusionCore have been removed, e.g. ImFusion/Base/Signal.h, ImFusion/Base/Configurable.h, etc.
- Data::nameChanged was renamed to signalNameChanged for consistency.
Fixed
Fixed Mesh::Geometry::intersection, which was wrongly generating the polygons in some edge cases
Added
Added DataComponentWithParentInterface for DataComponents which need access to their parent data.
Added
Added a modality override to SharedImageSet.
Added
Added possibility to set custom widgets for SubProperties in PropertiesWidget
Deprecation
Marked redundant ImageProcessing::Padding enum alias as deprecated. Use ImFusion::PaddingMode instead. Similarly, added a note to Image::Type that is is redundant to ImFusion::PixelType may become deprecated eventually. Prefer using ImFusion::PixelType for new code.
Fixed
Fixed a bug where the IoAlgorithm interface did not work with the ParameterMixin interface.
Changed Deprecation
Modernized the public interface of ImFusionFile: member functions passing ownership through raw pointers have been deprecated and replaced by the std::unqiue_ptr/OwningDataList counterpart.
Changed
ImageView2D: Move-image highlighting is off by default and can be switched on via the context menu of the view.
Fixed
Fixed potential nullptr access in SettingsDialog.
Changed
Changed default compression mode of ImFusionFileIoAlgorithm to zstd. The default compression mode of the underlying ImFusionFile class remains unchanged.
ImFusionCT
| Tags | Description |
| Added Fixed | Added epipolar lines to X-Ray 2D-3D registration for point+direction and keypoint initialization modes. Fixed issues relating to the history of X-Ray 2D-3D registration. |
ImFusionCore
| Tags | Description |
| Added | New major release of ImFusionCore removing all deprecated interfaces. Furthermore, the Geometry API was moved from the Geometry2 namespace to the Geometry namespace, and some of the particularly verbose geometry class names where shortened such as from RectangleAxisAligned2D to RectangleAA2D. |
| Added Changed | Added Utils::Variant, a specialization of std::variant offering additional convenience member functions for functionality that the standard library only provides in the form of free functions. Changed the return value of the set of Geometry::intersection() functions to Utils::Variant where applicable. |
| Added | Added Encoding::base64Encode() and Encoding::base64Decode() to ImFusionCore replacing the Utils::Base64 infrastructure in ImFusionLib. |
| Added | Added Container::enumerate() helper function to conveniently iterate over collections and have access to both the index and the value at the same time, similar to Python's enumerate(); |
| Added | Added Utils::Overloaded helper for easier implementation of visitors of a std::variant. |
ImFusionDicom
| Tags | Description |
| Added Changed | Multiple labelmaps can now be exported as a single DICOMSEG file. Dicom::DicomSegIoAlgorithm::saveToDataset has been replaced with Dicom::exportSegmentationsToDataset. Automatically cropping the segmentation to only the relevant slices is no longer supported but might be added again in the future (some applications including Labels have problems importing those segmentations again). Factory creating a DicomIoAlgorithm no longer uses a list of input images as references but as multiple layers. References have to be now explicitly set with DicomIoAlgorithm::setReferences. |
ImFusionML
| Tags | Description |
| Changed Deprecation Removed | Renamed ambiguous "Label" concept to "Target", in order to better differentiate between a "learning target" and a "labelmap/segmentation map". This change affects the DataComponent LabelTag -> TargetTag and all related functions (i.e. isLabel(), tagAsLabel(), etc. are now isTarget(), tagAsTarget(), etc.). A deprecation layer for the old naming is introduced. Following this change, the Operation::ProcessingPolicy has now more readable fields ['Inputs', 'Targets', 'Everything']. Compatibility with the older naming is provided in order not to break existing yaml configuration files. Support of the deprecated Operation configuration field "process_label: True/False" is discontinued. Please specify "processing_policy: Inputs/Target/Everything" instead. |
| Fixed Changed | Fixed OrientedROISampler not taking into account the padding_mode parameter. Note that this sampler used to always pad with zero, so be aware that the behaviour might change if you specified another value. |
| Added Deprecation | Added RunMLModelOperation to run an ML model on the input DataItem and add the prediction as extra fields in the item. The operation AddPixelwisePredictionChannelOperation is deprecated. Please use RunMLModelOperation instead, and then merge the fields with MergeAsChannelsOperation. |
| Changed | CutOutOperation and RandomCutOutOperation support for physical units. This change affects the behavior of both operations due to differences in rounding and seeding. Added support for Operations to throw an error instead of warning on unexpected behavior. |
| Changed | FileReader::configure: changed the expected structure of passed in Properties to support indexing individual SIS within a single .imf file. |
| Added | OrientedROISampler can now directly sample from keypoints. Added random_jitter_range to OrientedROISampler, allowing to add random displacement to the sampled crops. |
ImFusionReg
| Tags | Description |
| Added | Added computation of MIND descriptors in the MINDDescriptorAlgorithm. Added support for registration base on local image descriptors. Added dot-product similarity metric. |
ImFusionSeg
| Tags | Description |
| Changed API-Break | Consolidated Segmentation into the Seg namespace. Classes such as ReferenceShape or SegmentedStructure, are now placed in the latter. |
ImFusionUS
| Tags | Description |
| Added | An US::RawDataComponent is added. It holds raw unprocessed image data pertaining to the image it is attached to. The attached images, which are SharedImageSets, are serialized with an ImFusionFile. A UltrasoundRawDataController is added for the UI. It uses the UltrasoundRawDataAlgorithm which performs scan conversions from raw space to rendered space both for image data and points which facilitates conversion of point-based annotations. For the latter, the method FrameGeometry::transfromPoint is added to the FrameGeometry class. The controller and the algorithm can take in a segmentation, interpret it one in "rendered space" and convert to raw space. One can export the raw images to the data model via the controller. |
| Added | UltrasoundRegistrationAlgorithm now can use Deep Learning descriptors for registration. |
Version 2.47, released on 2023-03-24
ImFusionLib
| Tags | Description |
| Fixed | Fixed an issue where the results from HoughTransformAlgorithm where not propagated to the GUI if used from the controller. |
| Changed | If DataComponents cannot be restored when loading an ImFusionFile (e.g. because the required plugins are not loaded), those components are still saved and will be written unchanged when the dataset gets saved to an ImFusionFile again. This behaviour can be controller with the "saveUnrestoredDataComponents" parameter of ImFusionFileIoAlgorithm. |
| Changed | Deprecated Base/Utils/Strings.h header; parseAlgorithmName() and sortAlgorithmNames() have been moved to AlgorithmUtils namespace. |
| Changed Deprecation | The GlImage(unsigned int, ...) constructor overload was deprecated in favor of the more typesafe GlImage(Image::Type, ...) overload. Image::type() now returns the Image::Type enumeration instead of an unsigned int. |
| Changed | TrackingStreams now support interaction through the SelectionWidget. The selection also affects the DataController visualization. |
| Changed | DefaultAlgorithmController now calls setSplitCamelCase(true) on the PropertiesWidget by default. Introduced DefaultAlgorithmController::setSplitCamelCase to change this behavior. |
| Changed Deprecation | Overhauled and modernized ApplicationController interface:
|
| API-Break | RealWorldMappingDataComponent supports multiple mappings now. The mappings can be accessed through the getMappings method. As part of this change, the mapping to Standardized Uptake Values is loaded from PET DICOMs if available. |
| Added | Added implementation of Broyden–Fletcher–Goldfarb–Shanno (BFGS) optimizer. |
| Added | Added BayerPattern decoding to BasicImageProcessing algorithm. |
| Fixed | Importing a TrackingStream from CSV could swap rows and columns of the parsed transformation matrices. The import UI and visualization were also overhauled. |
| Changed Fixed | OptimizingAlgorithm::setOptimizer() emits signalParametersChanged. This fixes an issue where the GUI of the DefaultAlgorithmController was not updated. |
| Fixed Added | Fixed a bug of GlVolumeCompounding when "reference" mode was enabled, where it would create empty images as result. Added GlVolumeCompounding::setInterpolationMode() enabling you to choose between the default linear interpolation or nearest-neighbor interpolation. The latter is particularly useful when compounding label maps. |
ImFusionCT
| Tags | Description |
| Fixed API-Break | Unified conversion texture <-> image coords of the masks in Xray2D3DRegistrationAlgorithm and EOS2D3DRegistrationTest. In particular the z-axis is now also w.r.t. image coordinates, i.e. the z component of min needs to be -0.5 while the one of max needs to be 0.5. We also added a WorkspaceConversion for Workspace files stored prior to this change. |
| Fixed | Fixed issues relating to the loading of the configuration of X-Ray 2D-3D registration algorithm from workspace files. |
| Changed API-Break | ConeBeamData is now topDown by default, i.e. they have the property "topDown" set to true. The projections are defined from the perspective of the source. I.e. the x-coordinate of the image is pointing to the right while the y-coordinate points down. For a regular AP X-ray this means that the patients left is on the right side of the image. The projection matrices are defined in standard OpenCV OR OpenGL convention. ConeBeamGeometry::matrix() provides the OpenGL matrix, i.e. world to normalized (OpenGL) image coordinates ([-1,1] and -1,-1 corresponds to the bottom-left corner of the image). Please not the flip in y which is due to the OpenGL convention. Should you need a matrix which directly maps to normalized image coordinates you can use the new ConeBeamGeometry::matrixWorldToNormalizedImage() method. For ImFusionFiles stored prior to this change we added a conversion. The same is the case for Workspace files, for which we added a WorkspaceConversion. |
| Deprecation API-Break | Deprecation of the major parts of Cone Beam Data as it will soon be removed. Instead we will use a SharedImageSet accompanied by a ConeBeamMetadata DataComponent in future. Instead of the deprecated functions you need to get the ConeBeamMetadata and use the corresponding method from there. We also added several utility functions to CT/Utils.h. I.e. CT::Utils::isConeBeamData(), CT::Utils::makeConeBeamData(), and CT::Utils::getConeBeamMetadata(). All matrix related methods from Cone Beam Data have been deprecated and will log a "ConeBeamData::* called" error message. In particular ConeBeamData::matrix() will no longer provide you with the projective matrix. Instead you need to query the ConeBeamGeometry from ConeBeamMetadata. E.g. CT::Utils::getConeBeamMetadata(cbd).geometry().matrix(0, cbd.size()). |
| Deprecation API-Break | Moved all old/deprecated parts of the CT plugin to a "Legacy" folder. All corresponding algorithms have also been moved in the algorithm context menu in the Suite. They can be found in the "Legacy" submenu. All corresponding parts will be removed in a future version of the Suite. |
| Added | Added GeometrySelfCalibration for auto-calibration of ConeBeamGeometry via optimization over metrics of the reconstruction. |
| Changed | Changed MetalArtifactReduction to use AlgorithmReconstructionDecorator. |
| Added | Added AlgorithmReconstructionDecorator and AlgorithmReconstructionDecoratorController which offer a decorator for algorithms that need a ReconstructionAlgorithm. |
ImFusionCore
ImFusionDicom
| Tags | Description |
| API-Break | All GUI related functionality has been moved to a separate ImFusionDicomGui plugin. For now the ImFusionDicom plugin still links against ImFusionDicomGui. All headers that are moved to the GUI subdirectory are still available in there old locations as well (with a deprecation warning).
If you use any functionality from the ImFusion/Dicom/GUI directory, you should also link against to the ImFusionDicomGui library explicitly with target_link_libraries(<your_target> PRIVATE ImFusionDicomGui).
Some functions in the Dicom::Utils namespace have been deprecated and moved to the QtHelpers namespace. Those functions also have a non-Qt replacement in Dicom::Utils (e.g. Dicom::Utils::parseDICOMTime can be used instead of Dicom::Utils::convertDICOMTime)
|
| Changed | An invalid PatientBirthDate, StudyDate, SeriesDate, StudyTime or SeriesTime now generates a warning (i.e. Dicom::Error with type Warn). |
| Added | Added functionality to group datasets hierarchically by Patient or Study in the DicomBrowser: DicomIoController groups datasets by Patient or Study using the PatientId and StudyId respectively. The grouping criterion (Patient/Study/None) can be changed via a user setting of the DicomIoAlgorithm. Datasets that are grouped by Study are automatically grouped by Patient too. |
ImFusionImageMath
| Tags | Description |
| Changed API-Break | Further split up the CPU and the OpenGL implementations in ImageMath:
- Added ExprInterface class from which ImageMath nodes now must inherit.
- Moved imgDesc() and numImgs() from GlExprInterface to ExprInterface.
- Renamed lhs() and rhs() to lhsRaw() and rhsRaw() in BinaryOpTpl.
- The functions lhs() and rhs() now return GlExprInterface objects and are implemented in BinaryOpBase.
- Similarly, renamed cheapExpression() and expensiveExpression() in StashTpl to cheapExpressionRaw() and expensiveExpressionRaw().
- Moved huge parts of the OpenGL implementation into .cpp files.
|
ImFusionML
| Tags | Description |
| Fixed | GammaCorrectionOperation: fix intensity range computation on GPU. This only affects multi-channel images. |
| Changed API-Break Added | DataItem and Operation now use shared_ptr instead than unique_ptr. The breaking change consists mainly in the return type of Operation::process and related function, which is now shared_ptr<SharedImageSet> process(shared_ptr<SharedImageSet> input). If this change breaks your code, i.e. because you were assigning the result of a call to Operation::process to a unique_ptr, you can fix it by performing a shallow clone of the result, i.e. add ->clone2(SharedImageSet::ShallowImageCopy). Furthermore, DataElements and DataItem are now using shared_ptrs as holder types, thus they don't directly manage the lifetime of the wrapped types anymore. List of breaking changes:
|
| Added Changed | Added PaddingMode parameter to Sampling parameters of ML::ModelConfiguration, deprecated previous MirrorPadding parameter. |
ImFusionSpinePlugin
| Tags | Description |
| Changed | Released Spine v0.2, Including the loading of Ideal Spine Templates, Mesh Curvature computations and Vertebra Dissection through registration to a Spine Template |
ImFusionUS
ImFusionVision
| Tags | Description |
| Added | Added framework and algorithm for stereo reconstruction. |
Version 2.46, released on 2023-02-16
ImFusionLib
| Tags | Description |
| Fixed | Fixed a numerical precision issue in SplitImagesAlgorithm that caused individual zero value voxels at the edge of the FOV. |
| Changed | RealWorldMappingDataComponent::originalToRealWorld now returns the unchanged value instead of 0 if there is no real-world mapping. This way the method can be used without manually checking hasRealWorldValueMapping before. |
| Fixed | Fixed ImageResamplingAlgorithm and the underlying resample functions in ImageProcessing: Previously, they occasionally computed NaN values at the image border if the keep zeros/zeroMask option was enabled. |
| Fixed | Fixed an issue where GlReduction would yield wrong argmin/argmax results on certain Intel GPU/driver combinations. |
| Fixed | Fixed PropertiesWidget not maintaining the parameter ordering in a configuration()/configure() round-trip. |
| Changed API-Break | Improved the move-image feature of ImageView2D/InteractionView2D:
- The moved images are no longer automatically determined from the set of currently visible images but instead must be specified explicitly. Therefore, ImageView2D::setMoveImage() has been removed and replaced by the ImageView2D::addMoveImage() and ImageView2D::removeMoveImage() pair of functions.
- InteractionView2D also has new functions addMoveImage() and removeMoveImage().
- The images selected for the move image feature are now highlighted with an overlay color using the GlImageHighlighter class. The setColor() member function allows to select the color for the overlay (set the color with a null vector to have a transparent overlay).
In case you need to migrate from the old behavior, this used to be the logic for determining which images were moved:
- There is exactly one visible image: move image applies to that image.
- There is more than one visible image: move image applies to all but the first image.
|
| Added Deprecation | Added new functions to the ImageProcessing namespace:
The related member functions of MemImage and TypedImage have been marked as deprecated.
|
| Changed Deprecation | Deprecated Utils::swapEndianness() in Base/Utils/Platform.h. Use the new Platform::swapEndianness() in Core/Platform.h instead. |
| Changed API-Break | Fixed the ApplyWindowLevelAlgorithm and updated its interface. The algorithm is now also available in the ImFusion Suite. |
| Changed | Sliders for IntAdjusterWidget now behave in the same way as DoubleAdjusterWidget, respecting the actual chosen step while dragging the slider. Other values can still be input directly in the respective QSpinBox. |
ImFusionCUDA
| Tags | Description |
| Added | Added cuFFT::Complex2Complex2D for 2D Fourier transforms |
ImFusionCore
| Tags | Description |
| Changed Deprecation | Added a new Log::removeSink() overload which returns the removed Sink as a std::unique_ptr so that the instance can be kept alive by the caller. The original overload taking a reference was deprecated. |
| Fixed | Fixed Properties::setParamAttributes() creating an uninitialized param if the parameter does not yet exist which lead to an inconsistent state. The new behavior will not do anything in this case and return false, which is the same behavior as Properties::setParamType(). |
| Added | Added Parameter::defaultValue() member function enabling you to query the default state of a parameter. |
| Added | Added Geometry2 namespace, which contains improved versions of the Geometry classes and intersection functions so far available in Base/Geometry.h. |
ImFusionDicom
| Tags | Description |
| Changed | MRImageStorage SOPs that have a distinct AcquisitionNumber per frame are now loaded as volumes and not as image sets. |
| Changed | The ReferencedSeriesSequence is no longer created when exporting labelmaps as DICOM. Instead references have to be explicitly added by calling Dicom::addReference or by adding the referenced datasets as additional inputs to DicomIoAlgorithm. The reason for this change is that the previous behaviour was adding the wrong UIDs as reference in certain situations. |
| Fixed | Labelmaps can be exported as DICOM again from the UI. |
| API-Break | DicomIoAlgorithm no longer uses DicomWriter internally. All of DicomWriter functionality has been extracted to DicomExport.h with a simplified interface. If DicomWriter was used to to modify DcmDatasets before saving, use DicomIoAlgorithm::createDatasetsToWrite instead. |
| Fixed | Fixed a potential crash in DatasetCache due to a bad formatting string. |
ImFusionImageMath
| Tags | Description |
| Fixed | Fixed a bug in ImageMath if ChannelWiseScalars are part of a BinaryExpr. The issue occured if a BinaryExpr consisted of a ChannelWiseScalar and another expression which has less number of channels than the ChannelWiseScalar. E.g.
ChannelWiseScalar< T, Dim > makeChannelWiseScalar(Eigen::Matrix< T, Dim, 1 > val) Convenience function to create a channel wise scalar leaf (needed as until c++17 there is no template... Definition ChannelWiseScalar.h:74
In this case the right side of the * has one channel and the left side has three. Intended, by the developer, was that the result has three channels but due to the bug only the number of channels of the expression on the right was considered. This resulted in only the first channel being evaluated and the rest was discarded. In general this expression should not have worked in the first place, because we only support different number of channels on both sides, IF one side is a Scalar. Unfortunately there was an error in the assert which checks these conditions. |
| Changed API-Break | Improved pixelType propagation upwards the expression tree. E.g. if an operator explicitly states the return type, the pixelType of imgDesc() will be set accordingly. |
ImFusionML
| Tags | Description |
| Added Depreaction | Added ML::MRIBiasFieldCorrectionAlgorithm, a neural network-based MRI bias field correction algorithm based on Simko et al. MIDL 2022. The MRIBiasFieldRemovalAlgorithm in Base/ was deprecated as a result. |
| Added | Added ClusterMergingMode option to the ML::KeypointExtractionAlgorithm that controls the merging behaviour. |
| Changed | Updated ML::LocalizeSegmentAlgorithm and changed parameter names to camel case. |
| Added | Added new operation ML::CropAroundLabelMapOperation to crop an image around an object represented by a label map. |
| Changed | ML::LandmarkPredictionAlgorithm now uses camel case parameter names. A workspace conversion function is added. The factory name of the algorithm is changed from "Machine Learning;Landmark Prediction Algorithm" to "Machine Learning;Landmark Prediction". |
| Added | Added new operation ML::SetMatrixToIdentity to set all matrices of the input to the Identity. |
| Added | Added new operation ML::EnsureOneToOneMatrixMappingOperation to make sure TrackedSharedImageSets are properly handled by matrix-based operations. |
ImFusionRGBD
| Tags | Description |
| Changed | Checked the modality of input data to most algorithms, so that they no longer show up for data that do not have either Video or unspecified modality. |
ImFusionReg
ImFusionSpinePlugin
| Tags | Description |
| Changed | Moved include structure from SpinePlugin/Header.h to ImFusion/Spine/Header.h. |
| Added | Added Changelog |
ImFusionStream
| Tags | Description |
| Added Changed API-Break | Added VideoCameraStreamJAI for GigE connected JAI cameras. During this the interface of VideoCameraStream was extended with a templated settings<>() method for different camera settings and the specialized implementations for similar functionality were removed in VideoCameraStreamAlliedVision and VideoCameraStreamIDS. |
| Added Changed | Added a Settings dialog for VideoCameraStreamIDS and VideoCameraStreamAlliedVision, accessible under "Streaming->Camera Settings". Since this makes interactively changing FPS and resolution possible, these options are not enumerated anymore when opening the stream. |
ImFusionVision
| Tags | Description |
| Added | Added an option to rotate stream output in VideoCameraStreamIDS. |
| Changed | Extracted camera calibration paramaters from CameraCalibrationAlgorithm into CameraCalibrationSettings and created a standalone widget for it (CameraCalibrationSettingsController). |
| Changed | Extracted camera calibration paramaters from CameraCalibrationAlgorithm into CameraCalibrationSettings and created a standalone widget for it (CameraCalibrationSettingsController) |
| Added | Added an option to export/import marker configurations to the marker configuration controller. |
| Added | Added an option to export/import marker configurations to the marker configuration controller. |
| Changed | Checked the modality of input data to most algorithms in the Vision module, so that they no longer show up for data that do not have either Video or unspecified modality. |
Version 2.45, released on 2022-12-16
ImFusionLib
| Tags | Description |
| Changed Deprecation API-Break | Major refactoring of the DataModel API and related classes:
- Changes of DataModel:
- Merged the functionality of take() into remove() which now return a std::unqiue_ptr with the removed/taken Data so that you can keep it alive.
- Several redundant member functions have been consolidated or deprecated to make the interface more lean.
- Consolidated the set of signals to notify about added/moved/removed datasets and data links and made them consistent.
- Changes of DataItemModel:
- DataItemModel no longer inherits from DataModel but uses composition instead. Therefore, it also no longer implements the full DataModel interface anymore but only the interface needed for QAbstractItemModel. Use DataItemModel::parentModel() to access the underlying data model.
- The AttachmentsRole was merged into the AttributesRole and therefore removed.
- Changes of DataWidget:
- Extracted some of the existing functionality into dedicated classes: The DefaultDataWidgetItemDelegate implements the default appearance of the DataWidget as you know it from the ImFusion Suite. The DataModelAutoLinking class implements the automatic link pose/link windowing functionality.
- When disabling thumbnails DataWidget will still use the custom UI from the item delegate, just with per-data type icons instead of thumbnails. The corresponding member functions and global setting was renamed.
See Data Model for the new concept overview page.
|
| Changed Deprecation | Refactored DataGroup interface:
- Removed the non-owning mode, a DataGroup now always owns its nested Data instances.
- The optional "main data" pointer was renamed to DataGroup::proxyChild() to clarify its semantics.
- The set of member functions to modify the list of children has been refactored and moved from the protected to the public interface. These function now only apply to the direct children and no longer to multiple levels of nested children.
- A large number of member functions has been deprecated. These were mostly redundant and can be replaced with the corresponding DataList member functions of the return value of children() and childrenRecursive().
- Renamed the set of signals and removed signalDataAboutToBeTaken completely - use signalChildAboutToBeRemoved instead; DataGroup::remove() now returns the data as std::unique_ptr so that the user can use the same function for both extraction and erasure.
|
| Added | Added VolumeBasedMeshCurvatureAlgorithm for distance-volume-based computation of mesh curvatures (mean curvature, Gaussian curvature, curvedness and shape index). |
| Fixed | Fixed serialization of Settings::Setting where the payload type is a vector. |
| Added | Added MeshProcessing::Geometry::isPointInsideMesh for determining whether a point is inside or outside of mesh |
ImFusionCT
ImFusionCore
| Tags | Description |
| Added | Added Beta distribution Random::getBeta and fillBeta which is consistent across platforms. |
| Changed API-Break | Changed the implementation of the Assertion Library to reduce compiler/linker impact: The Assert::HandlerFunction no longer returns an Action enum but void and all potential actions have to be done in the handler function itself. This reduces the complexity of the IMFUSION_ASSERT() macros. If you were returning Assert::Action::DebugTrap in a custom assertion handler, you can call the new Platform::signalDebugTrap() function instead. |
| Changed Added API-Break | Refactoring of the Random Number Generation library:
- Changed underlying std::uniform_distribution type for Random::getUniformInteger() and Random::getUniformReal() to an internal one that is consistent across platforms.
- Switched the underlying engine of Random::Generator to the 64 bit Random::Pcg64Engine.
- Added convenience functions Random::Generator::getNormal() and Random::Generator::getBeta() and their corresponding fill variants.
- Renamed Generator::generateABC() to fillABC(), and getVariate() to fillVariate().
- Removed the set of global free functions to generate random numbers without explicitly instantiating a generator to reduce noise and clarify that their usage is discouraged. You can use Random::globalGenerator() as replacement.
|
ImFusionImageMath
| Tags | Description |
| Changed API-Break | Split up the CPU and the OpenGL implementations in ImageMath:
- ExprBaseTpl and ExprBase no longer derive from GlExprInterface.
- Instead each leaf/node needs to derive from GlExprInterface OR implement the interface in a separate base class.
- Added ExprBase::glExprInterface() to query the GlExprInterface from a polymorphic expression.
|
| Added Removed API-Break | Removed StringBuilder and introduced StringLeaf to generate GLSL shader expressions directly from ImageMath. |
| Changed API-Break | Several changes w.r.t. ImageMath:
- GL expressions now always have the number of channels according to the corresponding ImageDescriptor. Before we always used a vec4 in the GLSL expressions.
- Types used in GLSL became more precise which e.g. now adds proper support for boolean operations.
- Improved casting operations to properly use the corresponding casting on both, the CPU and the GPU path.
|
ImFusionML
| Tags | Description |
| Changed Deprecation | Unified ML::Operation::process interface, the following delegate operation are now deprecated:
|
ImFusionReg
ImFusionSeg
| Tags | Description |
| Changed API-Break | Modernized MaskFluoroImageAlgorithm and introduced support for flat-field X-ray masking. |
ImFusionStream
| Tags | Description |
| Changed API-Break | The Stream class underwent a major refactoring. The base class handles the stream state as a state machine, with Closed/Open/Running/Paused possible states. There are also states that represent transitions between those. Subclasses of Stream should implement virtual functions that perform the state changes, plus one that should perform the periodic work required to publish new data on the stream. All state transitions and the working function will be called asynchronously in the same background thread. The latter is opt-out, and helper methods are provided to wait for the completion of the state change. StreamListener is deprecated, and users of the Stream interface should switch to the new signals. The old interface will still work during the deprecation phase. Legacy classes are provided for Image and Tracking Streams, and a StreamLegacy class is provided as reference to do the same for custom Stream subclasses. Custom subclasses of Stream should eventually switch to the new interface, but they can be made to inherit from the *StreamLegacy classes for the time being instead. *StreamLegacy classes can be used through the new or old Stream interface without changes required on the user side through the deprecation phase. |
ImFusionVision
| Tags | Description |
| Added | Added image feature detection, matching and pruning framework. Initially support for ORB features is provided. The related classes can be found in FeatureDetection.h. The corresponding algorithm is FeatureDetectionAlgorithm. |
| Added | Added LiveStereoCalibrationAlgorithm, an algorithm that grabs frames from a camera stream to do calibration and rectification. |
Version 2.44, released on 2022-11-09
ImFusionLib
ImFusionCore
| Tags | Description |
| Added | Added SignalImpl::emitSignalRecursive() to enable users to opt-in to recursive signal emitting support. The default SignalImpl::emitSignal() will continue to prohibit recursive emitting of the same signal. |
| Changed Deprecation | Moved code basis to std::optional. The original Utils::Optional drop-in replacement is now an alias for std::optional and marked as deprecated. |
| Fixed | Fixed a bug in Timer::printPassed() which was using its boolean argument the wrong way. |
ImFusionDicom
ImFusionImageMath
| Tags | Description |
| Added | Added the ImageMath::Noise class to support noise generation. |
ImFusionML
ImFusionStream
| Tags | Description |
| Removed | The MotorMetadata class was removed. |
Version 2.43, released on 2022-10-11
ImFusionLib
| Tags | Description |
| Added | Added Workspace::setSelectedDataComponents() member function as well as a new function argument to ApplicationController::saveWorkspace() to configure which DataComponents are exported when saving a workspace. |
| Changed Deprecation | Some member functions of DataList have been renamed: get(Data::Kind) has been renamed to getFirst(Data::Kind) and getType<T>(Data::Kind) has been renamed to getAll<T>(Data::Kind). The original member functions have been marked as deprecated. |
| Added | Added DataLicenseComponent to store license information of datasets. |
| Changed API-Break | Added synchronous method for BackgroundExporter class. Previous (async) methods were renamed to saveAsync for clarity. |
| Changed Deprecation | Cleaned-up API of GlHistogram and GlJointHistogram and made them consistent. Removed deprecated functionality from GlReduction. |
| Deprecation | Deprecated the majority of free functions in Base/Utils/Strings.h and Base/Utils/Containers.h from the Utils namespace that have been moved to the Container, String, and Platform namespaces, respectively. |
| Changed | Machine Learning Operations have been moved in separate files under the folder ML/Operations. |
ImFusionCT
| Tags | Description |
| Fixed | Fixed loading of EOS data to make it more precise. |
| Added | Added support for history in 2D/3D registration. |
ImFusionCore
| Tags | Description |
| Fixed | Fixed a bug where adding new connections to a Signal while it is currently emitting could lead to a crash. |
ImFusionDicom
| Tags | Description |
| Fixed | YBR_FULL_422 should be loaded correctly now. |
| Fixed | A 16bit image with Photometric Interpretation of PALETTE COLOR and a 16bit color palette is no longer reduced to a 8bit range. |
| Changed | DicomPacsCommunication now reports errors through the Dicom::ErrorRecorder interface instead of writing them to the log. If you create a DicomPacsCommunication directly (e.g. to use it with Dicom::Scanner), no more log message will be generated. To restore the old behavior, just register a custom handler (e.g. dcp.registerErrorHandler([](const Dicom::Error& error) { LOG_ERROR(error.details); });). |
ImFusionGL
| Tags | Description |
| Changed API-Break | Improved and clarified error handling of GL::Program:
- By default, GL::Program will only use exceptions for error reporting for the constructor. All other member functions use the return value instead to report failure. This makes the behavior more consistent with the rest of the framework.
- The user can now use the new GL::Program::Compilation enum to customize the behavior: compilation can either be deferred or performed immediately; if performed immediately they can choose between return value error reporting or throwing exceptions.
- The GL::Program::Compilation::Defer enum value also replaces the previous deferCompilation() mechanism.
- setDefines(), add/removeAbstractIncludeDefinition() now behave consistently according to the requested compilation behavior. In case of failure they will always leave the Program in a bad/non-compiled state. We think that this is preferable over a "magic" reset-to-previous-state attempt because that might hide broken behavior.
|
| Fixed | Fixed a bug in GL::Program where the shader preprocessor would not correctly detect a #version directive if it had additional trailing whitespace. |
| Changed | Changed default depthFormat of OffscreenRenderHelper from DepthComponent to DepthComponent24. |
| Added | Added GL::Context::CreateInfo::enableResetNotification field, to request support for notification in case of OpenGL context loss. GL::ContextWindows and GL::ContextGLX have support for this feature. You can use GL::getGraphicsResetStatus() to query the state of the context. |
ImFusionImageMath
| Tags | Description |
| Changed API-Break | Refactored ImageMath::Variable:
- The template parameter has been removed
- Expressions now have a constexpr variable has_variable to detect if an expression contains a variable
- Variable is supposed to be used should you wish to later substitute any expression with it (i.e. it is not typed yet)
- Removed ImageMath::makeVariable<>()
- ImageMath::StashVariable<> is now the type to be used for pixel wise variables
- There substitution here can be handled on a thread-safe, and per-pixel basis
|
| Fixed | Fixed a bug in the CPU path of Variable and VariableSubstitutionOp where e.g. ChannelSwizzleViews on Variables were not applied correctly. |
| Added | Added helper functions for splitting expressions in Utils/ExpressionSplitting.h. |
ImFusionLiveUS
| Tags | Description |
| Changed | US and LIVEUS compile now for any combination of REG, SEG, ML, and DICOM. LIVEUS now only requires US and STREAM, everything else is optional. |
ImFusionML
| Tags | Description |
| Added | Added RectifyRotationOperation for aligning the rotation of an element to the nearest xyz-aligned axis (up to a sign change) to avoid oblique angles when baking it in. |
ImFusionStream
ImFusionUS
| Tags | Description |
| Changed | US and LIVEUS compile now for any combination of REG, SEG, ML, and DICOM - all these modules are optional. |
Version 2.42, released on 2022-08-01
ImFusionLib
| Tags | Description |
| Changed Deprecation API-Break | Major overhaul of the Controller interface:
|
| Changed | Matrices are no longer burnt-in when saving PointClouds in ImFusionFile format. |
| Changed | Refactored SplitImagesAlgorithm to now uses Parameters for easier configuration from code. The names of configuration parameters were changed to be in camelCase as per convention. Old names are still working but will give a deprecation warning. |
| Added | Added ImageView2D::ZoomMode::OriginalPixelSize option where a zoom factor of 1 will always show 1 image pixel per viewport pixel. |
| Changed Deprecation | Added support for order-independent transparency to GlSliceView. Due to the computational complexity and its rare use cases in 2D visualization it is disabled by default. The corresponding GlView::orderIndependentTransparency() interface is now present in the base interface, which also offers an optional GlView::sharedOitInstance() to be used internally. Some getter member functions of GlVolumeView have been renamed to follow naming guidelines. |
| Added API-Break | Added Slice::AnatomicalPlane enumeration to allow for more expressive code when referring to anatomical planes for slice-based visualization. Member functions of ImageView2D, GlSliceView and GlSlice have been changed to take this enum instead of a plain int. |
| Changed API-Break | Changed GlSliceRenderer interface: The virtual center() function was replaced by the more general defaultPose() function that can indicate both the orientation and the center of the default pose. This interface function is available to the outside through GlSlice::defaultPose() dispatching to the renderer instance corresponding to the given data type. ImageView2D::reset() will use this new interface to determine the view matrix after reset. |
| Changed | Added RemoveUnlabelledImagesAlgorithm, which was moved over from the ML module |
| Changed | Added LandmarksToImageAlgorithm, previously known as GenerateLandmarkLearningDataAlgorithm in the ML module |
| Changed Deprecation | InteractiveView now supports multiple ViewInteraction instances, so it becomes possible to add custom ones in addition to the default one. The order of view interactions is important: Events are forwarded to them in sequence, and the first one accepting it will consume it. For dealing with the default interactions, it may be useful to use the convenience functions ImageView3D::interaction3D() and ImageView2D::interaction2D() to be independent of the order. Also see InteractiveView::addInteraction(). The old single-instance interfaces setInteraction() and interaction() have been deprecated as a result. |
ImFusionCT
| Tags | Description |
| Added | Added preliminary support for Dicom CT-PD data. Added support for localizing back-projection to part of the volume and timeout management. |
| Fixed | Fixed a bug in the computation of the rotation center in XRay2D3DRegistration. If the new iso matrix did contain a rotation, the rotation center was wrong which could result in a failed regstration. |
| Changed | Changed default parameter for gain corretion in ProjectionPreProcessingAlgorithm from true to false. |
| Fixed | Fixed bug for parameter configuration in CT::ProjectionPreProcessingAlgorithm. |
ImFusionGL
ImFusionImageMath
| Tags | Description |
| Removed | Remove very old deprecation layer ExprLeafScalar and ExprLeafImageBuilder. |
| Added | Added support for resampling expressions to different domains. |
ImFusionML
ImFusionRGBD
| Tags | Description |
| Added | Added an algorithm for estimating depth correction maps and an algorithm for correcting depth images with these maps. Added an algorithm for convenient manipulation of the RGBDDataComponent |
ImFusionStream
| Tags | Description |
| Added | Added support of IDS cameras. |
ImFusionUS
| Tags | Description |
| Changed API-Break | USSweepCalibrator internally uses calibrations w.r.t. the tip of the probe (= FrameGeometry offset). Legacy functionality (methods and configure interface) remains in place to deal with the old format, i.e. matrices to the image center for a specified depth. The class also does not store a sweep instace anymore, for which any sweep re-calibration is also applied. Please manage the sweeps you need calibration for outside of this class. |
Version 2.41, released on 2022-06-15
ImFusionLib
| Tags | Description |
| Added | Added the classes VideoFileRecorder and BackgroundVideoFileRecorder for converting sequences of images into video files. Added the algorithm DisplayRecorderAlgorithm for recording the content of DisplayWidget into a video. |
| Changed Deprecation | Changed TiffIO to support reading multiple images from a single TIFF file. The TiffIO::readImage(const std::string&, MemImage*&) function overload has been deprecated in favor of TiffIO::readImage(const std::string&). |
| Fixed | Fixed DisplayWidget::mapFromOpenGL() returning a wrong Y coordinate if the screen's device pixel ratio is not 1 (e.g on High DPI screens). |
| Changed API-Break Deprecation | Extensive overhaul of the Configurable and Properties interfaces for serialization. The whole component has been moved to ImFusionCore and several API changes have been performed in the process. See Configurable/Properties API Migration Guide for a detailed overview of the changes and guidelines for migration. |
| Changed API-Break Fixed | Removed parameter requiresNoCleanup from MeshIO::load and MeshIO::loadFromPLY. MeshIoAlgorithm now performs duplicated vertex merge regardless of "comment ImFusionNiceMesh" in PLY file and depends only on m_mergeDuplicateVertices flag. Removed parameter requiresNoCleanup from MeshIO::load and MeshIO::loadFromPLY. MeshIoAlgorithm now performs duplicated vertex merge regardless of "comment ImFusionNiceMesh" in PLY file and depends only on m_mergeDuplicateVertices flag |
| Fixed Changed | MeshProcessing::Cleaning::mergeCloseVertices now adds halfedge properties for color, texture, and normal if the vertex properties can not be merged consistently. The vertex properties are removed in this case. |
| Changed Deprecation | Moved header files of several mesh-related algorithms and structures from ImFusion/Base/ to ImFusion/Mesh/:
- CombineMeshesAlgorithm.h
- InteractiveMeshEditingAlgorithm.h
- Mesh.h
- MeshBooleanOperationsAlgorithm.h
- MeshCreator.h
- MeshCreatorAlgorithm.h
- MeshCustomProperties.h
- MeshDistanceAlgorithm.h
- MeshIterators.h
- MeshMaskAlgorithm.h
- MeshOctree.h
- MeshPostProcessingAlgorithm.h
- MeshProcessing.h (this is also renamed to /Mesh/Processing.h)
- PoissonReconstruction.h
- TriMesh.h Additionally the whole ImFusion/Base/MeshProcessing/ subfolder was moved to ImFusion/Mesh/Processing/.
Added forwarding headers for compatibility.
|
ImFusionCT
| Tags | Description |
| Added | Comprehensive rewrite of the CT reconstruction. The legacy implementation still exists, but the new reconstruction algorithm can be found in CT::ReconstructionAlgorithm and supporting classes like CT::GlCBCTProjector, CT::LinearOperator, CT::Functional, CT::OptimizationProblem, and CT::Solver.
Amongst a number of other features, these changes add support for ROI reconstruction, a range of iterative reconstruction methods (MLEM, SQS, SART, TV-regularization), and Nestorov accelaration. Scaling between the new reconstruction algorithms is now uniform.
|
| Added | Added gain correction to CT::ProjectionPreProcessingAlgorithm. |
ImFusionCore
| Tags | Description |
| Added | Our logging framework was extended to additionally capture the current thread ID which is now stored in Log::Sink::LogCapture. Log::FileSink will format this new information in-between the timestamp and the log category/message. |
| Added Changed Deprecation | Small overhaul of the string processing library in the ImFusion::String namespace:
|
| Added | Added Container::filteredTransform() utility function that combines filtered() and transformed() into a single pass operation. |
ImFusionGL
| Tags | Description |
| Fixed | Improved implementation of GL::ImageProgram so that it supports context sharing if the internal FBO is used. This enables you to use the same ImageProgram from different OpenGL contexts managed through GL::ContextManager. |
ImFusionImageMath
| Tags | Description |
| Added | Added support for Masks and Deformations as ImageMath leaves, and ImageMath expressions as Masks/Deformations. |
ImFusionML
ImFusionUS
Version 2.40, released on 2022-05-12
ImFusionLib
ImFusionCore
| Tags | Description |
| Changed | Changed minimum required C++ version for the ImFusion SDK to C++ 17. |
| Changed API-Break | Changed ByteBufferView to a const/non-mutating view onto the underlying buffer to be consistent with other dictionary types such as std::string_view. Having a const view is sufficient for the large majority of use cases and also enables you to create a ByteBufferView onto a const char* without performing a const_cast. Use the newly introduced ByteBufferMutableView specialization if you really need a non-const view (e.g. for processing functions that need an output buffer to write for). Functions such as Compression::zstd::compressTo() or Compression::zstd::decompressTo() have been changed accordingly and the old overloads deprecated.
Furthermore, we added convenience functions for subregion acces such as ByteBuffer::subCopy(), ByteBuffer::subView(), and ByteBuffer::mutableSubView(). ByteBuffer::empty() was deprecated in favor of ByteBuffer::isEmpty() to be more consistent with the rest of our framework.
|
ImFusionGL
ImFusionLiveUS
| Tags | Description |
| Added API-Break | Created the LiveUS module by splitting all components of the US module that depend on the Stream module off to a separate module, including (playback) streams, stream recorders, and live US stream processing such as live bone segmentation and the US calibration wizard. All respective headers have been moved from ImFusion/US to ImFusion/LiveUS. The change also involves splitting the SweepDisplayDataController into two separate classes: The UltrasoundStreamDisplayDataController is now responsible for the stream-related aspects of it, while the original class only works with UltrasoundSweeps anymore. The GlUltrasoundRuler is not agnostic to where the image descriptor and frame geometry come from. |
ImFusionML
| Tags | Description |
| Removed | CropToInputOperation is now deprecated. To mimic this post-processing, please set the SkipUnpadding option to false in the Sampling section of the model YAML file. |
ImFusionUS
| Tags | Description |
| Changed API-Break | Created the ImFusionLiveUS module by splitting all components of the ImFusionUS module that depend on the ImFusionStream module off to a separate module, including (playback) streams, stream recorders, and live US stream processing such as live bone segmentation and the US calibration wizard. All respective headers have been moved from ImFusion/US to ImFusion/LiveUS.
The change also involves splitting the SweepDisplayDataController into two separate classes: The UltrasoundStreamDisplayDataController is now responsible for the stream-related aspects of it, while the original class only works with UltrasoundSweeps anymore. The GlUltrasoundRuler is now agnostic to where the image descriptor and frame geometry come from.
|
Version 2.39, released on 2022-04-12
ImFusionLib
| Tags | Description |
| Fixed | Fixed GlOrientationMeshOverlay not supporting showing the vertex colors of the assigned mesh. |
| Changed Fixed | Changed/Fixed the behavior of firstHitpointLocation and the depth computation of the DRR and MIP volume rendering. For DRR the center of mass of the intensity distribution is used from now on. For MIP the depth of the pixel with the maximum intensity will be used. |
| Added | Added a pose-linking feature to AnnotationModel (and AnnotationWidget), where the link is between a point-based annotation and its parent dataset. This uses the new class AnnotationPoseLink, which creates a link between a point-based annotation and a dataset, making the annotation points follow the dataset (matrix and deformation). Moving the annotation itself doesn't move the dataset. |
| Added | Added "actions" to algorithms that can be registered for automatic creation of bindings and controllers. |
| Added | Added AlgorithmFactory::setAlgorithmAsExperimental() function to mark individual algorithms as being of experimental/research nature. Such algorithms will be shown with a beaker icon in the GUI. |
| Added | Added ReorderLabelValuesAlgorithm for conversion of fragmented label values into a consecutive range. This makes it possible to convert UShort images to label maps even if they have values over 255 but less than 256 different label values in total. |
| Changed | Made the behavior of MainWindowBase::postLoad() configurable through MainWindowBase::setPostLoadActions(). Removed the pure virtual MainWindowBase::postLoad(SharedImageSet*) overload. If you want to customize this functionality implement postLoad(Data*) instead and perform the dynamic_cast if needed. Make sure to call the base class version as well. |
ImFusionCT
| Tags | Description |
| Added | Added CT namespace for all classes inside the CT plugin |
ImFusionDicom
| Tags | Description |
| Changed | DicomIoAlgorithm will write DicomErrors with type Err to the Warning log level instead of the Error log level. This does not affect the type of errors reported to ErrorRecorder. |
| Changed | Improved errors when encountering unsupported or missing SOPClassUIDs. There are no more fatal errors when a dataset can be loaded with the fallback loader. There is also just a single error when SOPClassUID is missing. |
| Changed API-Break | Moved setEnableFallbackLoader from DicomLoader to DicomIOD_Registry. The setting only affects the constructor of DicomLoader, so setting it after creating a DicomLoader instance never had any effect. |
| Changed | DicomLoader now ignores any DICOMDIRs with a warning instead of aborting |
ImFusionGL
ImFusionImageMath
| Tags | Description |
| Added | Added support for reductions over channels, added support for pixelwise "stashes" |
| Added Changed | Added support for dimension and channel broadcasting/streaming. Added support for Warping and MagFilter (previously interpolationEnabled) |
| Changed | Several performance improvements. |
ImFusionML
| Tags | Description |
| Changed API-Break Removed Deprecation | Introduced MachineLearningModel based on ML::DataItem, which allows multiple-input/multiple-output predictions on heterogeneous types.
- PixelwiseLearningModel and ImagewiseLearningModel were removed. Instead, MachineLearningModel can be used by specifying in the Yaml configuration file the 'PredictionOutput' parameter. Possible output types are [Image, Vector, PointCloud]. Use 'Image' for the old Pixelwise models, and 'Vector' for the old Imagewise models.
- PixelwiseLearningAlgorithm and ImagewiseLearningAlgorithm are deprecated and kept it only for running models in the Suite that don't specify the 'PredictionOutput' parameter. For updating the model, simply add a 'PredictionOutput' parameter to its configuration file.
- A new MachineLearningModelAlgorithm/MachineLearningModelController pair was added.
- Removed BUILD_ML_LEGACY and all related Legacy code.
- ImagePredictorInterface was replaced by EngineInterface, which abstracts deserializing and running a model generated by a particular third-party framework (i.e. Torch, Onxx, ...)
- ImagePredictionExecutor was removed as not needed anymore.
|
| Changed Removed API-Break | Turned all ImageROISamplers into Operations. Removed ImageROISamplerSet (use RandomChoiceOperation instead). |
| Added | Added RandomChoiceOperation to execute randomly one operation from a set of given operations |
ImFusionSeg
ImFusionVision
| Tags | Description |
| Added | Added MarkerHandEyeCalibrationAlgorithm (performs hand eye calibration of a sensor that provides a tracking information to a camera that captured images of a marker board). Added StylusHandEyeCalibrationAlgorithm (performs hand eye calibration between a tracking target rigidly attached to a camera and the camera coordinate system based on correspondences given by a tracked stylus on a marker board observed by the camera). Added StylusObjectPoseEstimationAlgorithm (estimates the transformation from a mesh coordinate system to the camera coordinate system) |
| Changed | Deprecated MarkerDetection refinementWindowSize and replaced with DetectorParameters in MarkerConfiguration |
Version 2.38, released on 2022-03-09
ImFusionLib
| Tags | Description |
| Changed | Added move semantics to PointCloud class. |
| Added | Added argmax/argmin support to GlReduction. |
| Added | Added support for custom image types to SharedImage:
|
| Changed Deprecation | Added support for arbitrary/non-regular selections to Selection. The traditional convenient first/last/skip-based API is still supported. However, some aspects such as setting or querying first/last/skip individually have been deprecated because they may be confusing with the new custom selection support.. |
| Removed | Removed the deprecated SharedImageSetIterator interface. |
ImFusionDicom
ImFusionGL
| Tags | Description |
| Changed | Fixed DPI scaling of GL::TextRenderer. The DPI scaling factor is now applied as a whole and not only its square root. |
ImFusionML
| Tags | Description |
| Added | Added Metric interface and first implementations (Dice, surface distances, etc.) |
ImFusionVision
Version 2.37, released on 2022-02-08
ImFusionLib
| Tags | Description |
| Changed Deprecation | Improved the performance of MeshProcessing::Cleaning::mergeCloseVertices, which now contains removeDuplicateVertices as a special case with tolerance 0.0; deprecated removeDuplicateVertices. |
| Changed | Mesh loading is now more robust to invalid vertex, color, normal or texture coordinate indices in the source file. |
| Added Changed | Added support for L2 distances in MorphologicalOperationsAlgorithm. Renamed the parameters of this algorithm to camel case (In Place -> inPlace, Operation -> opMode, Pixel Size -> opSize). |
| Added Changed | Structures View:
- A new context menu opens when right-clicking on a structure in the Structures-View Widget. This context-menu gives the possibility of editing the selected structure, deleting it (moved functionality from the widget to this menu), or computing and showing its statistics. The computed statistics are: voxel count, volume in mm^3, bounding box center and extent, as well as the number of connected components.
- The "Delete Selected Structure" button on the bottom right of the list of structures was replaced with the "Create New Label Map" button: this button creates a new label map for the selected data-set. If the AnnotationPlugin is present, the Segmentation Toolbox of this plugin is started, otherwise the standard Labeling functionality of the Suite is triggered.
|
| Changed | Reverted correction of triangle orientation in MeshProcessing::removeDuplicateVertices introduced in version 2.35. The correction is now optional and deactivated by default. |
| Changed | Changed GlProgramIncludeManager's implementation to use an LRU cache (the size of which is now a constructor parameter). This means it no longer holds every created program indefinitely. |
| Added | Added generic IO::FileLoader class for loading files. |
| Changed API-Break | Changed implementation of RANSAC generalizing input type, adding support for weights and refinement of solution. |
| Added | Added finite-difference mode to Levenberg-Marquardt algorithm. |
| API-Break | Removed ImageSamplingAlgorithm, use OrientedROISampler in ML/ImageSamplers.h instead. |
| Changed | Make DistanceTransformAlgorithm configurable (inner vs outer vs both vs signed distances). |
| Changed Deprecated | Major refactoring of MeshProcessing functions including change of function names, parameters, reorganization into sub-namespaces, minor implementation details. Changes are made to the functions related to Mesh smoothing, simplification, subdivision, statistics and other miscellaneous operations |
| Added Changed | Major overhaul/generalization to support generic visualization of Data in InteractiveViews:
See also Rendering Custom Data in Views.
|
| API-Break Removed | The family of setVisibleData()/showData()/hideData() functions of DisplayWidgetMulti has been refactored so that their behavior (append vs. replace) matches the functions of InteractiveView:
- DisplayWidgetMulti::showData() will now add/append Data instance to the set of already visible data.
- DisplayWidgetMulti::setVisibleData() will replace the set of visible data. Furthermore, we removed the InteractiveView::ViewOptionsSource interface, also known as "store view settings per dataset", as it has been become obsolete since the support of per-data display options.
|
| Added | Added/restored ability to set thickness in curved slice view. |
ImFusionCT
ImFusionCore
ImFusionDicom
| Tags | Description |
| Fixed | The matrix of UltrasoundSweep is no longer stored inverted when exporting to DICOM. |
ImFusionImageMath
| Tags | Description |
| Added | Added support for argmax reductions, world-coordinate leaves, if/else operators, combining channels, and evaluations into newly created images. |
| Added | Added support for Arrays of const images. |
ImFusionML
| Tags | Description |
| Changed | Generalized ML::ResampleOperation to allow for non-isortropic resolutions. |
| Changed API-Break | The constructor of ML::SelectChannelsOperation now takes a list of channel that are 0-based indexed (instead of the previous 1-based indexing). This was a necessary change to make the behaviour consistent with the configure method of the operation. |
ImFusionSeg
| Tags | Description |
| Changed | Improved Seg::UndoRecorder to be more efficient with multi-frame data |
ImFusionStream
| Tags | Description |
| Changed | ImageStreamData now holds a collection of shared pointers to immutable SharedImages instead of owning MemImages. Listeners can keep a copy of the shared pointer to avoid deallocation of the image buffer, but should not modify it to avoid disrupting other listeners. Internal changes were applied to avoid multiple uploads of these particular SharedImages to GPU memory if multiple listeners access their GlImage. A SharedImageRingBuffer class was added to help ImageStream subclass implementors in keeping a rotating cache of image buffers, thus avoiding any reallocation if all listeners are well behaved (or the specified size of the RingBuffer is sufficient for the particular scenario). |
ImFusionUS
| Tags | Description |
| Added | Added US::SweepDisplayOptions DataComponent to store UltrasoundSweep-specific rendering options. This supersedes the previously undocumented parameters in the sweep's Properties, such as linkMPR or hide3D. |
| Changed API-Break | Updated GlSweep3D API to support the newly introduced US::SweepDisplayOptions. |
| Added | Added a new algorithm and controller "Sweep Processing" as the high-level starting point to modify ultrasound sweeps for most typical use cases; the class name is SweepProcessingAlgorithm. |
| Changed API-Break | The class SweepPostProcessing was renamed to SweepTrajectoryAnalysisAlgorithm, the corresponding algorithm name changed from "Sweep Post-Processing" to "Sweep Trajectory Analysis". |
ImFusionVision
Version 2.36, released on 2021-12-17
ImFusionLib
| Tags | Description |
| Changed Deprecated | Major refactoring of MeshProcessing functions. |
| Added Changed Deprecation | Implemented new hole filling, which adapts tessellation to the existing mesh characteristics (used in MeshProcessing::Cleaning::cropMesh). Added new cropMesh overload for cropping with planes and deprecated the old one. Added progress handling for cropMesh functions. |
| Changed | Added support for arbitrary many AbstractIncludes in GlProgramIncludeManager. |
| Added | Introducing GlScreenSpaceAmbientOcclusion post-processing filter implementing Screen Space Ambient Occlusion and made it an optional feature of GlVolumeRenderer. SSAO is a post-processing effect providing an approximation of global illumination and improving depth perception for opaque scenes. You can enable the filter through GlVolumeView::setSsaoMode(). |
| Added | Added MeshPickingManipulator and PointCloudPickingManipulator which can be used to obtain indices of selected faces/vertices/edges from a Mesh or selected vertices from a PointCloud. Added MeshPickingManipulator and PointCloudPickingManipulator which can be used to obtain indices of selected faces/vertices/edges from a Mesh or selected vertices from a PointCloud |
| Changed | Extended the GlVolumeRendererGlobalIllum renderer so that shadows are also casted onto the geometry-pass (non-DVR) scene. |
| Added | It is now possible to configure a semitransparent background for the text label of GlAnnotations. |
| Added | The imfusion_generate_VS_user_file() macro defined in ImFusionLibConfig.cmake now accepts the PATH_DEBUG and PATH_RELEASE arguments. They allow to inject a list of directories into the generated .vcxproj.user file, in addition to the path to the ImFusion SDK. |
| Changed | Added GPU implementation to MeshToLabelMapAlgorithm, which will be the new default choice in case OpenGL 4.3 is available. Also modernized the API and offer a Parameter-based interface for the algorithm's configuration. |
ImFusionCT
ImFusionCore
| Tags | Description |
| Added | Added Cryptography::hashCombine() function for 64bit hashes. |
ImFusionDicom
ImFusionGL
| Tags | Description |
| Changed | Added GL::AbstractIncludes::fingerprint() interface to simplify duplicate detection. |
ImFusionImageMath
| Tags | Description |
| Added | Array now supports interpolation on the GPU. |
| Added | Added a leaf to wrap an existing scalar. |
ImFusionStream
Version 2.35, released on 2021-11-11
ImFusionLib
| Tags | Description |
| Changed API-Break | Major overhaul of the Progress interface:
- Instead of one single progress state per Progress instance the interface can now maintain multiple independent tasks/reports in parallel, each with their individual state. The original "global" functions such as Progress::updateProgress(), Progress::setProgressText(), etc. are deprecated in favor of the new Task-based API.
- Inheriting directly from the Progress interface in order to customize functionality on progress callback is no longer needed/recommended. You can use the NestedProgress class and its signalTaskUpdated instead.
- ApplicationController no longer inherits from the Progress interface but instead uses composition and provides the virtual ApplicationController::progress() member function. We installed a limited deprecation layer but still some code may fail to compile as result of this change.
- AsciiProgress and ProgressDialog have been overhauled in order to support the new functionality.
- Optimizer::setProgressStudy() has been removed because the Progress interface now supports multiple parallel reports out of the box. Optimizer::signalStudyStepFinished was introduced to provide an alternative notification method.
See also Progress Reporting.
|
| Removed Added | Removed Mesh::setFromArrays, added Mesh::createFromArrays as replacement. |
| Removed Changed | Split MeshProcessing functions across multiple namespaces and files. |
| Added | Added support for serializing Utils::Optional in Properties. |
| Removed Changed | Removed several ImFusion Suite-specific and obsolete functions from MainWindowBase. Renamed MainWindowBase::finishProcessing() to processEvents(). |
| Added Changed | Added GlSlice::setBlendingColors() property to make tint colors used for color blending configurable. Added SingleColor and DualColor values to GlSlice::BlendingMode enumeration to optionally disable automatic color blending based on modality. Changed the way the Checkerboard blending mode works: The checkerboard fields are no longer placed at fully customizable locations but are now homogeneously distributed according to a uniform field size. On the API side this means that the GlSlice::checkerboardLocations() property was replaced by the newly introduced GlSlice::checkerboardFieldSize() property. |
| Added Changed Removed API-Break | Complete refactor of the MetaImage class. The new version has a simpler syntax, is better documented and fails more gracefully. In contrast to the previous behaviour, non-CT 2D image sets are treated as 4D data. |
| Changed | Restricted the file formats supported by QtImageIO, which is now a namespace. |
| Changed | Improved MeshProcessing::removeDuplicateVertices. It now allows for fixing wrong winding order of the face vertices. |
| Added | Added method for cropping of the mesh with a set of planes (MeshProcessing). Added optional capping of the holes which result from mesh cropping. |
| Added | Added a GPU version of Viterbi algorithm (ClMarkovChain). |
| Added | Added a possibility to visualize point IDs in GlPointCloud. |
| Fixed | Fixed visualization of a GlPointCloud with lines. |
| Fixed | Fixed a bug in the CPU path of GlHistogram when using images with more than one channel. |
ImFusionCT
| Tags | Description |
| Changed Fixed | Improved/Fixed support for CBCT data coming from a Ziehm RFD 3D system. |
| Added Changed API-Break | Pose in XRay2D3DRegistrationAlgorithm is now part of the ConeBeamGeometry. This means the pose of the volume stays constant. The API for Initialization changed, apart from a transformation matrix, initialization now additionally is expected to return a rotation center. XRay2D3DRegistration now supports nontrivial iso-matrices and advanced geometries that include detector shift/offsets. |
| Fixed | Fixed a bug where the fan cropping was not computed correctly if the extent of the reconstruction volume was different in z than in x and y direction. |
ImFusionML
ImFusionStream
| Tags | Description |
| Changed API-Break | Changed return type of LiveTrackingStream devices method. Method does not return a vector of pointers to TrackingInstruments anymore but a copy of them instead. This avoids a hard to implement or leaking method. |
| Added | Added support of video camera streams via OpenPNP, which makes device selection for multi-camera setups more consistent. Replaces OpenCV as default if enabled in CMake. Also added support for camera streams using a Qt backend, for cases where neither OpenPNP nor OpenCV are available. |
| Removed Changed | Refactored RGB video stream interfaces. VideoStream no longer exists, use either VideoFileStream or VideoCameraStream instead. |
ImFusionUS
| Tags | Description |
| Changed | Bounding box calculations for UltrasoundSweep are consolidated into two main functions globalBoundingBox and localBoundingBox. Other functions in UltrasoundSweep for bounding box and orientation calculations are deprecated. The bounding box based on the local sweep orientation uses a hybrid approach of image orientation and PCA now. This change affects thedefault bounding box for GlSweepCompounding. The former calculation (based on the image orientaton only) is still available by setBoundingBoxMode to BoundingBoxMode::FrameNormal. |
ImFusionVision
Version 2.34, released on 2021-10-12
ImFusionLib
| Tags | Description |
| Added | Added Algorithms for Bicubic BSpline fitting and MRI bias field removal. |
| Fixed | Fixed non-deterministic behaviour in the SplitImagesAlgorithm. |
| Added | Added VectorFieldFlow class for computing flows of autonomous vector fields. |
| Added Changed | Extended SplitImagesAlgorithm's dimension divisor to accept vec3i instead of just int. The new version is backwards compatible with old usage. |
| Added | Added OpenCV::convertOpenCVDistortionToInverseDeformation |
| Fixed | The freeform annotation was creating a piecewise linear line instead of a smooth one. This regression has been fixed. |
ImFusionCT
ImFusionCore
| Tags | Description |
| Added | Added a faster hash function, suited for large image data: Cryptography::hashMurmur64(). |
| Added Changed Deprecation | Overhaul of the Filesystem library:
- Introduce a set of free functions in Filesystem namespace. Some of them provide new functionality, others offer mainly convenience and forward to member functions of File / Directory.
- Added Path::asFile() and Path::asDirectory() functions to easily derive File/Directory instances from a Path. Added further convenience functions Path::length(), Path::replaceFilename(), and Path::replaceExtension().
- Renamed Path::createAbsolute/RelativeTo/Canonical() to makeAbsolute/RelativeTo/Canonical(). Moved Path::workingDirectory() and Path::tempDirectory() to free functions in Filesystem namespace. The old functions have been deprecated.
- Made Filesystem::Path implicitly convertible to std::string
- Changed the behavior of File::exists() and Directory::exists(): they now additionally check whether it is actually a file/directory (i.e. File::exists() returns false if the element exists on the filesystem but represents a directory and vice versa). Use Path::exists() to check for existence independent of type.
|
| Fixed | Fixed a bug where ByteBufferStream was not seekable. Previously, calling seekg() or tellg() on it would do nothing except for setting the fail bit. Now they behave as expected by a std::istream. |
ImFusionGL
| Tags | Description |
| Changed | Modified project function to ViewState.h to take (optional) out parameter to allow for checking whether argument is on camera plane. |
ImFusionML
| Tags | Description |
| Added | Added operation to run MRI bias field removal |
| Added | Added Operation that wraps MergeChannelsAlgorithm for usage in the training pipeline. |
| Added | Generalize ConvertVolumeToSlices and ConvertSlicesToVolume operations to other axes. |
| Added | Added algorithm for running encoder-decoder based modality synthesis models. |
| Changed Added | Introduced a new type of DataElement, the VectorElement, for dealing with vector data that is represented by 1x1x1xn images. Operation now has a new processVector method that needs to be implemented if it is to be applied to VectorElememts. Currently, only ArgMaxOperation implements this method. To make the distinction between ImageElement and VectorElement work, CacheDataLoader now creates 2x2 dummy images instead of the previous 1x1. |
ImFusionReg
| Tags | Description |
| Added Changed | Added diffeomorphic mode to DemonsImageRegistration, also added several modes for calculating derivatives. Changed default settings for this algorithm. |
ImFusionStream
Version 2.33, released on 2021-09-14
ImFusionLib
| Tags | Description |
| Added | GlScalarBarOverlay now allows to show the input value in the original domain, rather than the normalized value. |
| Changed Deprecation | Overhauled interfaces for SDK initialization to make them more explicit and configurable: We introduced the new Framework::InitConfig enabling you to see the different steps that can happen during SDK initialization and what the defaults are. You can customize an instance of this and pass it to Framework::init() in order configure the SDK initialization. Furthermore, the ApplicationController, MainWindowBase, and ConsoleController constructors now also accept this InitConfig in case you are using one of these interfaces and want to delegate framework initialization to them. |
| Changed API-Break | The QtAppender interface was completely removed from MainWindowBase. Use the new LogViewerWidget as replacement if you want to show a log window in your Qt-based application. |
| Changed | Fixed a text alignment issue with GlTextOverlay when using a vertical alignment of GL::TextRenderer::Bottom, where the bottom part of the text might be cropped. Rendered text may now appear a couple of pixel more to the top than before. |
| Added | ApplyMaskAlgorithm now also supports sequential processing of multiple images via the SequentialImageProcessor interface. |
| Added | Added new SharedImageSet::CloneOptions::NoSelection flag that will make the cloned SharedImageSet now have an empty default Selection instead of the original one. This can prevent inconsistencies and potential crashes if the original Selection was referring to images that are not present in the cloned SharedImageSet, for instance if you are using it together with SharedImageSet::CloneOptions::NoImageData. |
| Added | Added Mesh iterators. |
| Added | Added support for set and unordered_set serialization in Properties. |
| Added Deprecation | Added DataSourceComponent to store information on the source of the data. You should use this data component instead of the parameter "filename" in the Properties of a SharedImageSet which is now considered deprecated. |
| Added | Added method registerAlgorithm to ApplicationController that allows to register an algorithm before the controller is closed, and added field keepControllerOpen to workspace files to specify if the algorithm controller should be closed after executing the algorithm. This allows streaming algorithms to be properly saved and loaded from workspace files. In order to make a streaming algorithm work you should add m_main->registerAlgorithm(*m_algorithm) after calling compute(). |
| Changed | Consolidated all Machine Learning algorithms in the context menu under 'Machine Learning'. The 'Deep Learning' entry is now removed. |
| Added | Added support for loading and saving 3MF meshes. |
| Changed API-Break | Updated ClProgram to also use the ImFusion::Resource infrastructure instead of the DeviceCodeRepository interface for loading OpenCL kernel source code to be in line with what GL::Program does. See also Loading Shader Source Code. |
ImFusionCT
ImFusionCore
| Tags | Description |
| Added | Added the no-auto-register flag to ImFusionResourceCompiler, which will make the generated resource repository not automatically register on DLL load. Instead the resource compiler will output a header file next to the cpp file so that you can register it with the resource system at your discretion. |
| Changed API-Break | Overhaul of the ImFusion Logging Framework:
- Changed evaluation logic/precedence of whitelist vs blacklist filters. Whitelist filters will still override blacklist filters. However, whitelist filters without any blacklist filter will no longer have an effect.
- Added IMFUSION_LOG_DEFAULT_CATEGORY preprocessor define allowing for specifying a default log category used by the single-argument set of logging macros.
- Added IMFUSION_LOG_CAPTURE_ORIGIN preprocessor define that can be used to enable capturing of log message origin information (source file+line).
|
ImFusionDicom
| Tags | Description |
| Fixed | Fixed an issue where the loading was very slow in case of DICOM datasets containing timestamps. |
| Added | Added support for the DICOM photometric interpretations PALETTE COLOR, YBR_FULL and YBR_FULL_422, as well as for general RLE decoding. |
| Fixed | Files without a DICOM header and certain non-DICOM filetypes are ignored by default during loading. This can be controlled with the ignoreNonDicom query of the URL, e.g. file:///some/folder?ignoreNonDicom=0 would try to load all files as DICOM regardless of the existance of a DICOM header. |
ImFusionImageMath
| Tags | Description |
| Fixed Changed | Fixed a bug where block acces did not work for SharedImageSets in the ThreadPool based evaluation. In this scope the ExprBase::eval() was changed such that it now expects a Array<SharedImage, void> or Array<SharedImageSet, void>. |
| Fixed | Fixed a potential crash in the ThreadPool based evaluation of expressions. If the images of an expression needed to be synced to a MemImage, this was triggered from a thread without an OpenGL context which resulted in a crash. |
ImFusionML
| Tags | Description |
| Changed API-Break | Introduced new interface for ML operations that enables processing point clouds and bounding boxes (on top of images). The old interface is still available under the name ML::OperationV1, and all old custom operations can be adapted to a new operation via an adapter using MyOperation = ML::ImageOperationAdapter<MyOperationV1>. OperationSequences and ImageROISamplers have been adapated as well. |
ImFusionSeg
| Tags | Description |
| Changed | Changed return type of Seg::LabelPainter::stencil() from SharedImage& to SharedImage*. In addition, two signals signalStencilAboutToChange and signalStencilChanged are added, to indicate when the value of this pointer changes. |
ImFusionStream
Version 2.32, released on 2021-07-20
ImFusionLib
| Tags | Description |
| Added | Added InteractiveLiftChartOverlay, GlLiftChartOverlay, and LiftChartOverlayController. Created a basic rendering of a lift chart, with colored bars and a slice indicator, as an overlay. The bars are set by the controller, which lists all the current annotations. |
| Fixed | Fixed several issues with the mask support of GlReduction:
- The support for IntensityMask was broken.
- The support for CroppingMasks had an issue where pixel at the border of the Mask could be handled wrongly.
- If a mask was used once the mask never got disabled such that any following reduction got corrupted.
- Fixed several issues for the average reduction and average of absolute reduction in combination with Masks. Due to multiple issue the accumulated number of pixel which are not masked was corrupted.
|
| Fixed | Fixed an issue in the CPU path of the CroppingMask where a half-pixel shift was missing. This could cause maskValue() to return wrong values for pixel at the border of the mask. |
| Fixed | Fixed IntensityMask for signed integer images. The range as well as the image values got scaled with respect to the unsigned counterpart instead of the actual signed type. |
| Fixed | Fixed a compilation issue of the MedianFilter when the filter gets initialized. |
| Added | Added options to GlTextOverlay to draw a background below the text |
| Changed | In applications which subclass from MainWindowBase views are no longer hidden automatically when they become empty after the displayed images are deleted. This behaviour has been moved to ImFusionSuite only. If the subclasses require this behaviour they can implement it by overriding the MainWindowBase::onDataDeleted method. |
| API-Break Changed Removed | General overhaul of the DataComponent API. The base interface is now called DataComponentBase and with pure virtual methods only. We introduced new derived interfaces as replacement:
- DataComponent<T> using operator==(), operator=(), and the copy constructor from T to implement the DataComponentBase interface
- TemporaryDataComponent providing empty implementations for non-serializable non-copyable DataComponents
- LegacyDataComponent using the Configurable interface to implement clone/assign/equals (i.e. provide old behavior)
Furthermore, the support for DataComponent inheritance (as in, subclassing a subclass of one of the base DataComponent types) has been removed. If you need to create multiple DataComponent types with overlapping members, consider making use of composition instead.
See the updated documentation on DataComponents for more detailed information.
|
| Deprecation API-Break | All low-level OpenGL wrapper classes and interfaces have been moved to the new ImFusionGL library. The original classes in ImFusionLib have been deprecated. See the ImFusionGL Migration Guide for more information. |
| Added | Added a class Anatomy and corresponding data component AnatomyDataComponent to allow to keep track of contained anatomy in our image and data classes. |
ImFusionCore
| Tags | Description |
| Added Deprecation | Introduced new SignalBlocker class to conveniently block signal notification for entire signals, single connections, or all connections between a given signal-receiver pair. This interface superseeds SignalImpl::whileBlocked() which has been deprecated. |
ImFusionDicom
| Tags | Description |
| API-Break | DicomScanner is no longer used by DicomBrowserModel. There are several pitfalls due to its multithreaded nature that can lead to files randomly missing from a scan. Instead DicomBrowserModel now provides all the scan progress signals as well as some new blocking methods that are easier to use than the async methods. Additionally there is a Dicom::Scanner now, that provides the scanning without the overhead of the DicomBrowserModel. The old DicomScanner is still available under LegacyDicomScanner.h. |
ImFusionGL
| Tags | Description |
| Added | Added new ImFusionGL library to provide low-level OpenGL wrapper classes and interfaces and replace the existing ones in ImFusionLib. See the ImFusionGL Migration Guide for more information. |
ImFusionImageMath
| Tags | Description |
| Added | Added a ThreadPool for CPU based evaluation of expressions involving SharedImageSets. |
| Added | Added support for special reductions:
|
| Added | Added support for reductions (see ExprBaseTpl::reduce). For now we support sum, prod, min, and max. |
| Added Changed | Added dimension squeezing to the block views. I.e. if the block has a size of 1 in one dimension the number of dimensions of the block gets reduced accordingly. This e.g. allows for easy extraction of slices in any direction of a volume and the result will always be a 2D image. Previously, it could have happened that the result would have been considered a volume because the number of slices was != 1 while either height or width was 1. |
ImFusionRGBD
ImFusionUS
| Tags | Description |
| Changed | UltrasoundSweeps are now topDown by default, i.e. they have the property "topDown" set to true by default. Exceptions are sweeps that are loaded from imf files, in which case the ImFusionFile decides if the sweep should be flipped upon loading. |
Version 2.31, released on 2021-06-11
ImFusionLib
| Tags | Description |
| Fixed | Fixed a potential bug when copying SharedImages with more than 4 channels and an up-to-date GL representation, which was leading to the last channels being discarded. |
| Added | DisplayWidgetMulti::showData() and DisplayWidgetMulti::visibleData() now take an optional argument to filter out algorithm views. |
| Added | Added ProjectiveGeometry::backproject(). |
| Added | Added ImageTemplateMatchingAlgorithm and ImageTemplateMatchingController, for matching regions of images to a stream. |
| Added | Added the ImFusion::Random namespace in ImFusionLib (mirroring Core) for complex random generators (for example random unit vectors and random rotation matrices). |
| Fixed | Fixed a bug in the GaussianFilter where only one half of the filter got computed, resulting in wrong filtered images. This also corrupted the results of Filters::laplacianFilter3d() and Filters::guidedFilter3d(). |
| Changed | The crash handler is now installed during the Framework initialization, and it's reset during Framework deinitialization. |
ImFusionDicom
| Tags | Description |
| Fixed | Fixed a crash when loading DICOM files containing foreign characters. |
| Fixed | Fixed a crash when loading DICOM files containing overlay data |
ImFusionSeg
ImFusionUS
| Tags | Description |
| Changed API-Break | UltrasoundGeometry switched to FrameGeometry classes in all algorithms. UltrasoundSweeps hold a FrameGeometry instance, which can still be converted to legacy UltrasoundGeometry - that conversion is deprecated, though. UltrasoundGeometry bindings were removed from the Python interface. |
Version 2.30, released on 2021-05-11
ImFusionLib
| Tags | Description |
| Deprecation | Deprecated Mesh::moveToCenter(), Mesh::offset(), Mesh::setOffset(), PointCloud::moveToCenter(). |
| Removed | Mesh::uniteIndices() and Mesh::hasUnitedIndices() have been removed. |
| Changed Deprecation | Added Mesh::boundsLocal() that returns the bounds of the mesh in a local coordinate system. Deprecated computeBoundingBox(), computeBoundingBoxWithMatrix(), boundingBox(), center(), extent(), origin(). Use boundsLocal() or bounds() instead. |
| Added | Added a mechanism to create prismatic annotations, using a polygonal or freeform line as the base of the prism and a line segment for the height of the prism and its skew direction. The option is available through the UI by selecting a closed line and a line segment annotation together. |
| Added Fixed | Added cloneDeformation parameter to ImageResamplingAlgorithm together with support for copying/cloning deformations. |
| Added | A setting was added to change the behavior upon double-click on the 3D view. The standard one is to translate the MPR slice views to the point on the surface that is below the pointer. If the new "orientViewsToNormal" setting is enabled (or the respective API is called), the views will also be aligned to the normal to the surface at that point. |
| Deprecation | Deprecated the DeformationListener interface. Use the Deformation::signalChanged signal instead. |
| Added | GlMesh's projective rendering mode in MPR views now smoothly fades out when the mesh no longer intersects with the MPR plane. This can be configured through the newly introduced GlMesh::projectiveFadeoutRange and corresponding MeshDisplayOptions::p_projectiveFadeoutRange properties. |
| Added | TransferFunction has now a look-up-table (LUT) mode as alternative to defining it via keypoints. GlColormap::PET20Step uses this functionality now, so no keypoints can be defined in the TransferfunctionWidget for this colormap anymore. |
| Changed Deprecation | Added GlImageProgram::setClearOutputEnabled() that allows for setting a custom clear color. The original GlImageProgram::enableClearOutput() function has been deprecated. You can simply replace any calls to it with a call to setClearOutputEnabled(). |
| Changed API-Break | Changed return type of GlVolumeRenderer::data() to be consistent with the corresponding setter. |
| Added | Introducing Zstandard compression for the ImFusionFile, as compressionMode: 65. This allows for fast compression for all image datatypes. |
ImFusionCT
| Tags | Description |
| Removed Added Changed API-Break | Removed XRayCTRegistrationAlgorithm and XRayCTRegistrationAlgorithmController and added XRay2D3DRegistrationAlgorithm and XRay2D3DRegistrationController to replace them. Eos2D3DRegistrationAlgorithm now has XRay2D3DRegistrationAlgorithm as its parent class, Eos2D3DRegistrationController replaced by XRay2D3DRegistrationController. |
| Added Changed API-Break | Added view() and optDialog() getter functions to Gl2D3DRegistrationController Gl2D3DRegistrationController now opens an algorithm view. Changed signature of setSlice() function in GlProjectionAnnotation and added m_isFocus member to specify whether a shot has focus. Added support in ConeBeamDisplayDataController for display in a different view. |
| Added Changed API-Break | Refactored Eos2D3DRegistrationAlgorithm: added preprocessEosShots function, renamed takeShotsWithGeom to takeOwnedShots, added getter function ownedShots, added const qualifier to constructor, renamed m_regAlg to m_nestedRegAlg. Added m_annotationsVisible member. Refactored Eos2D3DRegistrationAlgorithmController: renamed m_regAlgCtrl to m_nestedRegAlgCtrl, added m_shotsView, m_regViewGroup and m_cbDisplayCtrl members. |
| Added | Added class ConeBeamMetadata to act as a DataComponent for Cone-Beam projections to replace metadata members of ConeBeamData. |
ImFusionCore
| Tags | Description |
| Added | Added Filesystem::File::isExecutable. On Windows, thas means the file is a 32- or 64-bit "Windows-based" application. On Unix, that means it grants the executable permission. Added Filesystem::Directory::isWritable, which checks whether the user can create a file in the directory. On Windows, that requires being the correct user or having privileges. On Unix, that means it grants the write permission. |
| Changed | Moved installCrashHandler and resetCrashHandler from Log namespace to Platform. The program is not anymore aborted on Windows when the fatal exception is caught. The crash handler is not installed anymore during the Log initialization. |
| Added Changed | Enhanced Threading::ThreadPool class:
- Added several new convenience functions such as waitUntilFinished() and isFinished().
- Added option to query the current number of currently active threads.
- Renamed requestStop() to cancelTasks() and clarified its semantics.
Also added Threading::setCurrentThreadName() and Threading::ThreadPool::setThreadNames() functions so that the underlying OS/debugger may show them as description.
|
| Added API-Break | Extended the Resource::Repository interface so that it must provide a contains() predicate function checking whether the repository can provide a given resource. This allows to introduce the new Resource::locate() function enabling you to check whether a certain resource is available without actually loading it. |
| Added | Added extra functions to the Compression::zstd namespace to give users more control. |
ImFusionSeg
ImFusionStream
| Tags | Description |
| Added | Added BasicProcessingStream, which allows to rotate the content of an ImageStream on the fly. |
Version 2.29, released on 2021-04-14
ImFusionLib
ImFusionCT
| Tags | Description |
| Added | Added an algorithm for Ring Artifact Reduction. |
| Added | Added class ConeBeamInference for prediction of volumes and projections during reconstruction, which is not an algorithm and not considered to be used outside of that. |
ImFusionCore
| Tags | Description |
| Added | Added the Random namespace with the Generator and Pcg32Engine classes (the former using the latter). |
| Changed | Slightly changed the behavior of Url::fromLocalFile() to make it's behavior more predictable and consistent with Url::toLocalFile(). |
| Added | Introducing the ByteSize class to represent a number of bytes (e.g. file size) and offer convenience functions for conversion from/to KB/MB/GB. |
| Added Changed API-Break | Overhaul of the ImFusion::Filesystem interfaces:
|
ImFusionDicom
ImFusionSeg
| Tags | Description |
| Changed Deprecated | Renamed GlLabelRenderer::transparency() property to GlLabelRenderer::opacity() which is a more accurate description of the semantics. |
| Added | Added the option to restrict the LabelPainter to a 2D slice within a 3D volume |
Version 2.28, released on 2021-03-09
ImFusionLib
| Tags | Description |
| Fixed | Fixed a bug where ImFusion files were not able to store if the ImageDescriptor::isMetric flag is false and the image has a Z-spacing != 1.0. |
| Added | Locale is now set to locale::classic() in Framework::init(), and parameter conversion in Properties is made locale independent. |
| Changed | PointCorrAlgorithm can now configure which input image should be modified. |
| Added | Added inverse transformation, interpolation mode, and support for angles bigger than 180 degrees to GlPolarToCartesian. |
| Added | Added forward and backward differences to GlGradient. |
| Added | Introducing the new ColorPickerWidget as convenience widget for letting the user choose a color. It consists of a HsvColorPicker2d, HsvHueSlider, and an optional opacity slider. |
| Fixed | Fixed Spline::getUniformSamples which wasn't always computing the uniform samples correctly |
| Added | Added LicenseManagerDialog, a QWidget which can be used to activate a LicenseKey. |
| Added Changed | Added BallPivotingSurfaceReconstructionAlgorithm, adapted VISION to Open3D 0.12.0 api changes |
| Added | Added MeshProcessing::lineIntersection() utility function to compute a sorted list of intersections between a Mesh and a Geometry::Line. |
| Fixed | Fixed Geometry::Line::intersectsTriangle() not considering the isFinite state of the line. The function would always compute the intersection of an infinite line even if it was finite. |
| Fixed | The handling of arrays while converting between PropertyFile and JSON has been reworked. Now the round-trip conversion is lossless. A Param<std::vector<T>> will be correctly represented as a JSON array. Due to JSON limitations, T may be different than the original after converting back (it will be either integer, double, bool or string). |
| Added | Added support for loading Machine Learning Models from an included Resource (directly from the library dll/so). |
ImFusionCore
| Tags | Description |
| Changed | Improved handling of large files by ImFusionResourceCompiler: To reduce compiler memory usage, the binary data is split into chunks and glued back together at runtime. Also implemented compression support using the zstd algorithm. |
| Added | Added the Compression::zlib and Compression::zstd namespaces offering functions to compress and decompress data using the zlib and Zstandard compression algorithms. |
ImFusionSeg
ImFusionStream
ImFusionUS
| Tags | Description |
| Changed API-Break | FanMask now only works with US::FrameGeometry instances, the old UltrasoundGeometry interface was removed. The masks fully supports all geometries now, including linear ones with a non-zero steering angle. |
Version 2.27, released on 2021-02-09
ImFusionLib
ImFusionCT
| Tags | Description |
| Fixed | Fixed an issue where the renaming of the parameter "streamProjections" to "streamProj" for "Cone-beam Reconstruction" was not handled by the WorkspaceConversion. |
ImFusionCore
| Tags | Description |
| Added | Added the ImFusion Resource System system to embed arbitrary data into a library/executable and retrieve it at runtime.
This comes with a command line utility to generate a C++ file to build and link into your library/application, corresponding CMake bindings, as well as the Resource interface to query resources from multiple repositories. Refer to the corresponding Component Guide for detailed information.
|
| Added | Added ByteBufferStream utility class to pipe a ByteBuffer/ByteBufferView to a std::istream. |
| Added | Added ImFusion::String::iequals() method for case-insensitive string comparison. |
| Fixed | Fixed a bug where ByteBuffer::release() would always return a nullptr. |
| Added | Added MonoCypher based encryption in the Cryptography::MonoCypher namespace with methods for symmetric and asymmetric encryption, and signatures. Moved old encryption API to Cryptography::Legacy with shortcuts in the Cryptography namespace to fit the old API. The Legacy API is marked as deprecated. |
ImFusionDicom
ImFusionImageMath
| Tags | Description |
| Changed Added Deprecation API-Break | Major refactoring: 1) Moved everything into the "ImageMath" namespace. For the "ImgOps" namespace this is a breaking change. 2) Renamed classes and files:
- ExprChannelSwizzleView -> ChannelSwizzleView
- ExprLeafChannelWiseScalar -> ChannelWiseScalar
- ExprLeafScalar -> Scalar
- ExprLeafVariable -> Variable
- ExprLeafImage -> Array
- ExprBinaryTpl -> BinaryOpTpl
- ExprUnaryTpl -> UnaryOpTpl
- ExprAbstractInclude -> GlExpr
- ExprBinary -> BinaryOp
- ExprUnary -> UnaryOp
- ExprTplWrapper -> PolyWrapper 3) Introduced new builder methods: makeArray(), makeScalar(), makeChannelWiseScalar(), and Variable(). The old builder methods have been deprecated. 4) Added support for an arbitrary number of channels to ChannelWiseScalar. The scalar is passed as Eigen vector. 5) Added support for an arbitrary number of channels to ChannelWiseView. 6) Added a DeviceStrategy. Expressions now automatically detect if they can be executed on the GPU. Otherwise the CPU will be used. CPU execution can be forced with ExprBaseTpl::forceCPU(). 7) Added overloads for assign operators as well as binary operators which take scalars or Eigen vectors as arguments. Using makeScalar() and makeChannelWiseScalar() is only required in rare cases now. 8) Added macros to add unary and binary operators in ExprBaseTpl.h. These automatically generate the overloads for implicit scalar and Eigen vector convertion as well. 9) Moved anything that is not needed by the average user to the namespace internal. These are: ChannelSwizzleView, BinaryOpTpl, UnaryOpTpl, BinaryOp, PolyWrapper.
|
ImFusionML
| Tags | Description |
| Changed API-Break | Introduced ML namespace: most of the machine learning-related classes are now under the ML namespace. MLConfiguration has been renamed to ML::ModelConfiguration. MLParameter has been renamed to ML::AdvancedParameter. |
| Removed | Removed unused MLPluginSettings class. |
| Added Changed | Changed seeding to be recurrent in DataLoader and added a method for seeding on Dataset and the corresponding python binding. Added a seeding method to OperationsSequence. |
| Added Changed | Added new PersistentCacheDataLoader to cache data on the disk. Renamed standard disk cache from cache to memory_cache. |
| Added Deprecation | Separated DataReader from DataLoader and added functionality to configure Readers from config. Old configs still work but will give a DeprecationWarning, prompting the user to use the new config layout in the future. |
| Added | Added operation to add random noise to an image. |
| Changed | Pixelwise models now return a SharedImageSet with the very same type (potentially a derived class) as the input. |
| Changed | Changed implementation and add support for GPU computation of several Operations. |
| Changed Deprecation | Removed support of outlier estimation in NormalizePercentileOperation. Please use the legacy version NormalizePercentileLegacyOperation if you really need the old behaviour. |
| Added | Added Operations for free-form deformation of images. There is a deterministic (DeformationOperation) and a random version (RandomDeformationOperation). |
ImFusionRGBD
| Tags | Description |
| Changed | Refactored the RGBDSequence into an interface |
ImFusionReg
ImFusionStream
| Tags | Description |
| Changed | The OpenIGTLink connection handling has been completely restructured, in the UI as well as in the implementation. Support for TrackingData messages was added. The message and device type for a stream can be changed dynamically, without recreating the object. |
ImFusionUS
| Tags | Description |
| Added | Added SweepTrackingSwitchoverAlgorithm to allow switching from a calibrated live ultrasound sweep to another, making use of a different tracking device. This option is available in the Suite as "Ultrasound -> Register Tracking Streams". |
| Added | More seamless label conversion between 2D and 3D in the context of ultrasound sweeps. A new algorithm LabelCompoundingAlgorithm was added for convenient 3D compounding of a per-frame segmentation label map. Also, VolumeReslicingAlgorithm now uses adapted settings when applied on a label volume and creates a label map as output. |
| Changed | The "Process Ultrasound Stream" algorithm is now retrocompatible with its own older workspace configuration format. However, the user is required to specify the size of the input (e.g. framegrabbed) image through two new parameters "containingImageWidth" and "containingImageHeight". The new format can then be obtained by saving the current workspace. |
ImFusionVision
| Tags | Description |
| Added | Added an algorithm for tracking stream comparison in terms of the absolute trajectory error and relative pose error |
Version 2.26, released on 2020-11-11
ImFusionLib
| Tags | Description |
| Added Changed | Added InteractiveInfoOverlay: abstract class for creating overlays with text info in different style (tooltip or info box). Made PixelInfoOverlay and MeshInfoOverlay derive from it. |
| Fixed | Corrected the behaviour of ImageProcessing::rotateImpl which rotated in the y-axis into the wrong direction. The old behavior is still in the deprecated TypedImage<T>::rotate. |
| Fixed | Added proper filtering when downsampling a histogram in HistogramDataComponent::derivedHistogram(). This fixes a spiky/jittery display in the HistogramOverlay and the TransferFunctionWidget. |
ImFusionCore
ImFusionImageMath
| Tags | Description |
| Fixed | Fixed an issue where assignment of one image to itself could result in a one-off value for some pixel. The issue originate from the storage -> original -> original -> storage -> cast to storage type round trip. This could fail for integer types if shift and scale parameters are set. We now, instead of casting, always round to the closest storage value to prevent this issue. |
ImFusionML
| Tags | Description |
| Changed Deprecation | Refactored the entire inference machine learning inference framework. There should not be any breaking change, except for some low-level classes (which have been moved to a ML/Legacy subfolder). Old machine learning models (all models that are not in YAML format) are still supported but are being deprecated. It is recommended to get in touch with us to update your model file. |
ImFusionRGBD
| Tags | Description |
| Added | Added new version 8 of RFS file format to RGBDFilePlugin. Can now save per-frame transformation matrices. |
ImFusionSeg
| Tags | Description |
| Changed | Extended GlLabelRenderer class to support an alternative rendering mode that uses the LabelDataComponent as input for determining label colors. |
ImFusionStream
ImFusionVision
Version 2.25, released on 2020-10-16
ImFusionLib
| Tags | Description |
| Changed | The HDF5 IO algorithm now reads and writes spacing, shift, and scale values for each dataset, instead of one global set of values for all datasets. Old files with such a global set of values will still get loaded the same way as previously. |
| Changed API-Break | Changed color types in LabelDataComponent from vec3f to vec4f. The transparency of each label can now be changed individually. |
| Changed API-Break | Split the original ObjectRenderModes enumeration of GlSlice up into GlSlice::ObjectRenderMode and GlSlice::CrosssectionRenderMode as it was describing different rendering concepts. The original enum has been removed. New getters/setters for the cross-section render mode have been added. |
| Added Deprecation | Made DisplayWidgetMulti and its overlays easier to configure from the outside: Added DisplayWidgetMulti::DefaultOverlays enumeration that can be used with the new DisplayWidgetMulti::addDefaultOverlays() overload. The original overload taking 6 bools has been deprecated. Added InteractiveViewOptionsOverlay::setVisibleDisplayOptions2dSections() and InteractiveViewOptionsOverlay::setVisibleDisplayOptions3dSections() functions to configure what parts of the view- and display option overlays shall be shown. |
| Added | Added ApplicationController::signalAlgorithmRemoved that is emitted when an Algorithm is about to be removed. |
| Added | Added alternative constructor overload to Settings::Setting that allows for lazy-evaluating the setting's default value. |
| Fixed | The LicenseManager doesn't crash any more if the program exits before the license update process has ended. This was a rare occurrence for very short-lived tasks. |
| Fixed | The Qt TouchEvents forwarded from the DisplayWidget to each View's sceneEvent() are now in OpenGL coordinates, as it was already the case for MouseEvents and HoverEvents. Previously needed workarounds where the incoming event's y coordinate needed to be inverted are no longer necessary. |
| Added | Added CliqueLookupTable class to identify point constellations in larger pointclouds. |
| Fixed | Fixed the computation of the level/window in HistogramDataComponent::computeAutoWindowing() and the computation of the percentils based on window level in HistogramDataComponent::computeAutoWindowingParameters(). Previously there have been issues with shifts of half a bin and wrong border handling. Furthermore, fixed an issue in HistogramDataComponent where the auto windowing would return wrong results if one bin contains more than 2^24 values. |
| Deprecation API-Break | Deprecated all function of the legacy Image and Algorithm API, such as:
In a very few occasions it would have been too complex to introduce a deprecation layer for owning raw pointer overloads. There, we function signature was changed directly to use unique_ptr, which may yield a compilation error on consuming code.
|
ImFusionCT
| Tags | Description |
| Fixed | Fixed an issue introduced in the previous fix. In order to compute the up vector of the detector the first column of the rotation matrix was considered while it should have been the row. This caused instabilities such that only some parameters for deltaAngle and deltaHeight produced correct calibration results. |
ImFusionCore
ImFusionDicom
| Tags | Description |
| Changed | Improved reconstruction of 4D volumes (e.g. perfusion datasets). Multiple overlapping volumes are now treated as 4D (or 3D+t) volumes instead of a list of 2D images. |
| Changed API-Break | The DICOM plugin now uses Filesystem::Url instead of QUrl. |
| Changed | Dicom::Extension derives from ErrorRecorder and errors are correctly forwarded to DicomLoader and DicomWriter. |
| Changed | Dicom::LoaderExtension can now also be used for extending the DicomWriter and has been renamed to Dicom::Extension. |
Version 2.24, released on 2020-09-14
ImFusionLib
| Tags | Description |
| Changed | The default implementation of DataComponent::equals() will no longer compare parameter types and attributes of the two DataComponent instances. Both properties are only intended for display/UI aspects and should not affect the comparison result. |
| Fixed | Fixed MemImage copy constructor and assignment operator that were accidentally defaulted instead of deleted. |
| Removed | Removed MeshCenteringAlgorithm, use Mesh::moveToCenter instead. |
| Fixed | Fixed GlPointBasedAnnotation::renderPoint and GlPointBasedAnnotation::renderLabel not considering matrix |
| Fixed | Fixed bug with multi-file MetaImage export (.mhd/.raw) where every other image slice appeared to be a composite of half of the previous and half of the subsequent image. The bug was introduced on 14 May 2020. |
| Fixed | Fixed incorrect channels bug in QtImageIO when loading and saving bmp images with 32 bits and alpha channel. |
| Added | Added a constructor to DataWidget taking the necessary references. The previous constructor now forwards values to it. Added ApplicationController::canBeDeleted as a virtual function that MainWindowBase::canBeDeleted now overrides. |
| Fixed | The Level of Detail of a 3D View is now adjusted when dragging via touch input for increased performance, as was already the case for mouse input. |
| Fixed | Fixed a bug in SharedImageSet::swapWith() and TrackedSharedImageSet::swapWithImageSet() interfaces if their ownership flag differs. Calling those functions in this cases will fail, as it can not be supported. |
| Changed Deprecation | Migrated the DataModel class to smart pointers:
|
| Removed | The Settings::storeViewSettingsPerDataset setting will no longer store InteractiveOverlay visibility status as part of the per-data view options. |
| Fixed | Fixed the mask support in GlReduction in case of an average reduction of a 3D volume. If the volume has a size greater than 64 in both x and y direction, the returned values were invalid. |
| Added | Added DataModel::linkData() and DataModel::unlinkData() convenience functions. |
| Changed | Move workspace serialization logic of DataLinks from DataWidget to the Workspace class. This allows for saving/restoring this information also without MainWindowBase. The Workspace format has been slightly changed as a result. |
| Changed API-Break | Renamed the PropertyLink interface to DataLink for increased naming consistency. The corresponding header file has been renamed as well. |
ImFusionCT
| Tags | Description |
| Fixed | Fixed an issue in ConeBeamCalibration which resulted in wrong rigid parameters. The issue was caused by a sign bug while extracting the device parameters from the intial estimated projection matrices. |
ImFusionCore
| Tags | Description |
| Added | Added Utils::nullopt, an object of Nullopt type used to indicate an uninitialized Optional. Practical to replace the Optional<T>{} syntax, where T depends on context. |
| Added | Added Filesystem::Directory::isEmpty and Filesystem::Directory::contains, equivalent to scan().empty() and !scan(...).empty() respectively. |
| Changed | The warning that the log is not initialized will only be displayed once. |
ImFusionDicom
| Tags | Description |
| Added | Improved rendering of RT Structure Sets. While they are still internally represented as PointClouds, they are now rendered as contours on the original slice and as meshes in 3D. They are also now longer part of the AnnotationWidget but are displayed in a separate list. |
| Added | Added Dicom::Utils::convertPropertiesToDataset to add arbitrary DICOM tags into a dataset. The tags should be specified as a Property object. Subproperties can be used to specify arbitrarily nested DICOM sequences (according to the standard). |
| Changed | Series with MRI modality are now grouped according to their Acquisition Number if available. |
| Changed | Passing a non-existing file to Dicom::DatasetCache::load no longer returns a list with nullptrs. |
ImFusionImageMath
| Tags | Description |
| Changed | Several internal tools have been moved from the header-only part into the ImFusionLib. |
| Changed | Exceptions have been replaced with either static or runtime asserts. |
| Changed | Support for VisualStudio 2013 has been removed. |
| Changed | ExprAbstractInclude no longer requires a ExprBase. Instead any expression now implements the ExprShaderInterface. |
| Changed | The value of an image is now always considered floating point. I.e. float on the GPU and double on the CPU. Previously the type of the image was used which resulted in false results if shift and scale were set to non rivial values. |
| Fixed | Fixed an issue where shift and scale was not correctly handled when evaluating an expression on the CPU. This led to the change above. |
ImFusionML
| Tags | Description |
| Changed | General fixing of Operations, MLSamplers and their python bindings. Some Operations parameter names were harmonized with the bindings parameter (Samplers are not affected). The old parameters name are deprecated, if used a deprecation warning is cast. List of affected Operations (OpName: old_name -> new_name) AdjustShiftScale: adjust_shift -> shift, adjust_scale -> scale ArgMax: channels -> selected_channels Crop: crop_size -> size, crop_offset -> offset MakeFloat: apply_to_label -> process_label (Operation) NormalizeMAD: channels -> selected_channels NormalizePercentile: min -> min_percentile, max -> max_percentile NormalizeUniform: apply_to_label -> process_label (Operation) OneHot: channels -> num_channels RandomAxisFlip: flip_axes -> axes RandomAxisRotation: rotation_axes -> axes SelectChannels: channels -> selected_channels Threshold: threshold -> value |
ImFusionStream
ImFusionUS
| Tags | Description |
| Changed API-Break | PlaybackTrackingStream now accepting vector of multiple TrackingStreams as input. |
| Changed | Complete refactoring of US frame (fan) geometries. Previously, there were two different places to store the geometry of an US frame: UltrasoundMetadata ([mm], assumption that the fan spans the whole image) and UltrasoundGeometry ([px], incomplete support for linear frames). Now, the US::FrameGeometry and derived classes are used for describing the geometry of a frame. A FrameGeometry is now contained in a FrameGeometryMetadata, and that is the only storage location. UltrasoundSweeps don't have a UltrasoundGeometry anymore, but quick accessors to the geometry contained in the metadata. UltrasoundSweep::frameGeometry() is guaranteed to create a geometery if none exists so far. UltrasoundMetadata were stripped of content describing the frame geometry. There are conversion methods to the UltrasoundGeometry class, if needed, but they are deprecated. |
| Changed | Complete refactoring of US frame (fan) geometries. Previously, there were two different places to store the geometry of an US frame: UltrasoundMetadata ([mm], assumption that the fan spans the whole image) and UltrasoundGeometry ([px], incomplete support for linear frames). Now, the US::FrameGeometry and derived classes are used for describing the geometry of a frame. A FrameGeometry is now contained in a FrameGeometryMetadata, and that is the only storage location. UltrasoundSweeps don't have a UltrasoundGeometry anymore, but quick accessors to the geometry contained in the metadata. UltrasoundSweep::frameGeometry() is guaranteed to create a geometery if none exists so far. UltrasoundMetadata were stripped of content describing the frame geometry. There are conversion methods to the UltrasoundGeometry class, if needed, but they are deprecated. |
| Changed API-Break | Updated UltrasoundSweepRingBuffer::insert() member function to use std::shared_ptr<SharedImage> as parameter type. |
| Changed API-Break | Updated UltrasoundSweepRingBuffer::insert() member function to use std::shared_ptr<SharedImage> as parameter type. |
Version 2.23, released on 2020-08-11
ImFusionLib
| Tags | Description |
| Changed Deprecation | Deprecated the Utils/Algorithms.h header and its helper functions such as executeAlgorithm() et al. All this functionality has been migrated to the new smart pointer-based Algorithm/Image API and moved to the Utils/AlgorithmUtils.h header file. Furthermore, these functions have been put into the AlgorithmUtils namespace, e.g. AlgorithmUtils::execute(). |
| Added Changed Deprecation | Added OwningDataList::extractFirst() and OwningDataList::extractFirstImage() member functions and renamed several other member functions for increased consistency and readability:
|
| Changed | Introduced convention of ultrasound images to be stored so that pixel (0,0) is in the upper left corner. For most image formats, this is the default anyway. ImFusionFile will flip US images if they are not and update calibration and metadata accordingly. This behavior can be turned off either by calling ImFusionFile::setEnsureTopLeftOriginOnLoad or globally by setting the IMFUSION_LEGACY_IMAGE_ORIENTATION environment variable. See Coordinate Systems for more information. |
| Fixed | Fixed Geometry::fitPlane(). The plane offset computation was recently broken (on 2020.07.21) and returned the inverse of the offset instead. |
| Fixed | Fixed an issue in the PCA class where the covariance matrix was not properly normalized w.r.t. the number of samples. |
| Added Deprecation | Added GaussianFilter class, deprecating Filters::gaussianFilter2D/3D. |
| Fixed | Fixed invisible MPR intersection lines still triggering SliceManipulator. Fixed GlSlice::drawOtherSlice() evaluating the wrong GlSlice::objectRenderMode. |
| Fixed | Added mode INCREASE_BIT_DEPTH for increasing bit depth from 8-bit to 16-bit to BasicImageProcessing. |
| Added | Added support for annotation per frame on 2D data. |
| Added | Added Auto view layout configuration. Modifies the views layout automatically to adapt to the number of views, in the way that we believe data is best visualized. |
| Fixed | Fixed a bug in MemImage::rotate(const mat3&, bool, double) when applied to multi-channel images. |
| Added | Added support for multi-channel NIFTI images (RGB24 and RGBA32). |
| Added | Added SharedImage::assign(std::shared_ptr<Image>) function to move/sink in images into a SharedImage without copying. Added SharedImage::descriptor() convenience function. |
| Added | Added interfaces to ImageProcessing for applying processing to user provided output images avoiding extra allocations. Performance improvement of flip and rotate. |
| Added | Added experimental chroma-depth rendering mode to GlVolumeRendererGlobalIllum, which encodes distance from the camera by applying a warm-cold color gradient to the volume rendering. This can be particularly useful for low-contrast data such as ultrasound volumes. You control this setting through the GlVolumeRendererGlobalIllum::RenderOptions DataComponent of each data set. |
| Added Deprecation | Introducing the new PropertyLink interface providing functionality to keep certain aspects of Data (e.g. windowing information) in sync across multiple Data instances. Added LinkWindowing and LinkPose classes as initial demonstrations of this concept. The DataModel class was extended to also manage PropertyLinks. Added options to DataWidget to automatically link windowing per modality and/or link pose on grouping of Data.
The global per-modality DisplayOptions2d concept has been deprecated and removed from the UI. Use the LinkWindowing interface instead to model such behavior.
|
ImFusionCT
| Tags | Description |
| Changed | Fixed/Changed ConeBeamSimulation. Previously the algorithm used to add simulation either to the reference or to the previous simulation. Depending on if a reference was provided and if a simulation has been previously computed. Now the algorithm always creates a new dataset and the only information taken from the reference is the geometry. |
ImFusionCore
| Tags | Description |
| Fixed Changed | Fixed potential lifetime/invalid memory access issue in StoppableThread: Detaching a StoppableThread has been disallowed, there is no valid use case for that anyway (if you want to eventually stop a thread, there is no reason to detach from it). As a corollary, StoppableThread will now join on destruction by default. |
| Added | Added blacklist filters to the Log::Sink class. Previous filters, which were whitelist filters, are now explicitly named as such. Whitelist filters always take precedence over blacklist filters. |
| Added | Added Platform::getEnvironmentVariable and Platform::setEnvironmentVariable to manipulate environment variables in a portable way. |
ImFusionDicom
| Tags | Description |
| Added | Added support for RT Structure Sets. They are loaded as point clouds and can be converted to label maps. |
ImFusionRGBD
| Tags | Description |
| Removed | Moved OneShotCalibration to OneShot plugin |
ImFusionSeg
| Tags | Description |
| Added | Added an algorithm to compute an intensity clustering based on a watershedding on the histogram of an image. |
| Changed | Changed type of color map in GlIsolineRenderer to allow setting the opacity |
ImFusionStream
Version 2.22, released on 2020-06-10
ImFusionLib
| Tags | Description |
| Added | Added VolumeFreeformCroppingAlgorithm. Allows the user to select a freehand cropping volume from the point of view of the camera. Works on both 3D and MPR views. |
| Changed | Changed the behavior of SharedImage when syncing images with more than 4 channels. Since OpenGL can not handle more than 4 channels, a synchronization MemImage -> GlImage will discard any additional channels. If this happens the corresponding GL representation can no longer be marked as dirty to avoid accidental data loss when syncing the GlImage back to a MemImage. SharedImage::setDirtyGl() will log a warning in this case and return false. |
| Changed | Changed the behavior of MergeChannelsAlgorithm. Now the matrix of the different images is taken into account during the potential resampling. Moreover, the images are not necessarily converted to float: if all images have the same type, then the output image will also have this type. |
| Fixed | Fixed an issue where a AlgorithmListener was not added to Algorithm::m_listeners. |
| Changed API-Break | Refactoring MeshIO and MeshIO tests:
- MeshIO changed from class to namespace
- flipYZ boolean flag removed from MeshIO functions
- Added function that creates hardcoded reference meshes with texture, colors, and halfedges
- Modified fileLoadingTest() to test all combinations of reference mesh
- Removed loadFromPLY() and renamed loadFromPLY2()
|
| Added Deprecation | Added the functionality to save and load MetaImage files (.mhd, .mha) with compressed image data. Added the MetaImage::SaveOptions struct for passing various optional parameters to MetaImage::save(). Deprecated versions of MetaImage::save() taking boolean arguments as optional parameter arguments. |
| Fixed | Fixed MeshProcessing::pointToSurfaceDistance(). Before, the distances could be slightly off from the true values |
| Added | Added DisplayOptions2d::useMask and DisplayOptions3d::useMask interface to configure whether a 2D/3D view shall consider the mask of an individual data set of not. This is useful in scenarios where you want to use masks to support certain algorithms (e.g. Image Registration) but still want to render the entire image or if you want to use a mask to cut away parts of the 3D visualization but still show the entire image in 2D. |
| Fixed | Fixed a potential crash in GlObjectPicking if OpenGL 4.4 was not available. |
ImFusionCT
| Tags | Description |
| Changed | Changed the HU calibration to use a 14bit range instead of a 12bit range if 16bit are used. |
| Changed | Added "p_" prefix for all Parameters of ConeBeamSimulation and HUCalibrationAlgorithm. |
ImFusionCore
ImFusionDicom
| Tags | Description |
| Added | Added support for caching of data retrieved from a PACS server. |
| Fixed | Fixed potential bug in Dicom::DatasetCache where the url was not normalized when an item was requested from the cache. In rare cases this could result in a Dicom dataset being unnessessarily reloaded from its originial origin. |
ImFusionML
| Tags | Description |
| Added | DataLoader, a general utility for preparing datasets for training and validating machine learning models. |
ImFusionReg
Version 2.21, released on 2020-04-17
ImFusionLib
| Tags | Description |
| Changed Deprecation API-Break | General overhaul and modernization of the Image API:
- Usage of the Image base class as image descriptor has been deprecated. Use the new ImageDescriptor struct instead. This avoid ambiguous function overloads taking an Image as polymorphic argument.
- Member functions of Image, SharedImage, and SharedImageSet that use owning raw pointers have been deprecated. The new overloads with std::unique_ptr or std::shared_ptr should be used instead.
- SharedImageSet has been refactored to hold its SharedImages in a std::shared_ptr. This makes the previous container mode (own flag) obsolete and deprecated. Copy the std::shared_ptr directly to model 'container' SharedImageSets providing a view onto images. You can access the std::shared_ptrs via SharedImageSet::getShared() and SharedImageSet::images().
- The SharedImageSetIterator has been deprecated because of confusing semantics. In the near future, SharedImageSet will no longer be iterable. Use the new SharedImageSet::selectedImages() member function to get a temporary std::vector of the selected images to iterate over instead.
- As a corollary, the interface to clone a SharedImageSet has been overhauled as well: clone() and nonOwningClone() have been deprecated, use the new SharedImageSet::clone2() member function instead (clone2() will be renamed to clone() once the old deprecated functions have been removed completely).
- The majority of basic image processing functions in MemImage / TypedImage has been deprecated. Use the new free functions in the ImageProcessing namespace instead. These functions will always create a new Image instance if the image descriptor changes. You can use move assignment or std::swap to mimic an in-place processing operation.
- The ImageListener interface has been deprecated. There is no planned replacement. Use the shared ownership models of SharedImage/SharedImageSet if you want to implement shared ownership of image data.
Have a look at the updated documentation in Using Image Data and Algorithm/Image API Migration Guide for details and usage examples.
|
| Added | Added TransferFunctionFactory::createCtSkinSoftTissueBonePreset() for a new transfer function present for showing skin, soft tissue, and bone in CT image data. |
| Added | Point clouds can be exported to PLY and OBJ file formats. |
| Added | Added functionality to GlFixedFunctionPipeline to optionally use the order-independent transparency feature of the SDK. In order to activate this feature, pass the GlOrderIndependentTransparency instance to the enable() call. |
| Changed | GlStateGuard::DepthTest will also store and restore the state of the glDepthMask() setting. |
| Fixed | Proxy server set during license activation is remembered on next start. |
| Added | Added GlPlane for plane annotations. |
| Changed | ImageView2D ignores the image matrix if contains a 3D rotation. If multiple images are selected, matrices are ignored it at least one contains a 3D rotation. |
| Fixed | Fixed potential crash when loading corrupt JPEG files on Windows. |
| Changed Deprecation | Removed the optional matrix interface from SharedImage. A SharedImage will now always have a matrix. SharedImage::hasMatrix() was deprecated and will always return true. |
| Fixed | Fixed ImageComparison returning Algorithm::Success status only if the input images were equal. Use ImageComparison::imagesAreEqual() to check for equality using the API. |
| Added Fixed | Fixed a couple of bugs in the InteractivePixelInfoOverlay class that shows the pixel intensities under the current mouse position as view overlay. This class is now also exported to the SDK and thus available to be used directly. Added new functionality to the underlying GlTextOverlay. You can now set a custom hinting text that is used instead of the current text to calculate the required overlay space. This can avoid the constant resizing of the overlay in case of continuously changing text. |
| Fixed | Fixed BilateralFilterAlgorithm not preserving image transformation matrix in all configurations. |
ImFusionDicom
| Tags | Description |
| Changed | DicomLoader will parse the Acquisition Time tag and store the relative offset to the first frame in the timestamps of image and volume sets. Dicom::Utils::convertDICOMTime() was updated to correctly parse TM value representations up to millisecond precision. |
| Changed | A series with multiple frames is only loaded as a single SharedImageSet if all frames have the same ImageType. Otherwise they will be split up according to their ImageType. This should avoid problems with volume series that additionally contain a 2D scout/overview frame in the same series. |
| Changed | The DicomLoader will no longer load a single series as both a 2D imageset and a 3D volumeset (e.g. when some slices are missing). Instead the series will be returned as a single 2D imageset. This behaviour can be modified with DicomLoader::setSplitVolumes. |
ImFusionImageMath
| Tags | Description |
| Fixed | Previously we processed SharedImageSets in chunks on the GPU. This was implemented using sampler arrays in OpenGL. Apparently not all drivers implement this correctly. We disabled this feature and instead process the images individually. |
| Added | Added a cache for the GLPrograms which are used for assignment. The major benefit from this is that if you have a tight loop which executes a semantical equivalent expression on multiple images, a single program is compiled which gets reused. The cache is thread and context sensitive. |
ImFusionML
ImFusionRGBD
| Tags | Description |
| Changed | Use a single global RealSense context instead of per-sensor context. Made setting of the default streams and formats optional when creating RealSenseStream object or enumerating RealSenseStream devices |
| Added | Added support for rigid transformations between one shot calibration batches. New method OneShotCalibration::rigidityOutliers added to check for rigidity assumption. |
| Added | Added RGBDStreamFactory for enumerating all connected sensors and making custom RGBD sensors known to framework |
ImFusionUS
Version 2.20, released on 2020-03-11
ImFusionLib
| Tags | Description |
| Changed Deprecation API-Break | General overhaul of the Algorithm interface:
- Algorithm::output(DataList&) was declared deprecated, use the new Algorithm::takeOutput() instead. The default implementation of these two member functions forward to the respective other to maintain compatibility of existing code.
- Introduce Algorithm::FactoryInfo struct with corresponding getters/setters to store information about how an Algorithm was created by the factory. Naming is explicit to make intentions clear.
- Algorithm::input(), Algorithm::setName(), and Algorithm::name() are deprecated. Use the FactoryInfo struct instead. Algorithm::setInput() has been removed completely because of its highly confusing semantics.
- Removed unused Algorithm::categories() interface.
- The AlgorithmListener interface was deprecated and replaced by dedicated signals Algorithm::signalParametersChanged and Algorithm::signalOutputChanged. AlgorithmController now inherits from SignalReceiver and will connect to these signals on construction.
- Hints for migration:
- Calling Algorithm::setInput() will yield a compiler error. Chances are quite high that you don't want to call it and should remove the call. Otherwise use Algorithm::setFactoryInfo().
- Using Algorithm::m_input will yield a compiler error. Chances are high that you don't need it, otherwise use Algorithm::m_factoryInfo.input.
- There may be a compiler warning (in rare cases also a compiler error) in AlgorithmControllers if they now inherit twice from SignalReceiver. This should be resolved
- You no longer need to call Algorithm::addListener() in your AlgorithmController because the base class does it for you (same with removeListener()).
Have a look at Algorithm/Image API Migration Guide for details and usage examples.
|
| Added | Introducing the new OwningDataList class, a DataList exhibiting ownership semantics. It is essentially a std::vector<std::unique_ptr<Data>> providing extra syntactic sugar in the form of convenience functions for filtering and extraction. |
| Added | Added Controller::setTitle() as improved means to set a Controller name in the GUI (so far this could be achieved by an undocumented side effect of Algorithm::setName()). |
| Fixed API-Break | Fixed a potential data race in the Octree class due to multi threading. As a result, the low-level Octree class now only accepts a std::shared_ptr<const MemImage> as input. There are no API changes if you use the high-level OctreeDataComponent interface. |
| Fixed | Fixed saving and loading of texture images to/from PLY files |
| Added | Added GlMesh::projectiveIntersectionTolerance() parameter to configure an optional tolerance during the computation whether a mesh intersects the MPR plane in projective render in mode. |
| Changed Deprecation | The screenshot functionality of DisplayWidget now uses rendering to a dedicated Framebuffer Object instead of directly reading from the windowing system's framebuffer. This avoids race conditions. The new DisplayWidget::captureScreenshot() method replaces the now deprecated DisplayWidget::getScreenshot() function. In addition, you can now create screenshots at custom resolution. |
| Added | Added convenience comparison operator overloads for the Parameter class. Thus, oparator== and operator!= comparison of a Parameter<T> instance with an instance of type T does no longer require calling Parameter::value(). |
| Added Deprecation | Introduced the Algorithm::takeOutput() member function as replacement for Algorithm::output(), which is now deprecated. The new function is easier to use and exhibits clear ownership semantics by returning an OwningDataList. This new class was added in order to mimic the already existing DataList in terms of convenience functions but explicitly model ownership of the held Data. |
| Fixed | Fixed Workspace class not supporting placeholders for the execute flag of algorithms. |
| Added | Added ImFusion file support for point clouds. |
| Added | Added ImFusion file support for meshes without textures. |
| Changed Fixed | Changes and fixes to the projective rendering modes of GlMesh in MPR views:
- fixed a bug where front/backside were flipped when GlSliceView::flip() was enabled
- normalize color gradient wrt. mesh depth projected onto view direction
- add new ProjectiveWireframe render mode that shows frontside solid and backside in wireframe mode
- renamed GlMesh::RenderMode2d enum value ProjectiveDepthEncoding to ProjectiveColorGradient
|
| Fixed | Fixed a potential crash in JpegIO when reading corrupt files. |
ImFusionCore
| Tags | Description |
| Changed | Improved SignalImpl interface to make use of empty base class optimization. Use explicit template instantiation declaration for common signal types. |
ImFusionDicom
| Tags | Description |
| Fixed | Increased the tolerance which determines whether slices are consider equidistant and reconstructed to a volume. |
ImFusionML
| Tags | Description |
| Changed | Renamed SequentialProcessing into OperationsSequence. Factored out Operations into own hdr/cpp. |
ImFusionRGBD
| Tags | Description |
| Added | Added support for fixed marker transformations to OneShotCalibration (single batch only) |
| Added | Added disconnect signal to RealSenseStream |
| Added | Added method connectedSensors to OneShotCalibration for retrieving sensor connected components |
ImFusionUS
| Tags | Description |
| Fixed | Fixed a bug where SweepDisplayDataController::setPlane() would assign non-rigid view matrices to a GlView if a UltrasoundSweep's matrix was non-rigid. The link MPR functionwill now erase any affine part before assigning the matrix to the GlSlice. |
| Fixed | UltrasoundGeometryDetectionAlgorithm was not working on non-isotropic images. |
| Fixed | VolumeReslicingAlgorithm was not setting the spacing of the resulting slabs. |
Version 2.19, released on 2020-02-12
ImFusionLib
| Tags | Description |
| Changed API-Break | We changed our logging framework and no longer rely on log4cxx. Instead we developed ImFusionLog, a very lightweight logger interface that allows for easy extension and integration into other 3rd-party logging frameworks that may be used by consumers of the ImFusion SDK.
Please refer to the corresponding Doxygen page for more detailed information.
|
| Added Changed | Introduction of the new ImFusionCore module serving essential core core functionality that is not specific to any business logic. This is the first step in an effort to reduce the complexity of the monolithic Base Library module and split it up into individual parts.
The following functionality has been moved to ImFusionCore:
The new headers can be found in the ImFusion/Core include directory. Some namespace and function names have been changed for consistency. For now the corresponding headers in ImFusionLib (ImFusion/Base) transparently forward to their new location and contain aliases in case of name changes. Future releases will deprecate this forwarding layer and eventually remove it as of Version 3.0
|
| Changed API-Break | Updated all classes to follow the new coding guidelines wrt. the Parameter API: public class members of type Parameter now have a p_ prefix, e.g. Parameter<vec3> p_targetResolution. Amongst others, this affects the following SDK Algorithms: ImageResamplingAlgorithm, SharedImageArithmeticAlgorithm, LandmarkPredictionAlgorithm, LabelStatisticsAlgorithm, LineToIsosurfaceIntersectionAlgorithm, RemoveDuplicateFrames |
| Changed API-Break | Various changes to ParameterMixin and Parameter API:
|
| Fixed | Fixed writing and loading of the PCD point cloud colors. Added ImFusion versioning for PointCloudIoAlgorithm. |
| Fixed | Fixed mesh cropping, which was occasionally giving wrong results. |
| Fixed | Fixed bugs in Geometry::Triangle::intersectsPlane(), where not all intersection situations were taken into account. |
| Deprecation | Deprecated MeshProcessing::triangleIntersectsPlane(). Use the more robust function Geometry::Triangle::intersectsPlane()instead. |
| Fixed | Improved logic for automatically determining near/far clip planes in GlVolumeView to handle extremely small scenes correctly as well. |
| Changed Removed | Changed default search paths of Framework::loadPlugins() and ApplicationController::loadPlugins(). They will now also search relative to the ImFusionLib shared library file. The obsolete IMFUSION_PLUGIN_PATH_32 environment variable is no longer considered. |
| Added | Added ImageROISampler interface and several implementations in the ML plugin. |
| Added | Added MeshCollisionDetectionAlgorithm to find if two Meshes are colliding, or are further away than a given safety distance. |
| Added | Added ClSort class for OpenCL-based sorting of vectors. |
| Added | Added algorithm SynchronizeMemGlAlgorithm in GL folder that allows manual CPU-OpenGL synchronization of a SharedImageSet. |
ImFusionStream
| Tags | Description |
| Added | Fake image stream. Simulates a running image stream, for algorithm testing or general purpose. |
Version 2.18, released on 2020-01-15
ImFusionLib
| Tags | Description |
| Deprecation | Deprecated the SelectionListener interface. Use the SharedImageSet::signalSelectionChanged signal directly instead. |
| Changed Deprecation | Several improvements of the SharedImage API:
- The SharedImage(Image&) constructor has been deprecated due to unclear ownership semantics. Use one of the other overloads instead. Initialization can be done using a std::unique_ptr<Image> or a std::shared_ptr<Image>. Furthermore, two new constructor overloads have been added that allow moving a TypedImage<T> and a GlImage into a SharedImage.
- The SharedImageListener interface has been deprecated. Use the corresponding signals directly.
- The resize() and matrixPointer() member functions have been removed. If you need to resize a SharedImage call resize() on one of its representations and set it dirty.
|
| Fixed | Fixed a bug where m_useContextMenu was not considered in all Interaction classes. |
| Removed | Removed InteractionFilter class. |
| Changed | GlSliceRenderer will no longer apply thick MPR rendering to label maps. |
| Added | Added functionality to GlProgramIncludeManager to distinguish different sets of shader defines in addition to the abstract includes. |
| Fixed | Fixed an issue which prevented a GlMesh to be rendered with shading if wrapped by a GlProjectiveObject. |
| Added | Added GlVolumeView::setUseAutoClipDistance() property to allow users to configure whether the OpenGL near/far clipping planes shall be deduced automatically. You can disable this flag in order to set custom near/far clipping planes using GlVolumeView::setNearClipDistance() and GlVolumeView::setFarClipDistance(). |
| Added | Added CSVParserDialog to parse CSV files into a Table. Added CSVTrackingStreamDialog to select appropriate headers for a Tracking Stream. |
ImFusionDicom
ImFusionML
| Tags | Description |
| Changed | Fully convolutional networks with version 2 now take into account the topDown flag property of SharedImageSets (the behaviour of old networks, i.e. version 1, is unchanged). |
| Changed | Add label processing to ML operations. Added tests. |
ImFusionRGBD
| Tags | Description |
| Added | Added support for Microsoft Kinect Azure. |
ImFusionSeg
| Tags | Description |
| Added | Added Spline-based Label Painter algorithm in production. |
ImFusionVision
| Tags | Description |
| Added | Added PatchMatch-based image inpainting algorithm. |
Version 2.17, released on 2019-11-29
ImFusionLib
ImFusionDicom
| Tags | Description |
| Added Removed | There is a new and easier way to extend the loading of DICOMs through Dicom::LoaderExtension. See the Dicom documentation for details. The Dicom::IOD::loadFrameLessProperties method was removed and can be replaced with a Dicom::LoaderExtension. |
| Changed API-Break | The Dicom::IOD::createContainer method was converted to a function in Dicom::IOD_Registry. |
| Fixed | Fixed DICOMs with missing Modality not being loaded at all |
| Changed | Improved loading of multiframe DICOM files. The 'Number of Frames' tag is now also supported outside of Enhanced Multi Frame SOPs. Any file containing a 'Number of Frames' value greater than 1 will always be loaded as a individual SharedImageSet and never be combined with other files even if the have the same series UID. If you have data where this should not be the case, please let us know. |
ImFusionStream
ImFusionUS
Version 2.16, released on 2019-11-06
ImFusionLib
| Tags | Description |
| Added | Added HistogramDataComponent::minmax() overloads accumulate the minimum/maximum values of all images contained by the SharedImageSet. |
| Fixed | Fixed BasicImageProcessing default values for min/max thresholds not considering all images of a SharedImageSet. |
| Fixed | Fixed an issue when rendering intersections of a GlMesh in a GlSliceView would not show all faces/lines. |
| Changed | The picking for GlPointBasedAnnotation now takes point size and line size into account. |
| Fixed | Fixed a bug where GlOrderIndependentTransparency might break the mesh rendering on certain Intel GPU/driver combinations due to a driver bug. |
| Fixed | Fixed a bug where the sceneCenter was not considered in case of touch events in InteractionView3D. |
| Fixed | Fixed a bug in slice-slice intersection code in Slice::intersect(). Due to numerical instability, certain combinations of slice orientations would yield false negatives in the finite mode. |
| Changed | The CMake config for the ImFusionLib on unix systems only requires C++11 now instead of 14. This should work fine with the majority of SDK headers. If you encounter compile errors related to the C++11 version use CMAKE_CXX_STANDARD to an appropriate version. |
| Added | Added an optional Mask for the LabelToMesh and MarchingCubes algorithms. The resulting mesh will only contain vertices that are within the provided mask. |
| Changed | When saving snapshot workspaces (i.e. Workspace::Mode::Snapshot) all data will be written to a dedicated file stored next to the workspace file.
Previous versions would not write data that was originally loaded from disk. However, this could lead to bugs where in-place operations were not tracked correctly.
|
ImFusionCT
| Tags | Description |
| Changed | Changed the behavior of the parameters cropFan and cropRadius of CBCTPostProcessing. These parameters are now independent, i.e. cropFan controls the fan cropping and cropRadius controls cropping the radius only. |
ImFusionDicom
| Tags | Description |
| Fixed | Fixed a bug where the DicomBrowser was opened for a given folder even if there was not a single patient found. |
Version 2.15, released on 2019-10-11
ImFusionLib
| Tags | Description |
| Changed | Fixed potential conflict of invariants between DataComponentList and LazyInstantiatedDataComponent: The assignment operator of DataComponentList would also delete held LazyInstantiatedDataComponents even though they are guaranteed to stay alive for the lifetime of the parent Data.
With this fix DataComponentList assignment will no longer delete LazyInstantiatedDataComponents but keep them alive. As a result, two DataComponentLists are not necessarily the same after assigning one to the other. To emphasize that they do not follow value type semantics, the assignment operator of DataComponentList has been removed and replaced with an explicit assign() function, analogous to DataComponent::assign().
|
| Changed | Improved API for disconnecting using SignalConnection tokens. This is now to be done using the new SignalConnection::disconnect() interface, which does not require accessing the corresponding signal (which might already be dead). Furthermore, SignalConnections are now held in shared_ptrs as they exhibit have three-way lifetime dependencies. Therefore, Signal::connect() also returns a std::shared_ptr<SignalConnection>. |
| Changed | Migration of the view- and overlay interfaces to std::unique_ptr where feasible. This breaks the API in cases where a function would take an owning pointer using a raw pointer as argument and installing a deprecation layer was not feasible. The following interfaces and classes are affected:
|
| Added | Added GlView::ViewStateGuard utility class to temporarily change the GlViewState of a GlView. This allows for a better implementation of proxy GlObjects that render another GlObject with a different view state than the one of the view (e.g. GlProjectiveObject). |
| Fixed | Fixed a bug where the HistogramOverlay would not update when the Image's window/level values change. |
| Added | Added stable Geometric Mean calculation to Math.h |
| Added | Updated the OptimizerXNES API, which now supports a sparse mode that can efficiently deal with large dimensional problems. |
| Changed Removed | The deprecated compression options for exporting data into ImFusionFiles have been removed (RLE, 12-Bit Packed, Diff+Huffman). It is however still possible to open files that have been encoded in this way. FFV1 and H264 (lossy compression) are still supported, and they can now be also used for multi-channel images. |
| Fixed | Fixed a bug where GlProjectiveObject was not properly working for GlMesh. |
ImFusionCT
| Tags | Description |
| Added | Added support for DICOM data from the RFD system by Ziehm |
ImFusionDicom
| Tags | Description |
| Fixed | Some 'CT Image Storage' DICOMs are now loaded correctly as CT modality instead of X-Ray. |
ImFusionUS
| Tags | Description |
| Fixed | Fixed two issues in VolumeReslicingAlgorithm where volumes of LABEL modality or with custom shift/scale where not handled correctly. |
Version 2.14, released on 2019-09-11
ImFusionLib
| Tags | Description |
| Deprecation | Officially dropped support for Visual Studio 2013 and deprecated support for Visual Studio 2015. Future releases will require at least VC++ 14.10 (Visual Studio 2017). |
| Added | Added a properties class which integrates with our Configurable while also providing setters and getters. Parameters should be defined in the public area of an ParameterMixin and directly initialize within the header. By doing so it is guaranteed that the variable name, the properties name, as well as the default value are visible to any SDK user.
Example: class MyAlgorithm : public ParameterMixin<Algorithm>
{
public:
...
Parameter<bool> inPlace = {"inPlace", false, *this};
...
}
|
| Changed API-Break | Revamped OpenGL context handling infrastructure:
- Modernize GlContext interface and its concrete platform-specific subclasses to use unique_ptr as type for owning pointers. Removed unneeded parameters from GlContext::create() function.
- Export all platform-specific GlContext subclasses to the SDK.
- Renamed GlQtContext to GlContextQt for a more consistent naming scheme. GlContextQt::clone() will no longer create a new GlContextQt but an instance of the corresponding native type (e.g. GlContextWindows or GlContextGLX). Thus, a cloned GlContextQt can not be used to render onto a Qt surface. Use the constructor instead if you explicitly need this functionality.
- Added GlContextMananger::createContext() as convenience function to create a shared context for a new thread.
- Added GlContextMananger::ensureLocalContext() as utility function to create a shared context for the current thread if necessary.
|
| Fixed | Fixed a half pixel shift issue in ProjectiveGeometry and Camera. Camera matrices obtained in OpenCV/computer vision format now project from world to pixel coordinates, with integer coordinates corresponding to the pixel center. This is commonly done in OpenCV/computer vision and also matches our image coordinate convention.
Previously the projection point (0,0) corresponded to the top-left corner of the image plane. Now (0,0) represents the center of the pixel in the top-left corner.
|
| Fixed | Fixed ImFusionFileIoAlgorithm not setting the list of ignored DataComponents correctly on export. |
| Added | Added MeshCenteringAlgorithm, which recenters a mesh's vertices, keeping its global transformation. |
| Added | Added InteractionView2D::RotationReference option that allows for defining the center of rotation based on either the dataset, view, or MPR cross-section centers. |
| Added | The ImageResamplingAlgorithm now also resamples the mask if possible. |
| Added | Ctrl + click on the visibility check box of an annotation shows only that annotation, and hides the rest. |
ImFusionImageMath
| Tags | Description |
| Added | Major refactoring of ImFusionImageMath:
- The header-only part got split up into individual header files. The main include remains SharedImageSetArithmetic.h
- The syntax is now much closer to Eigen such that it should be more easy to use.
- Binary and unary operators now support lambdas in addition to functors.
- ExprLeafImage now supports block access (read and write).
- ExprLeafScalar now supports wrapping a scalar variable.
- ExprLeafImage does not require a name any longer. Uniform names etc. are now generated automatically.
- The header-only part now gets exported with the SDK if the ImFusionImageMath plugin is shipped with the installer.
|
ImFusionReg
| Tags | Description |
| Added | The ImageRegistration can now optionally normalize images as a preprocessing option. The option of limiting the maximum dimensions was removed because there was no real use-case for it. |
ImFusionSeg
| Tags | Description |
| Added | Added LineToIsosurfaceIntersectionAlgorithm, which allows to find the intersection between the line defined by an Annotation and the first isosurface of the containing volume data with the given value. |
ImFusionUS
| Tags | Description |
| Fixed | Fixed a bug where GlSweepReconstruction would create artifacts in the compounded slice when in parallel mode and US frames would intersect the reconstruction slice. |
| Added | Improved general image quality of GPU Backward compounding implementation.
Added optional sharpen functionality to GlSliceRendererSweep as post-processing filter for on-the-fly compounding. It's two parameters control the general filter strength and angle weighting. The latter allows for restricting the sharpening to those views where the frames are orthogonal to the view direction and as result the spatial resolution is poor.
|
Version 2.13, released on 2019-08-01
ImFusionLib
| Tags | Description |
| Changed API-Break | The GlDenseDeformation now uses world coordinates in the internal displacement field instead of texture coordinates. If you were not using the displacement field directly, nothing changed. If you modify the displacement field directly, you most likely have to apply some textureToWorld/worldToTexture transformation (depends on how you use the displacement field). If you rely on the previous behaviour, you can use GlDenseDeformationLegacy instead.
This change allows to crop and downsample an image, without the dense deformation getting invalid and deforming the wrong parts of the image.
|
| Changed | The GlSeparableConvolutionFilter now uses GlImageProgram internally, making it possible to run the filter over a subset of the input image and more efficient to run on volumes. The behavior of the filter should be strictly the same, please report any undesired change. |
ImFusionSeg
| Tags | Description |
| Added | Added GlIsolineRenderer class. This GlObject can be added to slice views and will render a label map using isolines. |
ImFusionUS
Version 2.12, released on 2019-07-05
ImFusionLib
| Tags | Description |
| Fixed | Fixed an issue where a GlImageProgram would trigger an OpenGL Framebuffer error where the number of slices of the output volume exceeds GL_MAX_FRAMEBUFFER_LAYERS. |
| Fixed | Fixed an issue where NIFTI files that were stored in a left-handed coordinate system were not correctly transformed to the right-handed coordinate system in ImFusionLib. |
| Fixed | Fixed an issue where panning a 2D view (i.e. changing the position of a GlSlice) would not emit GlSlice::signalMatrixChanged even though the matrix did change. |
| Fixed | Fixed an issue where loading very large meshes would produce degenerate vertices. |
| Changed | When computing per-vertex normals in Mesh, the algorithm now uses an angle-area-based weighting scheme instead of simple uniform weighting. This will make meshes of certain topology appear smoother. |
| Added | Added support for orthographic projections in the Camera class.
As a byproduct the interface was refactored significantly. It now exhibits a cleaner separation of the camera model itself and the OpenGL/Computer Vision conventions/matrices. The intrinsics are now stored as individual parameters instead of a single K-matrix while getters/setters allow for easy conversion between the different conventions. Some function names and/or function parameters have changed, however, all of the previously available functionality is still there.
|
| Added | Added support for stencil buffers to various OpenGL wrapper classes:
- GlStateGuard will save and restore stencil enabled-state and stencil write mask state.
- GlFramebuffer supports attaching stencil and depth-stencil textures.
- GlImage supports stencil and depth-stencil internal image formats.
- Added GlUtils::isStencilFormat() and GlUtils::isDepthStencilFormat() functions.
|
| Added | Added support for loading vertex-only meshes in .ply and .obj format in the MeshIO class. The result of such loading would be an object of a PointCloud type |
| Added | We added a conditional shader include syntax which only includes a shader include if a specific pragma is set, e.g.: #pragma conditional_include INCLUDE_MACRO "shader_include.glh"
GlProgram only substitutes this line with the content of the file shader_include.glh if INCLUDE_MACRO is defined. This fixes an issue where version numbers where changed to the highest common version of the shader and all its includes even if the include is not compiled. |
Version 2.11, released on 2019-06-12
ImFusionLib
| Tags | Description |
| Changed | Clarify relationship of color attachment index and draw buffer/fragment shader output index when binding textures to a GlFramebuffer. Now, the two will always be kept in sync, which avoids confusion since OpenGL allows an arbitrary relation between those two mappings. |
| Removed Added | Removed SharedImage::deleteMem/Gl/Cl() since these functions can accidentally create empty SharedImages. Add a SharedImage::makeExclusive(Image::Location) with inverse semantics as replacement. This still allows for freeing unused memory but ensures that a SharedImage will never be empty. |
| Changed API-Break | Refactored picking implementation of GlVolumeView:
- Location picking is now always enabled and handled by the GlVolumeView directly instead of the underlying GlVolumeRenderer. This allows for computing first hitpoint locations also for scenes that show no volumes (e.g. meshes only). Instead of exposing the underlying texture, there is now a new GlVolumeView::firstHitpointLocation() member function to query the world coordinate of a single pixel.
- For object picking there is now a new interface GlObjectPicking that consolidates all the functionality. Setup logic has been removed from GlObject. If a GlObject wants to support object picking, it can query the GlObjectPicking instance from the GlView passed during the draw() call.
|
| Added | Added basic support for loading Amira data. |
ImFusionCT
| Tags | Description |
| Changed | The post processing of CBCT reconstructions has been extracted into the CBCTPostProcessing algorithm. This algorithm provides CBCT fan cropping as well as HU calibration. The behavior of the CBCT reconstruction was not changed. |
Version 2.10, released on 2019-05-17
ImFusionLib
| Tags | Description |
| Added | Added new class Table class which allows for more readable creation of algorithm statistics and export as CSV file. |
| Added | Added support of order-independent transparency (OIT) rendering of semi-transparent meshes. This functionality is managed by the GlOrderIndependentTransparency class and every GlVolumeView holds an instance of it. If this feature is enabled, a semi-transparent GlMesh will render into an auxiliary buffer provided by the OIT interface and a subsequent pass will correctly blend the fragments for each pixel.
If combined with the GlVolumeRendererGlobalIllum, the individual fragments are also correctly sorted into the volume rendering. Due to being OpenGL 3.3-based the GlVolumeRendererBasic does not provide this functionality - it will correctly resolve the blending of all geometry first and then integrate the blended geometry as a whole with the volume rendering.
- Note
- This functionality requires at least OpenGL 4.4.
|
| Added | LabelDataComponent instances are now also saved in workspace files in case display settings are to be stored. |
| Fixed | Fixed an issue when combining thick MPR rendering with image masks: Now, the mask is applied before performing the thick MPR reduction. Thus, all masked pixels will not be visible in thick MPRs. |
| Fixed | Pasting matrices with plain formatting (not Python formatting) is working again. |
Version 2.9, released on 2019-04-24
ImFusionLib
| Tags | Description |
| Added | Added basic support for reading per-face color information from OBJ mesh files in MeshIO::loadFromOBJ(). |
| Changed | Introduced Workspace class modelling the workspace file functionality previously implemented in ApplicationController.
The workspace format has changed as a result: Datasets are now loaded explicitly using IoAlgorithms in the Algorithms section instead of using the algorithm entry in the Data section. Furthermore, datasets can now be referenced using arbitrary strings as unique identifiers, which is more robust than the relative indices in the data model.
|
| Changed API-Break | The LOG_XYZ macros have been changed to be enclosed by do { .. } while (false) instead of just plain scope braces for improved consistency. As a result, LOG_ macros now must be followed by a semi-colon. |
| Added | Added support for saving and loading textures with PLY files in MeshIO. |
| Changed | UltrasoundSweep and TrackedSharedImageSet properties now use the modular TransformationMatrixWidget to edit the calibration and registration matrices. This widget should be used whenever a pose matrix editor UI is needed. |
| Removed | Removed TransferFunctionFactory::createLabelMapColormap(). Functionality for rendering label maps has been superseded by the Modality::LABEL enumeration that is evaluated by the view framework to actiave a dedicated rendering path for label maps. |
| Changed API-Break | The TransformationConvention enum was moved from the Data class to the Pose namespace and can be found in the new header Base/TransformationConvention.h. |
| Changed Deprecation | Matrix interpolation via Pose::interpolate() now requires the TransformationConvention to be specified. If the convention is set to FROMWORLD, input matrices are inverted, interpolated, and the result inverted again. The old function overload without convention is deprecated. |
| Added | The new Framework namespace contains some methods to initialize the ImFusionLib without creating an ApplicationController. |
| Added Deprecation | Added new modes for GlSlice rendering in volume views:
- Introduced new centerlines and semi-transparent plane render modes.
- Refactored storage of render flags in GlSlice: Instead of one bool per option, they are now consolidated in a Flags<ObjectRenderMode> member. The old getter/setter functions have been marked deprecated.
- Slight refactoring of GlSlice: Use the new GlSlice::render() to render the actual image content only. The GlObject-related render logic is still in GlSlice::draw(). GlSlice::drawOtherSlice() has been made private and logic when to call this function has been moved from GlSliceView to GlSlice.
|
ImFusionSeg
| Tags | Description |
| Changed API-Break | The LabelingManipulator class has been refactored to extract the painting functionality. The new LabelPainter class can now be used to draw spheres and capsules into a label map with various options. The LabelingManipulator is now repurposed to handling the interactive drawing use-case; there should only be minimal API changes necessary. |
ImFusionVision
Version 2.8, released on 2019-03-28
ImFusionLib
| Tags | Description |
| Fixed | Fixed alignment issues of Utils::Optional on Visual Studio platforms due to missing support of extended aligned storage. The new implementation can now be safely used with Eigen types or any other type that requires an alignment of more than 8 bytes. |
| Fixed | Fixed a potential crash in SignalImpl when emitting the same signal recursively. Recursive emitting of the same signal is now disabled completely and observers will not be notified in such cases.
Furthermore, the member functions regarding blocking of signals have been renamed to improve consistency. The SignalImpl::SignalBlocker interface returned by SignalImpl::blockSignalGuarded() has been removed completely. You can use the more convenient SignalImpl::whileBlocked() interface instead.
|
| Removed | Removed the GLPROGARG macros from GlProgram.h. These macros were already a no-op before and can be removed. For GLPROGARG3, a nullptr argument has to be added after the second argument, i.e.: GlProgram(GLPROGARG3("frag", "vert", "#define FOO")) -> GlProgram("frag", "vert", nullptr, "#define FOO")
|
| Changed | By default SplitChannelsAlgorithm now groups output by channels instead of by frame as previously |
| Fixed | Fixed several issues regarding the cmake files shipped with the SDK for macOS. |
| Changed Deprecation | Improved DataModel indexing. DataModel::indexOf now returns a linear index for all data including the data in sub-groups. The DataModel::at method was deprecated in favor of DataModel::get (which requires an explicit parent) and operator[] (which also returns data in sub-groups). |
| Changed | Factored out common cropping functionality from MaskEditorController and BasicImageProcesssingController. Created new class InteractiveCroppingBox which derives from Interactive<GlBox, BoxAnnotationManipulator> and replaces the direct use of the class template in the Controllers. Removed the logic from GlBox calculating the crop parameters, which can now be found as static methods of the InteractiveCroppingBox class. As a consequence it is now possible to draw the crop region directly in Basic Imaging Processing. This removed the need to initialize the crop region from an existing Box annotation, so that behavior has been removed. |
| Added | Added new PoseIO namespace consolidating functions for input/output serialization of pose matrices and affine transformation parameters. |
| Added | Added InteractiveCroppingBox class, an interactive object to define crop parameters of a 2D or 3D image directly in the view. |
| Added | Properties now support importing matrices from Python-style format. |
| Added | Changed the implementation of SharedImageSet to always hold Properties. SharedImageSet::properties() will now always return a valid pointer. Also added new convenience function SharedImage::setSpacing(). |
| Fixed | Fixed MeshProcessing::reduceToNumberOfComponents() not working properly. |
ImFusionCT
| Tags | Description |
| Fixed | Refactored ProjectionPreprocessing into a specific ProjectionPreprocessingAlgorithm. The refactoring includes the following:
- Renamed DicomConeBeamLoader to ConvertToConeBeamData
- Introduced ProjectionPreprocessingAlgorithm which supports normalization, dead pixel masking, flat-field correction, and log-convertion of projection data, on both CPU and GPU. In addition the algorithm supports masks.
- Shift and scale are set for both, non- and log-converted data such that the original image values are the same no matter on the normalization scale.
|
ImFusionStream
| Tags | Description |
| Fixed | Added functionality to select camera in video camera stream in case multiple cameras are connected to the system. |
Version 2.7, released on 2019-02-19
ImFusionLib
| Tags | Description |
| Changed API-Break | Changed the interface and implementation of animations. Animations are now implemented in terms of Qt animations and are run in the thread from which they are launched. Animations that modify UI widgets should be launched from the GUI thread (previously all animation logic was processed in a non-GUI thread, although most of them updated UI widgets). Also, there is no longer a single AnimationManager responsible for ensuring that only one animation at a time is running on a particular object. Animations can now either be created locally and and launched in a fire-and-forget fashion, or be launched and subsequently managed by whoever created them.
Especially the following has changed and may require according code changes:
- The AnimationManager.h has been removed and replaced by Animations.h.
- All functions and classes related to animations are encapsulated in the namespace Animations. This partially replaces the AnimationsManager class.
- The Animation class now derives from QPropertyAnimation.
- Among others, the following methods of Animation have been changed/removed:
- Animation::setLoop() has been removed. Instead the QPropertyAnimation::setLoopCount() should be used. An infinite loop can be achieved by passing a -1 as argument.
- Animation::stopAnimation() has been renamed to Animation::cancel().
- SliceAnimation has been removed and its functionality has been moved to ImageView2D::setSliceCenter() and ImageView2D::setSliceMatrix().
- The properties "animateMatrixChange" and "animationsDuration" have been removed from Settings. Instead two new properties have been added:
- "animationsEnabled": En-/Disables all animations.
- "animationSpeed": Scales animation durations by a factor.
See the Animations page in the doxygen documentation for more details.
|
| Added | Added ImFusion::Utils::kMeans() which computes a 1D k-Means algorithm on an arbitrary stl container. |
| Added | Added highlight functionality to GlPlotView, added selection metaphor to InteractionPlotView to interactively define plot view highlight. You can enable a selection mode in InteractionPlotView that will allow the user to select a region of the plot using the left mouse button. Qt signals notify when the user has selected something. |
| Fixed | Fixed an issue where GlFilterSet ignored settings passed via Properties for the XCLAHE and the bilateral filter. |
| Added | Added an optional parameter to GlImage::makeCompatible() to specify the number of channels if it is supposed to be different from the reference image. |
| Added | Added copy constructor and assignment operator to SharedImage so that it can be used as a regular copyable type. |
| Added | Added a method addAlgorithmToHistory in GUI/MainWindowBase.h, allowing to keep track of executed algorithms (if not using the default algorithm controller). |
ImFusionCT
| Tags | Description |
| Added | Added RadonTransformAlgorithm which computes the 2D Radon transform of an image. In addition to the application to computed tomography this transform is similar to a Hough transform for lines. Thus it can be use to detect lines in an image. |
| Added | ConeBeamReconstruction now supports optional normalization by the number of rays passed through a voxel. |
| Added | HUCalibrationAlgorithm now always return a volume of type unsigned short. |
ImFusionML
| Tags | Description |
| Changed Deprecation | Deprecated the ImFusionDeepLearning plugin. The generic algorithms are now part of the ImFusionML plugin. The framework-specific integration classes are now spread into different plugins: CaffePlugin, TensorFlowPlugin, TomaatPlugin, TorchPlugin. |
ImFusionReg
| Tags | Description |
| Added | Added a new weighting mode for mean weighting to GlVolumeCompounding. This mode weights along the Z axis instead of the radial weighting which is used by default. |
ImFusionUS
| Tags | Description |
| Added | Added SweepPostProcessingAlgorithm that provides functionality to cut out unwanted parts from an UltrasoundSweep. |
Version 2.6, released on 2019-01-29
ImFusionLib
| Tags | Description |
| Changed API-Break | Image resampling methods for CPU and GPU have been harmonized and will now return the exact same result regardless of interpolation and smoothing/reduction options. In lieu of the old resample/resampleExact methods in TypedImage with lots of boolean flags, the following methods with named arguments are to be used:
const vec3& spacing,
bool zeroMask = false,
bool allowDimensionChange = false) override;
bool resample(const vec3i& dimensions,
bool zeroMask = false,
InterpolationMode Mode for image interpolation. Definition Image.h:213
@ Linear Linear interpolation. Definition Image.h:215
SpacingMode Mode for spacing adjustment, e.g. when the physical extent would change after resampling. Definition Image.h:220
ReductionMode Mode for image reduction (e.g. downsampling, resampling, binning). Definition Image.h:204
@ Average Average intensity within the reduction box. Definition Image.h:206
Instead of the resampleExact calls, use something like this:
@ Nearest Nearest neighbor look-up, i.e. no interpolation. Definition Image.h:214
@ Exact A desired spacing is used as it, without any adjustment. Definition Image.h:221
@ Lookup Nearest neighbor look-up, i.e. no reduction at all. Definition Image.h:205
The majority voting method in TypedImage::downsample (ill-defined in draw scenarios, e.g. 2:2) has been removed. Instead, all resampling/downsampling methods now support the following reduction modes: Lookup (no reduction at all, before called skipSmoothing), Average (remains the default value), Minimum and Maximum. The latter two were also added to the GPU implementation.
For masks or label maps, we advice to not use ReductionMode::Average, and recommend to utilize InterpolationMode::Nearest.
|
| Added | Added a constructor to InvertDeformationAlgorithm in order to construct it from a pure deformation which is not required to be attached to a SharedImageSet yet. |
| Added | Added method to sample uniform directions on the circle. |
| Added | Added RQ decomposition to ImFusion::Math. |
| Changed | Added more fine-grained control which DataComponents are stored in an ImFusionFile. The existing ImFusionFile::ignoreDisplayOptions property has been replaced with ImFusionFile::ignoredDataComponentIds. |
| Changed | Changed OpenCV helpers from static class members to free functions in the ImFusion::OpenCV namespace. |
| Added | Added conversion method to convert from OpenCV undistortMap to GlDenseDeformation. |
| Fixed | Fixed minor bug in BakeDeformationAlgorithm where a matrix was also set on ConeBeamData. |
| Fixed | Fixed a bug in FilterController which caused a random crash if the mode selection was changed. |
| Fixed | Fixed wrong sign of the return value of Geometry::Plane::distanceTo(). |
| Changed | All SDK headers have been reformatted using our company style guide. |
ImFusionStream
ImFusionUS
| Tags | Description |
| Added | Added SweepCroppingAlgorithm to apply simple cropping and resampling changes to an UltrasoundSweep while properly maintaining pose, calibration and fan geometry. |
| Added | GlSweep3D now supports any combination of masks and deformations on the set of input sweeps. |
Version 2.5, released on 2019-01-08
ImFusionLib
| Tags | Description |
| Changed API-Break | The copy constructor of GlImage was refactored to perform a deep copy. Previously only a shallow copy was created and the caller had to call update() explicitly in order to get a deep copy. The descriptor() method was added to the GlImage class in order to make shallow copies more explicit.
GlImage image = {...};
GlImage imageClone{image};
imageClone.update();
GlImage imageClone{image};
GlImage compatibleImage{image.descriptor()};
Image representation stored as OpenGL texture. Definition GlImage.h:63
|
| Changed | Updated TypedImage and GlImage constructor and update()member functions to consistently update all the information from the image descriptor (i.e. including spacing, shift and scale). The only exception is GlImage::update(GlImage&) since the old API explicitly states that it does not do this. |
| Changed | Moved Image::typeId<T>() to a free function Utils::imageTypeId<T>() |
| Changed | Can now load meshes that are not 2-manifold. Mesh class will duplicate vertices as required to add the affected triangles. |
| Added | Added visualization of mesh vertex normals. |
| Added | Picking uniformly distributed unit vectors is not straightforward and we therefore added Geometry::uniformDistributedPointsOnSphere(int N) which picks N uniformly distributed unit vectors, i.e. points on the unit sphere. |
| Fixed | Changed the 2D version of GlDenseDeformation::displacement() to act the same as the 3D version. The input is now expected to be world coordinated and the output will be provided in world coordinates as well.
The 2D version used to expect pixel coordinates and also returned the displacement in pixel while the 3D version always used the world coordinate system.
|
| Fixed | Filters::boxFilter2D now produces the correct result. |
| Changed | Improved ApplicationController interface for easier integration into standalone applications:
- Added empty default implementation to ApplicationController::updateProgress() so that the class is no longer pure virtual. As a result, API are no longer required to inherot from ApplicationController but can use it directly if they want.
- Moved ApplicationController::loadPlugins() interface to the public part so that it can be used from the outside.
- Added ApplicationController::loadPlugin() member function to load a plugin from a single DLL/so file. This enables users to more easily initialize and register plugins that are located outside of the plugins search folder.
|
| Fixed | Fixed GlVolumeCompounding algorithm when using masked images as input. The algorithm now supports all combinations of masked images in both the CPU and GPU versions. |
| Changed | Improved robustness and format support of NIFTI loader. |
| Added | Added IMFUSION_ASSERT() assertion macro to replace the default assert() from the C stdlib in ImFusion code. The ImFusion assertion macro provides additional functionality in terms of allowing for custom error handlers, providing more detailed error messages, and other convenience features. |
Version 2.4, released on 2018-11-29
ImFusionLib
| Tags | Description |
| Fixed | Fixed Properties assignment operator not properly clearing target before copying. Added move copy ctor and move assignment operator. |
| Changed API-Break | Changed the internal implementation of ElementwiseDataComponent to perform proper copy-on-write. This fixes a potential bug where editing the components of one element could also change the components of others. To make the underlying semantics more explicit the non-const accessors have been renamed:
|
| Changed | Added move semantics to ImFusion::Image class and its descendants, namely MemImage, TypedImage, and GlImage. This allows for using these types as regular value types. |
| Removed | GlCircle and GlBall no longer have a setLabel() method. Use the base class' setLabelText() instead, which does the same. |
| Added | Added GlLocalExtremalFilter which, for each pixel/voxel of an image, computes the percentage of neighboring pixel which are smaller or greater than the considered pixel. This can be used to detect local maxima with sub pixel accuracy. |
| Added | Added options for stippled line rendering in GlLine and GlPolyLine annotations. |
| Changed API-Break | Replaced glew with glad for loading OpenGL function pointers. OpenGL functions are now provided by the ImFusion/GL/glad.h header which only contains OpenGL 4.5 Core functions. Deprecated OpenGL functions can still be used through e.g. glew but glewInit has to called manually now.
Some deprecated methods in GlProgram and GlTextRenderer were removed as a result.
|
ImFusionSeg
| Tags | Description |
| Fixed | Fixed an issue where a small LabelingManipulator brush would not paint any pixels. |
ImFusionUS
| Tags | Description |
| Changed API-Break | The GlSweepReconstruction interface has been refactored and moved to the ImFusionUS module. The geometry metadata computed by GlSweepReconstruction is now cached in a DataComponent attached to the rendered sweep, which improves performances in use cases where more than one sweep is reconstructed. Furthermore, the following changes were done to the API:
|
Version 2.3, released on 2018-11-07
ImFusionLib
| Tags | Description |
| Added | Added 'hidden' attribute to Properties. Hidden parameters and sub properties are not shown in the automatically generated GUI from PropertiesWidget. |
| Changed | The windowing configuration of a TransferFunction is now stored internally as window/level instead of min/max to match the design of the rest of the SDK. This avoid numerical precision issues when converting between the different representations. |
| Changed | Extended the Camera API to store also the projection configuration. Getter and setter methods are provided for both OpenGL and Vision conventions of camera space. GlVolumeView now uses the Camera class to store projection and view matrix. |
| Added | Plugins can now have a version number. The ImFusionLib will check whether all plugins loaded at runtime have the correct version with which it was built. Plugins without versions are excluded from the check. |
| Added | The license manager supports proxies, both through the API and the ImFusion Suite application. |
| Changed | If the license check fails, the ApplicationController will throw a MissingLicenseException instead of calling std::exit. |
| Changed API-Break | The design of the LabelDataComponent has been cleaned up. The 2d/3d color map is now defined implicitly by combining a list of per-label colors with a list of per-label visibility flags. Also the 2d/3d visibility of labels is handled symmetricly. |
| Added | Generalized implementation of distance-based blending in MPR views: Introduced the new GlSlice::BlendingMode::DistanceToBorder as first-class blending mode. As a result, the obsolete GlSliceRenderer::specialBlendingMode() interface and GlSliceRendererSweep::encodeDistToBorder property have been removed. An additional parameter has been introduced to GlSliceRenderer::render() to indicate that the renderer should render a distance map into a secondary texture attached to the FBO. Both GlSliceRendererImage and GlSliceRendererSweep support rendering this distance map.
Since US sweeps often have fan masks, GlSweepReconstruction supports computing the distance map based on the sweep mask for improved blending results.
|
| Fixed | The DataComponentList equals operator now ignores the order of the DataComponents in the two lists. By definition a DataComponentList is unordered, thus the insertion order should not matter. |
| Fixed | Fixed blurry rendering of GlSliceView if the evenness of view width/height does not match the evenness of the image width/height. GlSliceView will now apply an internal half-pixel offset if needed to allow for pixel-perfect lookup. |
Version 2.2, released on 2018-10-08
ImFusionLib
| Tags | Description |
| Added | Signals can now be blocked/muted. Three related methods have been added:
- bool SignalImpl<...>::blockSignal(bool), which blocks or unblocks the signal depending on the argument and returns the previous state for cascading blocks.
- SignalImpl<...>::SignalBlocker SignalImpl<...>::blockSignalGuarded(bool), which blocks or unblocks the signal depending on the argument and returns a scope-guard which resets the state if its scope is left.
- bool SignalImpl<...>::signalBlocked(), getter for the blocking flag.
|
| Changed | LazyInstatiatedDataComponent no longer derives form DataComponent. In order to add lazy instantiation to your DataComponent you need to derive from DataComponent AND LazyInstatiatedDataComponent. |
| Added | Added LazyInstantiatedElementwiseDataComponent which provides lazy instantiation for element-wise DataComponents. |
| Added | Added MeshToVolumeRegistrationAlgorithm. |
| Added | Improved support for handling and visualizing label maps. Introduces new Data::Modality::LABEL modality, as well as the LabelDataComponent. All default renderers will automatically select a special render path for images with the LABEL modality. The LabelDataComponent allows for storing meta data (e.g. label names) as well as for configuring the visual appearance of the data. |
Version 2.1, released on 2018-09-07
ImFusionLib
| Tags | Description |
| Changed | The behavior of the ConnectedComponentsAlgorithm changed when the input has multiple images. Previously, it was only being computed only on one frame (the one with the focus). For the sake of consistency with most other algorithms, it is now being computed on all images of the input SharedImageSet (which means that it returns a SharedImageSet with the same number of images as the input) |
| Changed | Fixed bug when calculating the gradient of an image: the number of channels of the gradient image was incorrectly set to the number of channels of the input image and not to the dimension (2D/3D) of the input image as it should have been. For example, the gradient image of a single channel 2D image should have 2 channels – one for the gradient in the x-direction and one for the gradient in the y-direction. Before the fix, only the gradient in the x-direction was displayed for the in-place and the 'Apply' workflows; the preview image was displayed correctly. |
| Changed | The behavior of SharedImageSet::clone() for non-owning SharedImageSets has changed. Previously in this case a new non-owning SharedImageSet was created which contained the same SharedImages. There was no possibility to use this factory method in order to create a deep copy of non-owning SharedImageSets.
Now the SharedImageSet::clone() returns a owning deep copy no matter if the original SharedImageSet is owning or not. The wrapping behavior has been separated into the new method SharedImageSet::nonOwningClone(), which can also be used in order to create a wrapping SharedImageSet from an owning one.
|
| Deprecation | The GlLineWidth utility class has been deprecated since glLineWidth() is no longer supported in OpenGL core contexts. You can use GlFixedFunctionPipeline as replacement for rendering wide and/or stippled lines |
| Changed | The auto windowing functionality in HistogramDataComponent now uses continuous float computations instead of rounding to the nearest histogram bin. |
| Changed | Added an Image Statistics algorithm which calculates the per-channel image statistics of either an entire image, or the image region under a rectangle, circle, or line. |
| Added Deprecation | Added mask support to GlReduction. The old GlReduction::reduce() overload taking a GlFramebuffer pointer has been deprecated. |
| Added | Added per-channel support to GlHistogram. |
ImFusionCT
| Tags | Description |
| Changed | The CT plugin now adds support for the XRayAngiographicImageStorage IOD and reads all relevant geometry information from the DICOM tags, if present. |
Version 2.0, released on 2018-07-31
ImFusionLib
| Tags | Description |
| Changed Deprecated API-Break | Migrated OpenGL rendering stack to use OpenGL 3.3 core only and deprecated support for compatibility contexts/legacy OpenGL. This brings the following changes to the API:
- Replaced GlState interface with GlViewState that is used to manage the projection and model-view matrix stack.
- Introducing GlFixedFunctionPipeline interface providing a shader mimicking the OpenGL fixed function pipeline with modern means.
- Changed the signature of several render calls to include information about the OpenGL scene state (i.e. a GlViewState or Viewport object). All render calls now use the explicit matrix state provided instead of the implicit state of OpenGL.
- GlProgram::compute() has been deprecated, use GlImageProgram::compute() instead. By default, ImFusionLib will create OpenGL core contexts and GlViews will no longer setup the legacy OpenGL matrix stack for the GlObjects they are hosting. You can enable a compatibility layer by defining the IMFUSION_USE_OPENGL_COMPATIBILITY environment variable in your system.
|
| Added | Inserted the new data type TrackedSharedImageSet into the class hierarchy between SharedImageSet and UltrasoundSweep. This effectively allows to have modality-independent image sets with TrackingStream instances. Most algorithms, which were previously exclusive to ultrasound data have been generalized and do not require the US module anymore. Yet, there are no renderers for visualization in MPR or 3D views due to the unknown nature of the image data (could be projective data). |
| Changed API-Break | Elementwise DataComponents, for instance per-frame meta data, are no longer stored in special StreamRecordingDataComponents, which were removed. Instead, appropriate data classes (currently SharedImageSet and TrackingStream) contain an ElementwiseDataComponentList. Apart from accessing the list directly, method overloads allow direct access to the elementwise meta data:
- Note
- You must remove existing StreamRecordingDataComponents and the corresponding factory registrations from your stream plugin.
|
| Changed | For SharedImages with only a GlImage representation (i.e. no internal MemImage ) SharedImage::clone() now copies the image data on the GPU instead of downloading it to the CPU. |
| Fixed | Fixed const iterators for SharedImageSet. They now work properly with const SharedImageSets as well. |
| Added | Added Tensor class. Tensors are a container for dense floating point data of arbitrary dimension that is not meant to be interpreted as an image. In particular, this allows adding 1D data sequences to the data model for the first time. |
| Added | Added IO algorithm for the Tensor type and an algorithm for plotting Tensors of rank 1 (i.e. a regular line plot). |
| Fixed | Fixed an issue for signed integer textures in combination with AMD graphics cards. Sync operations between host and device memory used to cause an intensity drift of one. This has been fixed. |
| Added | Added non-const versions of SharedImage::hasGl, SharedImage::hasCl, SharedImage::hasMem. This enables thread save checking and using the corresponding image if it exists. |
| Changed | Changed the default value of ApplicationController::m_prepareShiftOnly has been changed to true. As a result, images are no longer rescaled to fit into the entire data range in postLoad() by default. |
| Changed | The behaviour of the ConnectedComponentsAlgorithm changed when the input has multiple images. |
ImFusionCT
| Tags | Description |
| Changed | For DICOM data with the SOP "X-Ray Angiographic Image Storage" the projection parameter are now extracted from the DICOM tag. The data gets loaded as ConeBeamData with the projection parameters set accordingly. |
ImFusionImageMath
ImFusionStream
| Tags | Description |
| Changed API-Break | Completely refactored the stream recording API. The central algorithm to record arbitrary streams is now the StreamRecorderAlgorithm, which does not depend on the US module. Refer to the algorithm header for recorder options, including the DataCombinationMode, which defines whether SharedImageSets and TrackingStreams should be recorded individually or combined in the form for a TrackedSharedImageSet. |
ImFusionUS
| Tags | Description |
| Changed | Completely refactored the stream recording API. Use the USSweepRecorderAlgorithm for recording an arbitrary number of UltrasoundSweeps. The class replaces the former MultiUSSweepRecorderAlgorithm. |