diff --git a/Modules/Core/src/IO/mitkDicomSeriesReaderService.cpp b/Modules/Core/src/IO/mitkDicomSeriesReaderService.cpp index f8a6b20d78..96b7722800 100644 --- a/Modules/Core/src/IO/mitkDicomSeriesReaderService.cpp +++ b/Modules/Core/src/IO/mitkDicomSeriesReaderService.cpp @@ -1,134 +1,134 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include "mitkDicomSeriesReaderService.h" #include #include #include #include #include #include namespace mitk { DicomSeriesReaderService::DicomSeriesReaderService() - : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), "MITK DICOM Reader") + : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), "Classic MITK DICOM Reader") { this->RegisterService(); } std::vector > DicomSeriesReaderService::Read() { std::vector result; const char* previousCLocale = setlocale(LC_NUMERIC, NULL); setlocale(LC_NUMERIC, "C"); std::locale previousCppLocale( std::cin.getloc() ); std::locale l( "C" ); std::cin.imbue(l); std::string fileName = this->GetLocalFileName(); if ( DicomSeriesReader::IsPhilips3DDicom(fileName) ) { MITK_INFO << "it is a Philips3D US Dicom file" << std::endl; DataNode::Pointer node = DataNode::New(); mitk::DicomSeriesReader::StringContainer stringvec; stringvec.push_back(fileName); if (DicomSeriesReader::LoadDicomSeries(stringvec, *node)) { BaseData::Pointer data = node->GetData(); StringProperty::Pointer nameProp = StringProperty::New(itksys::SystemTools::GetFilenameName(fileName)); data->GetPropertyList()->SetProperty("name", nameProp); result.push_back(data); } setlocale(LC_NUMERIC, previousCLocale); std::cin.imbue(previousCppLocale); return result; } DicomSeriesReader::FileNamesGrouping imageBlocks = DicomSeriesReader::GetSeries(itksys::SystemTools::GetFilenamePath(fileName), true); // true = group gantry tilt images const unsigned int size = imageBlocks.size(); ProgressBar::GetInstance()->AddStepsToDo(size); ProgressBar::GetInstance()->Progress(); unsigned int outputIndex = 0u; const DicomSeriesReader::FileNamesGrouping::const_iterator n_end = imageBlocks.end(); for (DicomSeriesReader::FileNamesGrouping::const_iterator n_it = imageBlocks.begin(); n_it != n_end; ++n_it) { const std::string &uid = n_it->first; DataNode::Pointer node = DataNode::New(); const DicomSeriesReader::ImageBlockDescriptor& imageBlockDescriptor( n_it->second ); MITK_INFO << "--------------------------------------------------------------------------------"; MITK_INFO << "DicomSeriesReader: Loading DICOM series " << outputIndex << ": Series UID " << imageBlockDescriptor.GetSeriesInstanceUID() << std::endl; MITK_INFO << " " << imageBlockDescriptor.GetFilenames().size() << " '" << imageBlockDescriptor.GetModality() << "' files (" << imageBlockDescriptor.GetSOPClassUIDAsString() << ") loaded into 1 mitk::Image"; MITK_INFO << " multi-frame: " << (imageBlockDescriptor.IsMultiFrameImage()?"Yes":"No"); MITK_INFO << " reader support: " << DicomSeriesReader::ReaderImplementationLevelToString(imageBlockDescriptor.GetReaderImplementationLevel()); MITK_INFO << " pixel spacing type: " << DicomSeriesReader::PixelSpacingInterpretationToString( imageBlockDescriptor.GetPixelSpacingType() ); MITK_INFO << " gantry tilt corrected: " << (imageBlockDescriptor.HasGantryTiltCorrected()?"Yes":"No"); MITK_INFO << " 3D+t: " << (imageBlockDescriptor.HasMultipleTimePoints()?"Yes":"No"); MITK_INFO << "--------------------------------------------------------------------------------"; if (DicomSeriesReader::LoadDicomSeries(n_it->second.GetFilenames(), *node, true, true, true)) { BaseData::Pointer data = node->GetData(); PropertyList::Pointer dataProps = data->GetPropertyList(); std::string nodeName(uid); std::string studyDescription; if ( dataProps->GetStringProperty( "dicom.study.StudyDescription", studyDescription ) ) { nodeName = studyDescription; std::string seriesDescription; if ( dataProps->GetStringProperty( "dicom.series.SeriesDescription", seriesDescription ) ) { nodeName += "/" + seriesDescription; } } StringProperty::Pointer nameProp = StringProperty::New(nodeName); data->SetProperty("name", nameProp); result.push_back(data); ++outputIndex; } else { MITK_ERROR << "DicomSeriesReader: Skipping series " << outputIndex << " due to some unspecified error..." << std::endl; } ProgressBar::GetInstance()->Progress(); } setlocale(LC_NUMERIC, previousCLocale); std::cin.imbue(previousCppLocale); return result; } DicomSeriesReaderService* DicomSeriesReaderService::Clone() const { return new DicomSeriesReaderService(*this); } } diff --git a/Modules/DICOMReaderServices/CMakeLists.txt b/Modules/DICOMReaderServices/CMakeLists.txt new file mode 100644 index 0000000000..218118c204 --- /dev/null +++ b/Modules/DICOMReaderServices/CMakeLists.txt @@ -0,0 +1,6 @@ +MITK_CREATE_MODULE( + DEPENDS MitkCore MitkDICOMReader + PACKAGE_DEPENDS + PRIVATE ITK|ITKIOGDCM + AUTOLOAD_WITH MitkCore +) diff --git a/Modules/DICOMReaderServices/files.cmake b/Modules/DICOMReaderServices/files.cmake new file mode 100644 index 0000000000..a71695bdc3 --- /dev/null +++ b/Modules/DICOMReaderServices/files.cmake @@ -0,0 +1,9 @@ +file(GLOB_RECURSE H_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/include/*") + +set(CPP_FILES + mitkBaseDICOMReaderService.cpp + mitkAutoSelectingDICOMReaderService.cpp + mitkClassicDICOMSeriesReaderService.cpp + mitkDICOMReaderServicesActivator.cpp + mitkDICOMFilesHelper.cpp +) diff --git a/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h b/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h new file mode 100644 index 0000000000..9604cf407c --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkAutoSelectingDICOMReaderService.h @@ -0,0 +1,45 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKAUTOSELECTINGDICOMREADERSERVICE_H +#define MITKAUTOSELECTINGDICOMREADERSERVICE_H + +#include + +namespace mitk { + + /** + Service wrapper that auto selects (using the mitk::DICOMFileReaderSelector) the best DICOMFileReader from + the DICOMReader module. + */ +class AutoSelectingDICOMReaderService : public BaseDICOMReaderService +{ +public: + AutoSelectingDICOMReaderService(); + +protected: + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const override; + +private: + + virtual AutoSelectingDICOMReaderService* Clone() const override; +}; + +} + +#endif // MITKDICOMSERIESREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h b/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h new file mode 100644 index 0000000000..f99a76d50e --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkBaseDICOMReaderService.h @@ -0,0 +1,52 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKBASEDICOMREADERSERVICE_H +#define MITKBASEDICOMREADERSERVICE_H + +#include +#include + +namespace mitk { + + /** + Base class for service wrappers that make DICOMFileReader from + the DICOMReader module usable. + */ +class BaseDICOMReaderService : public AbstractFileReader +{ +public: + BaseDICOMReaderService(const std::string& description); + + using AbstractFileReader::Read; + + /** Uses this->GetRelevantFile() and this->GetReader to load the image. + * data and puts it into base data instances-*/ + virtual std::vector > Read() override; + +protected: + /** Returns the list of all DCM files that are in the same directory + * like this->GetLocalFileName().*/ + mitk::StringList GetRelevantFiles() const; + + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const = 0; +}; + +} + +#endif // MITKBASEDICOMREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h b/Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h new file mode 100644 index 0000000000..aabc3a73ac --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkClassicDICOMSeriesReaderService.h @@ -0,0 +1,45 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKCLASSICDICOMSERIESREADERSERVICE_H +#define MITKCLASSICDICOMSERIESREADERSERVICE_H + +#include + +namespace mitk { + + /** + Service wrapper that auto selects (using the mitk::DICOMFileReaderSelector) the best DICOMFileReader from + the DICOMReader module. + */ +class ClassicDICOMSeriesReaderService : public BaseDICOMReaderService +{ +public: + ClassicDICOMSeriesReaderService(); + +protected: + /** Returns the reader instance that should be used. The descission may be based + * one the passed relevant file list.*/ + virtual mitk::DICOMFileReader::Pointer GetReader(const mitk::StringList& relevantFiles) const override; + +private: + virtual ClassicDICOMSeriesReaderService* Clone() const override; + +}; + +} + +#endif // MITKCLASSICDICOMSERIESREADERSERVICE_H diff --git a/Modules/DICOMReaderServices/include/mitkDICOMFilesHelper.h b/Modules/DICOMReaderServices/include/mitkDICOMFilesHelper.h new file mode 100644 index 0000000000..fd4db83a43 --- /dev/null +++ b/Modules/DICOMReaderServices/include/mitkDICOMFilesHelper.h @@ -0,0 +1,41 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKDICOMFILESHELPER_H +#define MITKDICOMFILESHELPER_H + +#include +#include + +#include + +namespace mitk { + +typedef std::vector DICOMFilePathList; + +/** Helper functions. Searches for all files in the directory of the passed file path. + All files will be checked if they are DICOM files. All DICOM files will be added to the result and + returned. + @remark The helper does no sorting of any kind.*/ +DICOMFilePathList GetDICOMFilesInSameDirectory(const std::string& filePath); + +/** All passed files will be checked if they are DICOM files. +All DICOM files will be added to the result and returned. +@remark The helper does no sorting of any kind.*/ +DICOMFilePathList FilterForDICOMFiles(const DICOMFilePathList& fileList); +} + +#endif // MITKDICOMFILESHELPER_H diff --git a/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp new file mode 100644 index 0000000000..fd3a88ccb6 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkAutoSelectingDICOMReaderService.cpp @@ -0,0 +1,46 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkAutoSelectingDICOMReaderService.h" + +#include + +namespace mitk { + +AutoSelectingDICOMReaderService::AutoSelectingDICOMReaderService() + : BaseDICOMReaderService("MITK DICOM Reader (auto)") +{ + this->RegisterService(); +} + +DICOMFileReader::Pointer AutoSelectingDICOMReaderService::GetReader(const mitk::StringList& relevantFiles) const +{ + mitk::DICOMFileReaderSelector::Pointer selector = mitk::DICOMFileReaderSelector::New(); + + selector->LoadBuiltIn3DConfigs(); + selector->LoadBuiltIn3DnTConfigs(); + selector->SetInputFiles(relevantFiles); + + mitk::DICOMFileReader::Pointer reader = selector->GetFirstReaderWithMinimumNumberOfOutputImages(); + return reader; +}; + +AutoSelectingDICOMReaderService* AutoSelectingDICOMReaderService::Clone() const +{ + return new AutoSelectingDICOMReaderService(*this); +} + +} diff --git a/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp new file mode 100644 index 0000000000..12455c26d3 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkBaseDICOMReaderService.cpp @@ -0,0 +1,88 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkBaseDICOMReaderService.h" + +#include +#include +#include +#include +#include + +#include + +namespace mitk { + + BaseDICOMReaderService::BaseDICOMReaderService(const std::string& description) + : AbstractFileReader(CustomMimeType(IOMimeTypes::DICOM_MIMETYPE()), description) +{ +} + +std::vector > BaseDICOMReaderService::Read() +{ + std::vector result; + mitk::StringList relevantFiles = this->GetRelevantFiles(); + + mitk::DICOMFileReader::Pointer reader = this->GetReader(relevantFiles); + + reader->SetInputFiles(relevantFiles); + reader->AnalyzeInputFiles(); + reader->LoadImages(); + + for (unsigned int i = 0; i < reader->GetNumberOfOutputs(); ++i) + { + const mitk::DICOMImageBlockDescriptor& desc = reader->GetOutput(i); + mitk::BaseData::Pointer data = desc.GetMitkImage().GetPointer(); + + std::string nodeName = "Unnamed_DICOM"; + + std::string studyDescription = desc.GetPropertyAsString("studyDescription"); + std::string seriesDescription = desc.GetPropertyAsString("seriesDescription"); + + if (!studyDescription.empty()) + { + nodeName = studyDescription; + } + + if (!seriesDescription.empty()) + { + if (!studyDescription.empty()) + { + nodeName += "/"; + } + nodeName += seriesDescription; + } + + StringProperty::Pointer nameProp = StringProperty::New(nodeName); + data->SetProperty("name", nameProp); + + result.push_back(data); + } + + return result; +} + +StringList BaseDICOMReaderService::GetRelevantFiles() const +{ + std::string fileName = this->GetLocalFileName(); + + mitk::StringList relevantFiles = mitk::GetDICOMFilesInSameDirectory(fileName); + + return relevantFiles; +} + + +} diff --git a/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp b/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp new file mode 100644 index 0000000000..b99e609ec3 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkClassicDICOMSeriesReaderService.cpp @@ -0,0 +1,41 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkClassicDICOMSeriesReaderService.h" + +#include + +namespace mitk { + + ClassicDICOMSeriesReaderService::ClassicDICOMSeriesReaderService() + : BaseDICOMReaderService("MITK DICOM Reader(2013 classic style)") +{ + this->RegisterService(); +} + + DICOMFileReader::Pointer ClassicDICOMSeriesReaderService::GetReader(const mitk::StringList& relevantFiles) const +{ + mitk::ClassicDICOMSeriesReader::Pointer reader = mitk::ClassicDICOMSeriesReader::New(); + return reader.GetPointer(); +}; + + + ClassicDICOMSeriesReaderService* ClassicDICOMSeriesReaderService::Clone() const + { + return new ClassicDICOMSeriesReaderService(*this); + } + +} diff --git a/Modules/DICOMReaderServices/src/mitkDICOMFilesHelper.cpp b/Modules/DICOMReaderServices/src/mitkDICOMFilesHelper.cpp new file mode 100644 index 0000000000..84edcb0986 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkDICOMFilesHelper.cpp @@ -0,0 +1,53 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkDICOMFilesHelper.h" + +#include +#include +#include + +mitk::DICOMFilePathList mitk::GetDICOMFilesInSameDirectory(const std::string& filePath) +{ + DICOMFilePathList result; + + if (!filePath.empty()) + { + std::string dir = itksys::SystemTools::GetFilenamePath(filePath); + + gdcm::Directory directoryLister; + directoryLister.Load(dir.c_str(), false); // non-recursive + result = FilterForDICOMFiles(directoryLister.GetFilenames()); + } + + return result; +}; + +mitk::DICOMFilePathList mitk::FilterForDICOMFiles(const DICOMFilePathList& fileList) +{ + mitk::DICOMFilePathList result; + + itk::GDCMImageIO::Pointer io = itk::GDCMImageIO::New(); + for (auto aFile : fileList) + { + if (io->CanReadFile(aFile.c_str())) + { + result.push_back(aFile); + } + } + + return result; +}; diff --git a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp new file mode 100644 index 0000000000..14c76fc2b4 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.cpp @@ -0,0 +1,36 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#include "mitkDICOMReaderServicesActivator.h" + +#include "mitkAutoSelectingDICOMReaderService.h" +#include "mitkClassicDICOMSeriesReaderService.h" + +namespace mitk { + + void DICOMReaderServicesActivator::Load(us::ModuleContext*) + { + m_AutoSelectingDICOMReader.reset(new AutoSelectingDICOMReaderService()); + m_ClassicDICOMSeriesReader.reset(new ClassicDICOMSeriesReaderService()); + } + + void DICOMReaderServicesActivator::Unload(us::ModuleContext*) + { + } + +} + +US_EXPORT_MODULE_ACTIVATOR(mitk::DICOMReaderServicesActivator) diff --git a/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h new file mode 100644 index 0000000000..c128e96451 --- /dev/null +++ b/Modules/DICOMReaderServices/src/mitkDICOMReaderServicesActivator.h @@ -0,0 +1,43 @@ +/*=================================================================== + +The Medical Imaging Interaction Toolkit (MITK) + +Copyright (c) German Cancer Research Center, +Division of Medical and Biological Informatics. +All rights reserved. + +This software is distributed WITHOUT ANY WARRANTY; without +even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. + +See LICENSE.txt or http://www.mitk.org for details. + +===================================================================*/ + +#ifndef MITKDICOMREADERSERVICESACTIVATOR_H +#define MITKDICOMREADERSERVICESACTIVATOR_H + +#include + +#include + +namespace mitk { + +struct IFileReader; + +class DICOMReaderServicesActivator : public us::ModuleActivator +{ +public: + + void Load(us::ModuleContext*context) override; + void Unload(us::ModuleContext* context) override; + +private: + + std::unique_ptr m_AutoSelectingDICOMReader; + std::unique_ptr m_ClassicDICOMSeriesReader; +}; + +} + +#endif // MITKDICOMREADERSERVICESACTIVATOR_H diff --git a/Modules/ModuleList.cmake b/Modules/ModuleList.cmake index 0f7d96d5ba..e92a7d6f91 100644 --- a/Modules/ModuleList.cmake +++ b/Modules/ModuleList.cmake @@ -1,76 +1,77 @@ # The entries in the mitk_modules list must be # ordered according to their dependencies. set(mitk_modules Core CommandLine AppUtil DCMTesting RDF LegacyIO DataTypesExt Overlays LegacyGL AlgorithmsExt MapperExt DICOMReader + DICOMReaderServices DICOMTesting Qt4Qt5TestModule SceneSerializationBase PlanarFigure ImageDenoising ImageExtraction ImageStatistics LegacyAdaptors SceneSerialization GraphAlgorithms Multilabel ContourModel SurfaceInterpolation Segmentation PlanarFigureSegmentation OpenViewCore QmlItems QtWidgets QtWidgetsExt SegmentationUI DiffusionImaging GPGPU OpenIGTLink IGTBase IGT CameraCalibration RigidRegistration RigidRegistrationUI DeformableRegistration DeformableRegistrationUI OpenCL OpenCVVideoSupport QtOverlays ToFHardware ToFProcessing ToFUI US USUI DicomUI Simulation Remeshing Python QtPython Persistence OpenIGTLinkUI IGTUI VtkShaders DicomRT RTUI IOExt XNAT TubeGraph BiophotonicsHardware Classification TumorInvasionAnalysis ) if(MITK_ENABLE_PIC_READER) list(APPEND mitk_modules IpPicSupportIO) endif()