imagedata 3.8.14__tar.gz → 3.9.0.dev3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/CHANGELOG.md +54 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/LICENSE.txt +1 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/PKG-INFO +3 -2
- imagedata-3.9.0.dev3/VERSION.txt +1 -0
- imagedata-3.9.0.dev3/data/nifti/ep2d_RSI_b0_500_1500_6dir_20241202111754_3.nii.gz +0 -0
- imagedata-3.9.0.dev3/docs/Anonymization.rst +16 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Sorting.rst +22 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/UserGuide.rst +1 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/conf.py +1 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/pyproject.toml +1 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/__init__.py +9 -9
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/__init__.py +3 -18
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/axis.py +5 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/collection.py +85 -4
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/__init__.py +3 -1
- imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/__init__.py +17 -0
- imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/datatypes.py +269 -0
- imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/instance.py +352 -0
- imagedata-3.9.0.dev3/src/imagedata/formats/dicomlib/sorting.py +443 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/dicomplugin.py +348 -1139
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/matplugin.py +1 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/header.py +43 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/image_data.py +20 -1
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/readdata.py +40 -25
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/series.py +49 -18
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/__init__.py +10 -2
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/filetransport.py +0 -3
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/viewer.py +17 -4
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/PKG-INFO +3 -2
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/SOURCES.txt +5 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/requires.txt +1 -0
- {imagedata-3.8.14/src/imagedata/formats/dicomlib → imagedata-3.9.0.dev3/tests}/__init__.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_collections.py +43 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom.py +99 -34
- imagedata-3.9.0.dev3/tests/test_formats_dicom_duplicate.py +156 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_series.py +39 -9
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_series_ufunc.py +10 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tox.ini +2 -2
- imagedata-3.8.14/VERSION.txt +0 -1
- imagedata-3.8.14/src/imagedata/formats/dicomlib/instance.py +0 -27
- imagedata-3.8.14/tests/__init__.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/.readthedocs.yaml +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/.travis.yml +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/CONTRIBUTING.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/MANIFEST.in +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/Makefile +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/README.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/5D.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/6D_TE_TIME_FA.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/RSI_6D.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0021.0001.2021.06.08.10.04.29.806302.203193459.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0022.0001.2021.06.08.10.04.29.806302.203195509.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0023.0001.2021.06.08.10.04.29.806302.203197559.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0024.0001.2021.06.08.10.04.29.806302.203199609.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/TI/TI_1.MR.0025.0001.2021.06.08.10.04.29.806302.203201659.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cohort.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_hf.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_oblique.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/cor_rl.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0001.2019.02.07.14.42.45.461288.172175570.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0002.2019.02.07.14.42.45.461288.172174503.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0003.2019.02.07.14.42.45.461288.172175624.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0004.2019.02.07.14.42.45.461288.172174557.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0005.2019.02.07.14.42.45.461288.172175678.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0006.2019.02.07.14.42.45.461288.172174611.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0007.2019.02.07.14.42.45.461288.172175732.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0008.2019.02.07.14.42.45.461288.172174665.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0009.2019.02.07.14.42.45.461288.172175786.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0010.2019.02.07.14.42.45.461288.172174719.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0011.2019.02.07.14.42.45.461288.172175840.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0012.2019.02.07.14.42.45.461288.172174773.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0013.2019.02.07.14.42.45.461288.172175894.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0014.2019.02.07.14.42.45.461288.172174827.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0015.2019.02.07.14.42.45.461288.172175948.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0016.2019.02.07.14.42.45.461288.172174881.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0017.2019.02.07.14.42.45.461288.172176002.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0018.2019.02.07.14.42.45.461288.172174935.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0019.2019.02.07.14.42.45.461288.172176056.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0020.2019.02.07.14.42.45.461288.172174989.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0021.2019.02.07.14.42.45.461288.172176110.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0022.2019.02.07.14.42.45.461288.172175043.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0023.2019.02.07.14.42.45.461288.172176164.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0024.2019.02.07.14.42.45.461288.172175097.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0025.2019.02.07.14.42.45.461288.172176218.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0026.2019.02.07.14.42.45.461288.172175151.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0027.2019.02.07.14.42.45.461288.172176272.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0028.2019.02.07.14.42.45.461288.172175205.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0029.2019.02.07.14.42.45.461288.172176326.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0030.2019.02.07.14.42.45.461288.172175516.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0031.2019.02.07.14.42.45.461288.172175588.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0032.2019.02.07.14.42.45.461288.172174521.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0033.2019.02.07.14.42.45.461288.172175642.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0034.2019.02.07.14.42.45.461288.172174575.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0035.2019.02.07.14.42.45.461288.172175696.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0036.2019.02.07.14.42.45.461288.172174629.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0037.2019.02.07.14.42.45.461288.172175750.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0038.2019.02.07.14.42.45.461288.172174683.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0039.2019.02.07.14.42.45.461288.172175804.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0040.2019.02.07.14.42.45.461288.172174737.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0041.2019.02.07.14.42.45.461288.172175858.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0042.2019.02.07.14.42.45.461288.172174791.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0043.2019.02.07.14.42.45.461288.172175912.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0044.2019.02.07.14.42.45.461288.172174845.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0045.2019.02.07.14.42.45.461288.172175966.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0046.2019.02.07.14.42.45.461288.172174899.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0047.2019.02.07.14.42.45.461288.172176020.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0048.2019.02.07.14.42.45.461288.172174953.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0049.2019.02.07.14.42.45.461288.172176074.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0050.2019.02.07.14.42.45.461288.172175007.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0051.2019.02.07.14.42.45.461288.172176128.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0052.2019.02.07.14.42.45.461288.172175061.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0053.2019.02.07.14.42.45.461288.172176182.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0054.2019.02.07.14.42.45.461288.172175115.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0055.2019.02.07.14.42.45.461288.172176236.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0056.2019.02.07.14.42.45.461288.172175169.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0057.2019.02.07.14.42.45.461288.172176290.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0058.2019.02.07.14.42.45.461288.172175480.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0059.2019.02.07.14.42.45.461288.172176344.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0060.2019.02.07.14.42.45.461288.172175534.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0061.2019.02.07.14.42.45.461288.172175606.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0062.2019.02.07.14.42.45.461288.172174539.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0063.2019.02.07.14.42.45.461288.172175660.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0064.2019.02.07.14.42.45.461288.172174593.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0065.2019.02.07.14.42.45.461288.172175714.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0066.2019.02.07.14.42.45.461288.172174647.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0067.2019.02.07.14.42.45.461288.172175768.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0068.2019.02.07.14.42.45.461288.172174701.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0069.2019.02.07.14.42.45.461288.172175822.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0070.2019.02.07.14.42.45.461288.172174755.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0071.2019.02.07.14.42.45.461288.172175876.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0072.2019.02.07.14.42.45.461288.172174809.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0073.2019.02.07.14.42.45.461288.172175930.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0074.2019.02.07.14.42.45.461288.172174863.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0075.2019.02.07.14.42.45.461288.172175984.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0076.2019.02.07.14.42.45.461288.172174917.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0077.2019.02.07.14.42.45.461288.172176038.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0078.2019.02.07.14.42.45.461288.172174971.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0079.2019.02.07.14.42.45.461288.172176092.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0080.2019.02.07.14.42.45.461288.172175025.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0081.2019.02.07.14.42.45.461288.172176146.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0082.2019.02.07.14.42.45.461288.172175079.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0083.2019.02.07.14.42.45.461288.172176200.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0084.2019.02.07.14.42.45.461288.172175133.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0085.2019.02.07.14.42.45.461288.172176254.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0086.2019.02.07.14.42.45.461288.172175187.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0087.2019.02.07.14.42.45.461288.172176308.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0088.2019.02.07.14.42.45.461288.172175498.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0089.2019.02.07.14.42.45.461288.172176362.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/dwi/PHANTOM_T1.MR._.0007.0090.2019.02.07.14.42.45.461288.172175552.IMA +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/ep2d_RSI_b0_500_1500_6dir.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/lena_color.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_ap.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_hf.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/sag_oblique.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/srdoc103.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00019.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00020.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time00/Image_00021.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00019.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00020.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time01/Image_00021.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00019.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00020.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time/time02/Image_00021.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00000.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00001.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00002.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00003.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00004.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00005.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00006.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00007.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/time_all/Image_00008.dcm +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/tra_oblique.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/dicom/tra_rl.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00000.mha +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00001.mha +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time/Image_00002.mha +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/itk/time.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/lena_color.gif +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/lena_color.jpg +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/mat/time/Image_00000.mat +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/mat/time.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_hf.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_oblique.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/cor_rl.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_ap.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_hf.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/sag_oblique.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.json +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all/time_all_fl3d_dynamic_20190207140517_14.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/time_all.zip +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/tra_oblique.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/nifti/tra_rl.nii.gz +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/A_Lovers_Complaint.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_1.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_2.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_3.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_4.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_5.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/pdf/pages/A_Lovers_Complaint_6.pdf +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/text.txt +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file0 +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file1 +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/tree/file2 +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices2d.pickle +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices3d.pickle +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/data/vertices/vertices4d.pickle +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReference.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceApps.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceAppsDiffusion.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceArchives.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceCollections.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceFormats.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceImagedata.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceSeries.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceTransports.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/APIReferenceViewer.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Collections.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Colors.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/CommandLine.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/DICOMAttributes.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/DeveloperDocumentation.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Examples.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Figure_Architecture.png +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Input_output.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Installation.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Introduction.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Makefile +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Non_image_dicom_objects.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Notebook.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Options.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugin_Architecture.docx +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugin_Architecture.png +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Plugins.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/README +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Segmentation.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Tutorial.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/Viewing.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/fuse_mask_blend.png +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/index.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/make.bat +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/requirements.txt +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/modules.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/setup.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.apps.Siemens.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.apps.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.archives.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.formats.dicomlib.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.formats.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.imagedata.transports.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/src.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/source/tests.rst +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/docs/transformation.tex +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/paper.bib +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/paper.md +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/pylintrc +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/setup.cfg +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/__init__.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/ROI.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/__init__.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/draw_antialiased.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/evidence2mask.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/Siemens/evidence_main.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/__init__.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/apps/diffusion.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/abstractarchive.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/filesystemarchive.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/archives/zipfilearchive.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/cmdline.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/abstractplugin.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/dicomlib/uid.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/itkplugin.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/formats/niftiplugin.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/list_plugins.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/abstracttransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/dicomtransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata/transports/xnattransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/dependency_links.txt +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/entry_points.txt +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/src/imagedata.egg-info/top_level.txt +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/techstack.md +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/techstack.yml +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/compare_headers.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_archive_file.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_archive_zip.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_axis.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_color.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_template.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_dicom_zip.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk_template.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_itk_zip.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_mat.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_mat_zip.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_nifti.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_formats_nifti_zip.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_image_data.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_dicomtransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_filetransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_transport_xnattransport.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_version.py +0 -0
- {imagedata-3.8.14 → imagedata-3.9.0.dev3}/tests/test_viewer.py +0 -0
|
@@ -6,6 +6,60 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
8
|
<!--next-version-placeholder-->
|
|
9
|
+
## [v3.9.0-dev3] - 2026-05-21
|
|
10
|
+
### Fixed
|
|
11
|
+
* Series.__getitem__(): Slice the tags even when there is no tag axis.
|
|
12
|
+
* DICOMPLUGIN._join_axes(): Only accept tag axes of length > 1.
|
|
13
|
+
|
|
14
|
+
## [v3.9.0-dev2] - 2026-05-20
|
|
15
|
+
* Support for python 3.14
|
|
16
|
+
|
|
17
|
+
## [v3.9.0-rc1] - 2026-05-20
|
|
18
|
+
### Added
|
|
19
|
+
* VariableAxis: Accept list of tuples as values.
|
|
20
|
+
* DICOMPlugin: Implement setting DTI tuple (b, bvector).
|
|
21
|
+
### Fixed
|
|
22
|
+
* Sorting av duplicate tags fixed.
|
|
23
|
+
|
|
24
|
+
## [v3.9.0-rc0] - 2026-05-19
|
|
25
|
+
### Added
|
|
26
|
+
* DICOMPlugin: Sort DTI series where tags are (b, bvector) tuple.
|
|
27
|
+
### Changed
|
|
28
|
+
* DICOMPlugin: Refactored sorting of n-dimensional datasets.
|
|
29
|
+
|
|
30
|
+
## [v3.8.16-dev0] - 2026-05-15
|
|
31
|
+
### Changed
|
|
32
|
+
* DICOMPlugin: Refactored sorting of n-dimensional datasets.
|
|
33
|
+
|
|
34
|
+
## [v3.8.15] - 2026-05-15
|
|
35
|
+
|
|
36
|
+
## [v3.8.15-dev4] - 2026-05-15
|
|
37
|
+
### Fixed
|
|
38
|
+
* Viewer.connect_draw(): Traversing image tags is done using np.ndindex.
|
|
39
|
+
* Viewer.connect_draw(): Accept legacy ROI where tag is number.
|
|
40
|
+
* Viewer.disconnect_draw(): Traversing image tags is done using np.ndindex.
|
|
41
|
+
|
|
42
|
+
## [v3.8.15-dev3] - 2026-04-21
|
|
43
|
+
### Added
|
|
44
|
+
* DICOMPlugin: Document data types and processes.
|
|
45
|
+
|
|
46
|
+
## [v3.8.15-dev2] - 2026-04-14
|
|
47
|
+
### Fixed
|
|
48
|
+
* DICOMPlugin: Corrected writing dtype np.bool_
|
|
49
|
+
* DICOMPlugin.write_slice(): Drop `enforce_file_format` argument to pydicom.save_as().
|
|
50
|
+
|
|
51
|
+
## [v3.8.15-dev1] - 2026-03-18
|
|
52
|
+
### Added
|
|
53
|
+
* anonymize() methods on Series, Study, Patient and Cohort levels.
|
|
54
|
+
* DICOMPlugin.write_slice(): properly encode date and time data elements when given as string.
|
|
55
|
+
|
|
56
|
+
## [v3.8.15-dev0] - 2026-03-16
|
|
57
|
+
### Fixed
|
|
58
|
+
* Fixed parsing windows drive letter
|
|
59
|
+
* Header.__set_axes_from_template: Catch missing axes property.
|
|
60
|
+
|
|
61
|
+
## [v3.8.15-dev0] - 2026-04-14
|
|
62
|
+
* Series ufunc: Fixed problem with np.mean().
|
|
9
63
|
|
|
10
64
|
## [v3.8.14] - 2025-11-27
|
|
11
65
|
* Release 3.8.14
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2013-
|
|
3
|
+
Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: imagedata
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.9.0.dev3
|
|
4
4
|
Summary: Read/write medical image data
|
|
5
5
|
Author-email: Erling Andersen <Erling.Andersen@Helse-Bergen.NO>
|
|
6
6
|
Maintainer-email: Erling Andersen <Erling.Andersen@Helse-Bergen.NO>
|
|
7
7
|
License: MIT License
|
|
8
8
|
|
|
9
|
-
Copyright (c) 2013-
|
|
9
|
+
Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
10
10
|
|
|
11
11
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
12
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -63,6 +63,7 @@ Requires-Dist: imageio
|
|
|
63
63
|
Requires-Dist: pillow>=10.0.0
|
|
64
64
|
Requires-Dist: xnat<0.7
|
|
65
65
|
Requires-Dist: matplotlib>=3.8.0
|
|
66
|
+
Requires-Dist: dicom-anonymizer
|
|
66
67
|
Requires-Dist: opencv-python-headless
|
|
67
68
|
Dynamic: license-file
|
|
68
69
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.9.0-dev3
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
.. _Anonymization:
|
|
2
|
+
|
|
3
|
+
Anonymization
|
|
4
|
+
===============
|
|
5
|
+
|
|
6
|
+
DICOM data can be anonymized on the Series, Study, Patient or Cohort level.
|
|
7
|
+
Each object class provides an anonymize() method.
|
|
8
|
+
|
|
9
|
+
Common parameters include:
|
|
10
|
+
|
|
11
|
+
+---------------+------------------------------------------------------------+
|
|
12
|
+
|uid_table |Translation table for UIDs |
|
|
13
|
+
+---------------+------------------------------------------------------------+
|
|
14
|
+
|kwargs |dict or parameters giving mapping rules for specific |
|
|
15
|
+
| |DICOM attributes |
|
|
16
|
+
+---------------+------------------------------------------------------------+
|
|
@@ -36,6 +36,7 @@ Several sort criteria are predefined:
|
|
|
36
36
|
* triggertime: Sort on Trigger Time
|
|
37
37
|
* b: Sort on MR diffusion b-value
|
|
38
38
|
* bvector: Sort on MR diffusion b vector
|
|
39
|
+
* dti: Sort on MR DTI (b, b vector) tuple
|
|
39
40
|
* fa: Sort on MR Flip Angle
|
|
40
41
|
* te: Sort on MR Echo Time
|
|
41
42
|
|
|
@@ -103,6 +104,25 @@ Trigger Time is the sorting criteria:
|
|
|
103
104
|
trigger=get_TriggerTime)
|
|
104
105
|
)
|
|
105
106
|
|
|
107
|
+
MRI DTI sorting
|
|
108
|
+
---------------
|
|
109
|
+
|
|
110
|
+
MRI diffusion tensor images (DTI) are sorted on diffusion b-value and b-vectors.
|
|
111
|
+
The tags (b, bvector) are tuples.
|
|
112
|
+
|
|
113
|
+
.. code-block:: python
|
|
114
|
+
|
|
115
|
+
img = Series('dti', input_order='dti', input_format='dicom')
|
|
116
|
+
tags = img.tags[0]
|
|
117
|
+
for idx in np.ndindex(tags.shape):
|
|
118
|
+
try:
|
|
119
|
+
b, bvector = tags[idx]
|
|
120
|
+
except TypeError:
|
|
121
|
+
continue
|
|
122
|
+
dti = img[idx]
|
|
123
|
+
print(b, bvector, dti.shape)
|
|
124
|
+
|
|
125
|
+
|
|
106
126
|
N-dimensional sorting
|
|
107
127
|
---------------------
|
|
108
128
|
|
|
@@ -115,7 +135,8 @@ A dynamic dual-echo MR acquisition can be sorted on time and echo time into a 5D
|
|
|
115
135
|
|
|
116
136
|
img = Series('dyn_dual_echo', input_order='time,te')
|
|
117
137
|
|
|
118
|
-
In particular, MR RSI diffusion data can be sorted on `b` value and `b` vector
|
|
138
|
+
In particular, MR RSI diffusion data can be sorted on `b` value and `b` vector
|
|
139
|
+
(remember that the `dti` sort criteria can be used to sort these data as 4D):
|
|
119
140
|
|
|
120
141
|
.. code-block:: python
|
|
121
142
|
|
|
@@ -21,7 +21,7 @@ sys.path.insert(0, os.path.join(root, 'src'))
|
|
|
21
21
|
# -- Project information -----------------------------------------------------
|
|
22
22
|
|
|
23
23
|
project = 'imagedata'
|
|
24
|
-
copyright = '2013-
|
|
24
|
+
copyright = '2013-2026, Erling Andersen, Haukeland University Hospital, Bergen, Norway'
|
|
25
25
|
author = 'Erling Andersen'
|
|
26
26
|
|
|
27
27
|
|
|
@@ -37,24 +37,24 @@ except TypeError:
|
|
|
37
37
|
if len(_plugins) == 0:
|
|
38
38
|
# Fallback to known built-in plugins
|
|
39
39
|
try:
|
|
40
|
-
from
|
|
41
|
-
from
|
|
40
|
+
from imagedata.archives.filesystemarchive import FilesystemArchive
|
|
41
|
+
from imagedata.archives.zipfilearchive import ZipfileArchive
|
|
42
42
|
plugins['archive'] = [
|
|
43
43
|
('filesystemarchive', FilesystemArchive.name, FilesystemArchive),
|
|
44
44
|
('zipfilearchive', ZipfileArchive.name, ZipfileArchive)
|
|
45
45
|
]
|
|
46
|
-
from
|
|
47
|
-
from
|
|
48
|
-
from
|
|
46
|
+
from imagedata.transports.filetransport import FileTransport
|
|
47
|
+
from imagedata.transports.dicomtransport import DicomTransport
|
|
48
|
+
from imagedata.transports.xnattransport import XnatTransport
|
|
49
49
|
plugins['transport'] = [
|
|
50
50
|
('filetransport', FileTransport.name, FileTransport),
|
|
51
51
|
('dicomtransport', DicomTransport.name, DicomTransport),
|
|
52
52
|
('xnattransport', XnatTransport.name, XnatTransport)
|
|
53
53
|
]
|
|
54
|
-
from
|
|
55
|
-
from
|
|
56
|
-
from
|
|
57
|
-
from
|
|
54
|
+
from imagedata.formats.dicomplugin import DICOMPlugin
|
|
55
|
+
from imagedata.formats.itkplugin import ITKPlugin
|
|
56
|
+
from imagedata.formats.matplugin import MatPlugin
|
|
57
|
+
from imagedata.formats.niftiplugin import NiftiPlugin
|
|
58
58
|
plugins['format'] = [
|
|
59
59
|
('dicomformat', DICOMPlugin.name, DICOMPlugin),
|
|
60
60
|
('itkformat', ITKPlugin.name, ITKPlugin),
|
|
@@ -3,12 +3,10 @@
|
|
|
3
3
|
Standard plugins provide support for local filesystem and zip archives.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
# Copyright (c) 2018-
|
|
6
|
+
# Copyright (c) 2018-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
7
7
|
|
|
8
|
-
import os.path
|
|
9
8
|
import logging
|
|
10
9
|
import urllib.parse
|
|
11
|
-
import fnmatch
|
|
12
10
|
from ..transports import Transport
|
|
13
11
|
|
|
14
12
|
logger = logging.getLogger(__name__)
|
|
@@ -40,19 +38,8 @@ def find_mimetype_plugin(mimetype, url, mode="r", read_directory_only=False, opt
|
|
|
40
38
|
if opts is None:
|
|
41
39
|
opts = {}
|
|
42
40
|
from .. import plugins
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
# Windows: Parse without /x:, then re-attach drive letter
|
|
46
|
-
urldict = urllib.parse.urlsplit(url[2:], scheme="file")
|
|
47
|
-
# _path = url[:2] + urldict.path
|
|
48
|
-
else:
|
|
49
|
-
urldict = urllib.parse.urlsplit(url, scheme="file")
|
|
50
|
-
# _path = urldict.path if len(urldict.path) > 0 else urldict.netloc
|
|
51
|
-
# if urldict.scheme == 'xnat':
|
|
52
|
-
# mimetype = 'application/zip'
|
|
53
|
-
# if mimetype is None:
|
|
54
|
-
# logger.debug("imagedata.archives.find_mimetype_plugin: filesystem")
|
|
55
|
-
# return find_plugin('filesystem', url, mode, opts=opts)
|
|
41
|
+
# Windows: Drive letter will be parsed as scheme
|
|
42
|
+
urldict = urllib.parse.urlsplit(url, scheme="file")
|
|
56
43
|
transport = None
|
|
57
44
|
if urldict.scheme:
|
|
58
45
|
transport = Transport(
|
|
@@ -74,8 +61,6 @@ def find_mimetype_plugin(mimetype, url, mode="r", read_directory_only=False, opt
|
|
|
74
61
|
logger.debug("{}: {}, mode: {}".format(
|
|
75
62
|
_name, ptype, mode))
|
|
76
63
|
return pclass(url=url, transport=transport, mode=mode, opts=opts)
|
|
77
|
-
# if os.path.isfile(_path):
|
|
78
|
-
# if os.path.exists(_path):
|
|
79
64
|
if urldict.scheme == "file":
|
|
80
65
|
logger.debug("{}: filesystem".format(_name))
|
|
81
66
|
try:
|
|
@@ -258,7 +258,11 @@ class VariableAxis(Axis):
|
|
|
258
258
|
|
|
259
259
|
def __init__(self, name: str, values: Sequence) -> None:
|
|
260
260
|
super(VariableAxis, self).__init__(name)
|
|
261
|
-
if issubclass(type(values[0]),
|
|
261
|
+
if issubclass(type(values[0]), tuple):
|
|
262
|
+
self._values = np.ndarray(len(values), dtype=tuple)
|
|
263
|
+
for i, value in enumerate(values):
|
|
264
|
+
self._values[i] = value
|
|
265
|
+
elif issubclass(type(values[0]), Sequence):
|
|
262
266
|
self._values = np.ndarray(len(values), dtype=np.ndarray)
|
|
263
267
|
for i, value in enumerate(values):
|
|
264
268
|
self._values[i] = np.array(value)
|
|
@@ -8,17 +8,20 @@ The Cohort class is a collection of Patient objects.
|
|
|
8
8
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
# Copyright (c) 2023-
|
|
11
|
+
# Copyright (c) 2023-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
12
12
|
|
|
13
13
|
import logging
|
|
14
14
|
from datetime import datetime, date, time
|
|
15
15
|
import argparse
|
|
16
16
|
from pathlib import Path
|
|
17
|
+
from pydicom.uid import UID
|
|
17
18
|
from typing import Union
|
|
19
|
+
# from dicomanonymizer.dicomfields_selector import dicom_anonymization_database_selector
|
|
18
20
|
|
|
19
21
|
from .series import Series
|
|
20
22
|
from .readdata import read as r_read
|
|
21
|
-
from .formats import UnknownInputError
|
|
23
|
+
from .formats import UnknownInputError, get_uid
|
|
24
|
+
from .formats.dicomlib import anonymization_rules
|
|
22
25
|
|
|
23
26
|
logger = logging.getLogger(__name__)
|
|
24
27
|
|
|
@@ -309,7 +312,10 @@ class Study(IndexedDict):
|
|
|
309
312
|
else:
|
|
310
313
|
_value = datetime.strptime(_value, "%H%M%S").time()
|
|
311
314
|
except ValueError:
|
|
312
|
-
|
|
315
|
+
try:
|
|
316
|
+
_value = datetime.time(_value)
|
|
317
|
+
except TypeError:
|
|
318
|
+
pass
|
|
313
319
|
# Update self property if None from series
|
|
314
320
|
if getattr(self, _attr, None) is None:
|
|
315
321
|
# _series = self[_seriesInstanceUID]
|
|
@@ -349,6 +355,7 @@ class Study(IndexedDict):
|
|
|
349
355
|
|
|
350
356
|
def __init__(self, data, opts: dict = None, **kwargs):
|
|
351
357
|
super(Study, self).__init__()
|
|
358
|
+
self.__uid_generator = get_uid()
|
|
352
359
|
for _attr in self._attributes:
|
|
353
360
|
setattr(self, _attr, None)
|
|
354
361
|
|
|
@@ -374,6 +381,8 @@ class Study(IndexedDict):
|
|
|
374
381
|
_series_dict = data
|
|
375
382
|
elif issubclass(type(data), Study):
|
|
376
383
|
raise ValueError("Why here?")
|
|
384
|
+
elif data is None:
|
|
385
|
+
_series_dict = {}
|
|
377
386
|
else:
|
|
378
387
|
# Assume data is URL
|
|
379
388
|
try:
|
|
@@ -396,7 +405,12 @@ class Study(IndexedDict):
|
|
|
396
405
|
return \
|
|
397
406
|
"Study: {} {}".format(datetime.combine(_date, _time), _descr)
|
|
398
407
|
|
|
399
|
-
def
|
|
408
|
+
def new_uid(self) -> UID:
|
|
409
|
+
"""Return the next available UID from the UID generator.
|
|
410
|
+
"""
|
|
411
|
+
return self.__uid_generator.__next__()
|
|
412
|
+
|
|
413
|
+
def write(self, url, opts=None, formats=None, **kwargs):
|
|
400
414
|
"""Write image data, calling appropriate format plugins
|
|
401
415
|
|
|
402
416
|
Args:
|
|
@@ -412,6 +426,13 @@ class Study(IndexedDict):
|
|
|
412
426
|
imagedata.formats.WriteNotImplemented: Cannot write this image format.
|
|
413
427
|
"""
|
|
414
428
|
|
|
429
|
+
if opts is None:
|
|
430
|
+
opts = {}
|
|
431
|
+
elif issubclass(type(opts), argparse.Namespace):
|
|
432
|
+
opts = vars(opts)
|
|
433
|
+
for key, value in kwargs.items():
|
|
434
|
+
opts[key] = value
|
|
435
|
+
|
|
415
436
|
_used_urls = []
|
|
416
437
|
for _seriesUID in self.keys():
|
|
417
438
|
_series = self[_seriesUID]
|
|
@@ -431,6 +452,28 @@ class Study(IndexedDict):
|
|
|
431
452
|
except Exception as e:
|
|
432
453
|
raise Exception(_url) from e
|
|
433
454
|
|
|
455
|
+
def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
|
|
456
|
+
_actions = {} | actions
|
|
457
|
+
rules = anonymization_rules | kwargs
|
|
458
|
+
if rules['studyTime'] is None:
|
|
459
|
+
rules['studyTime'] = self.studyTime
|
|
460
|
+
_copy = Study(None)
|
|
461
|
+
for _rule in rules:
|
|
462
|
+
try:
|
|
463
|
+
_ = getattr(_copy, _rule)
|
|
464
|
+
setattr(_copy, _rule, rules[_rule])
|
|
465
|
+
except AttributeError:
|
|
466
|
+
pass
|
|
467
|
+
if self.studyInstanceUID is None:
|
|
468
|
+
self.studyInstanceUID = _copy.new_uid()
|
|
469
|
+
if self.studyInstanceUID not in uid_table:
|
|
470
|
+
uid_table[self.studyInstanceUID] = _copy.new_uid()
|
|
471
|
+
_copy.studyInstanceUID = uid_table[self.studyInstanceUID]
|
|
472
|
+
for _seriesUID in self.keys():
|
|
473
|
+
_series = self[_seriesUID].anonymize(uid_table, **rules)
|
|
474
|
+
_copy[_series.seriesInstanceUID] = _series
|
|
475
|
+
return _copy
|
|
476
|
+
|
|
434
477
|
|
|
435
478
|
class Patient(IndexedDict):
|
|
436
479
|
"""Patient -- Read and sort images into a collection of Study objects.
|
|
@@ -500,6 +543,9 @@ class Patient(IndexedDict):
|
|
|
500
543
|
# _study_dict = data
|
|
501
544
|
# for _studyInstanceUID in data:
|
|
502
545
|
# self[_studyInstanceUID] = _study_dict[_studyInstanceUID]
|
|
546
|
+
elif data is None:
|
|
547
|
+
_series_dict = {}
|
|
548
|
+
_study_dict = {}
|
|
503
549
|
else:
|
|
504
550
|
_series_dict = _sort_in_series(data, _in_opts)
|
|
505
551
|
_study_dict = _sort_in_studies(_series_dict, _in_opts)
|
|
@@ -618,6 +664,21 @@ class Patient(IndexedDict):
|
|
|
618
664
|
except Exception as e:
|
|
619
665
|
raise Exception(_url) from e
|
|
620
666
|
|
|
667
|
+
def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
|
|
668
|
+
_actions = {} | actions
|
|
669
|
+
rules = anonymization_rules | kwargs
|
|
670
|
+
_copy = Patient(None)
|
|
671
|
+
for _rule in rules:
|
|
672
|
+
try:
|
|
673
|
+
_ = getattr(_copy, _rule)
|
|
674
|
+
setattr(_copy, _rule, rules[_rule])
|
|
675
|
+
except AttributeError:
|
|
676
|
+
pass
|
|
677
|
+
for _studyUID in self.keys():
|
|
678
|
+
_study = self[_studyUID].anonymize(uid_table, **rules)
|
|
679
|
+
_copy[_study.studyInstanceUID] = _study
|
|
680
|
+
return _copy
|
|
681
|
+
|
|
621
682
|
|
|
622
683
|
class Cohort(IndexedDict):
|
|
623
684
|
"""Cohort -- Read and sort images into a collection of Patient objects.
|
|
@@ -687,6 +748,10 @@ class Cohort(IndexedDict):
|
|
|
687
748
|
for _patientID in _patient_dict:
|
|
688
749
|
# self[_patientID] = Patient(_patient_dict[_patientID])
|
|
689
750
|
self[_patientID] = _patient_dict[_patientID]
|
|
751
|
+
elif data is None:
|
|
752
|
+
_series_dict = {}
|
|
753
|
+
_study_dict = {}
|
|
754
|
+
_patient_dict = {}
|
|
690
755
|
else:
|
|
691
756
|
raise ValueError('Unexpected cohort data type {}'.format(type(data)))
|
|
692
757
|
|
|
@@ -782,3 +847,19 @@ class Cohort(IndexedDict):
|
|
|
782
847
|
_series.write(_url, opts=opts, formats=formats)
|
|
783
848
|
except Exception as e:
|
|
784
849
|
raise Exception(_url) from e
|
|
850
|
+
|
|
851
|
+
def anonymize(self, uid_table: dict = {}, actions: dict = {}, **kwargs):
|
|
852
|
+
_actions = {} | actions
|
|
853
|
+
rules = anonymization_rules | kwargs
|
|
854
|
+
_copy = Cohort(None)
|
|
855
|
+
for _rule in rules:
|
|
856
|
+
try:
|
|
857
|
+
_ = getattr(_copy, _rule)
|
|
858
|
+
setattr(_copy, _rule, rules[_rule])
|
|
859
|
+
except AttributeError:
|
|
860
|
+
pass
|
|
861
|
+
for _patientID in self.keys():
|
|
862
|
+
_patient = self[_patientID].anonymize(uid_table, **rules)
|
|
863
|
+
_copy[_patientID] = _patient
|
|
864
|
+
return _copy
|
|
865
|
+
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Standard plugins provides support for DICOM and Nifti image file formats.
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
|
-
# Copyright (c) 2013-
|
|
6
|
+
# Copyright (c) 2013-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
@@ -23,11 +23,13 @@ INPUT_ORDER_TIME = 'time'
|
|
|
23
23
|
INPUT_ORDER_TRIGGERTIME = 'triggertime'
|
|
24
24
|
INPUT_ORDER_B = 'b'
|
|
25
25
|
INPUT_ORDER_BVECTOR = 'bvector'
|
|
26
|
+
INPUT_ORDER_DTI = 'dti'
|
|
26
27
|
INPUT_ORDER_RSI = 'rsi'
|
|
27
28
|
INPUT_ORDER_FA = 'fa'
|
|
28
29
|
INPUT_ORDER_TE = 'te'
|
|
29
30
|
INPUT_ORDER_FAULTY = 'faulty'
|
|
30
31
|
input_order_set = {INPUT_ORDER_NONE, INPUT_ORDER_TIME, INPUT_ORDER_B, INPUT_ORDER_BVECTOR,
|
|
32
|
+
INPUT_ORDER_DTI,
|
|
31
33
|
INPUT_ORDER_RSI, INPUT_ORDER_FA, INPUT_ORDER_TRIGGERTIME,
|
|
32
34
|
INPUT_ORDER_TE, INPUT_ORDER_FAULTY}
|
|
33
35
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
anonymization_rules = {
|
|
2
|
+
'patientName': 'ANONYMOUS',
|
|
3
|
+
'patientID': 'ANONYMOUS',
|
|
4
|
+
'patientBirthDate': '19000101',
|
|
5
|
+
'patientSex': 'O',
|
|
6
|
+
'patientIdentityRemoved': 'YES',
|
|
7
|
+
'deidentificationMethod': 'imagedata',
|
|
8
|
+
'studyDate': '19700101',
|
|
9
|
+
'studyTime': None,
|
|
10
|
+
'studyDescription': '',
|
|
11
|
+
'studyID': '1',
|
|
12
|
+
'referringPhysicianName': '',
|
|
13
|
+
'instanceCreationDate': '19700101',
|
|
14
|
+
'seriesDate': '19700101',
|
|
15
|
+
'acquisitionDate': '19700101',
|
|
16
|
+
'performedProcedureStepStartDate': '19700101',
|
|
17
|
+
}
|