Releases: oncoray/mirp
Version 2.3.1
Fixes
- SUV values with decay correction
START
are now computed correctly. The previous code, based on the QIBA
vendor-neutral code, computed the SUV values as if decay correctionNONE
was used. - The error message for invalid feature families for filtered images (response maps) now correctly mentions
response_map_feature_families
. - Setting
response_map_feature_families = "all
now correctly excludes morphological features. - Trying to compute local intensity features from imaging with high resolution and low image dimensions no
longer causes a hard crash due to memory errors produced byscipy.ndimage.convolve
. Instead, these errors are
handled gracefully -- local intensity features are not computed, however.
Version 2.3.0
Major changes
-
The proper ancient feature computation code running in the background of MIRP has been completely refactored. We
moved from a functional backend where all features were computed per feature family to a more flexible
object-oriented approach. Although this change is not visible at the user-end, it offers several new possibilities:- Single features can now be computed. In addition, for some features (e.g. percentile statistics), a flexible
percentile value could be passed. - Creation of feature maps.
- Output of features and their metadata to machine-readable formats, instead of just tabular data.
Important: Though the name of features in the tabular exports has not changed, their ordering may have.
Avoid using column position when processing or analysing feature data. - Single features can now be computed. In addition, for some features (e.g. percentile statistics), a flexible
-
Apparent diffusion coefficient (ADC) maps, diffusion contrast-enhanced (DCE) MRI and multi-frame DICOM objects in
general are now supported. -
Planar imaging, i.e. computed radiography, digital X-ray and digital mammography DICOM files are now supported.
-
Python version 3.12 is now supported thanks to recent updates by the maintainers of
ray
anditk
.
This means thatmirp
now supports Python version 3.10 and later.
Fixes
- Internal use of
numpy.cross
no longer produces deprecation warnings.
Version 2.2.4
Fixes
- Masks can now be plotted in images without causing an error when using
matplotlib
version 3.9.0 or later.
Version 2.2.3
Minor changes
-
Tables with feature values now contain extra columns to better identify the input data. For example, the new columns specify the file name (for non-DICOM input), the directory path of the image and masks and several DICOM tags, if available.
-
MIRP now checks whether there are potential problems between the frames of reference of image and mask files.
Version 2.2.2
Minor changes
-
show
method ofGenericImage
and subclasses now indicate if a user-providedslice_id
is out-of-volume and
select the nearest slice instead. -
Naming of branches in the settings
xml
file now matches that of their respective settings classes.xml
files
with the previous branch names still function. -
Errors encountered during file import and handling are now more descriptive.
-
extract_mask_labels
andextract_image_parameters
now export extra information from DICOM metadata, e.g. series
UID.
Documentation
- Added a new tutorial on applying image filters to images.
- Added documentation on the feature naming system.
- Added documentation on the design of MIRP.
Fixes
- Computing features related to the minimum volume enclosing ellipsoid no longer produces warnings due to the use of
deprecatednumpy.matrix
class.
Version 2.2.1
Minor changes
-
If mask-related parameters are not provided for computing features or processing of images for deep learning, a
mask is generated that covers the entire image. -
Add fall-back methods for missing installation of the
ray
package for parallel processing. This can happen when
a python version is not supported by theray
package.ray
is now a conditional dependency, until that package
is released for python3.12
. -
The default export format for
deep_learning_processing
anddeep_learning_processing_generator
is nowdict
,
because the sample name is important for matching against observed outcomes. -
write_file
arguments ofextract_mask_labels
andextract_image_parameters
were deprecated as these were
redundant.
Fixes
-
Streamlined importing and reading DICOM files results in faster processing of DICOM-based imaging.
-
Fixed an indexing issue when attempting to split masks into bulk and rim sections in a slice-wise fashion.
-
Fixed an indexing issue in Rank's method for noise estimation.
-
Fixed incorrectly named image parameters file export. Instead of
mask_labels.csv
, image parameters are now
correctly exported toimage_metadata.csv
.
Version 2.2.0
Major changes
-
Added support for intensity scaling using the
intensity_scaling
parameter. Intensity scaling multiplies intensities by a scalar value. Intensity scaling occurs after intensity normalisation (if any) and prior to adding noise (if any). For example, intensity scaling can be used after intensity normalisation to scale intensities to a different range.intensity_normalisation = "range"
withintensity_scaling = 1000.0
maps image intensities to [1000.0, 0.0] instead of [1.0, 0.0]. -
Added support for intensity transformation filters: square root (
"pyradiomics_square_root"
), square ("pyradiomics_square"
), logarithm ("pyradiomics_logarithm"
) and exponential ("pyradiomics_exponential"
). These implementations are based on the definitions in thepyradiomics
documentation. Since these filters do not currently have an IBSI reference standard, these are mostly intended for reproducing and validating radiomics models based on features extracted from pyradiomics. -
Modules were renamed according to the PEP8 standard. This does not affect the documented public interface, but may affect external extensions. Public and private parts of the API are now indicated.
Minor changes
- Added support for Python version 3.10 using
typing-extensions
. - Several changes were made to ensure proper functioning of MIRP with future versions of
pandas
. - Some changes were made prevent deprecation warnings in future version of
numpy
.
Version 2.1.1
Fixes
- Fixed missing merge changes from version 2.1.0 to the main branch.
- Fixed reading of
mask_name
from data xml files. image_name
andmask_name
configuration parameters are now parsed as single strings if only one value is
specified to match argument-based configuration.- Fixed and updated several exception messages.
- Filter kernel names, specified using
filter_kernels
in xml files, are now correctly parsed as strings instead of
floats.
Version 2.1.0
Major changes
-
Added support for SEG DICOM files for segmentation.
-
Added support for processing RTDOSE files.
-
It is now possible to combine and split masks, and to select the largest mask or mask slice, as part of the image
processing workflow. Masks can be combines by settingmask_merge = True
, which merges all available masks for an
image into a single mask. This can be useful when, e.g., multiple regions of interest should be assessed as a single
(possibly internally disconnected) mask. Masks are split usingmask_split = True
, which separates every disconnected
region into its own mask that is assessed separately. This is used for splitting multiple lesions inside a single mask
into multiple separate masks. The largest region of interest in each mask is selected by
mask_select_largest_region = True
. This can be used when, e.g., only the largest lesion of multiple lesions should be
assessed. Sometimes, only the largest slice (i.e. the slice containing most of the voxels in a mask) should be
assessed. This is done usingmask_select_largest_slice = True
. This also forcesby_slice = True
.These mask operations are implemented in the following order: combination -> splitting -> largest region ->
largest slice. -
Masks from an RT-structure file that shares a frame of reference with an image but does not have a one-to-one
mapping to its voxel space can now be processed. This facilitates processing of masks from RT structure sets that
are, e.g., defined on CT images but applied to co-registered PET imaging, or from one MR sequence to another.
Fixes
- Providing a mask consisting of boolean values in a numpy array no longer incorrectly throws an error.
- Configuration parameters from
xml
files are now processed in the same manner as parameters defined as function
arguments. The same default values are now used, independent of the parameter source. This fixes a known issue where
outlier-based resegmentation would occur by default usingxml
files, whereas the intended default is that no
resegmentation takes place. - Masks can now be exported to the file system without throwing an error.
- DICOM files from frontal or sagittal view data are now correctly processed.
Version 2.0.1
Minor changes
- Randomisation in MIRP now uses the generator-based methods in
numpy.random
, replacing the legacy functions.
The generator is seeded so that results are reproducible. The seed depends on input image, mask and configuration
parameters, if applicable.
Fixes
- Numpy arrays can now be used as direct input without throwing a
FileNotFoundError
. - Relaxed check on orientation matrix when importing images, preventing errors when the l2-norm is around 1.000 but not
to high precision. - To prevent high loads through internal multithreading in
numpy
and other libraries when usingray
for parallel
processing, each ray thread is now initialised with environment parameters that prevent multi-threading.