13 #ifndef __mitkLabelSetImageWriter__cpp 14 #define __mitkLabelSetImageWriter__cpp 25 #include "itkImageFileReader.h" 26 #include "itkImageFileWriter.h" 27 #include "itkMetaDataDictionary.h" 28 #include "itkMetaDataObject.h" 29 #include "itkNrrdImageIO.h" 63 if (inputVector.IsNull())
65 mitkThrow() <<
"Cannot write non-image data";
68 itk::NrrdImageIO::Pointer nrrdImageIo = itk::NrrdImageIO::New();
75 if (inputVector->GetDimension() == 2 && !geometry->Is2DConvertable())
77 MITK_WARN <<
"Saving a 2D image with 3D geometry information. Geometry information will be lost! You might " 78 "consider using Convert2Dto3DImageFilter before saving.";
81 mitk::AffineTransform3D::Pointer affTrans = mitk::AffineTransform3D::New();
82 affTrans->SetIdentity();
85 geometry->SetIndexToWorldTransform(affTrans);
86 geometry->SetSpacing(spacing);
87 geometry->SetOrigin(origin);
93 MITK_INFO <<
"Writing image: " << path << std::endl;
100 const unsigned int dimension = inputVector->GetDimension();
101 const unsigned int *
const dimensions = inputVector->GetDimensions();
108 itk::Vector<double, 4u> spacing4D;
109 spacing4D[0] = mitkSpacing[0];
110 spacing4D[1] = mitkSpacing[1];
111 spacing4D[2] = mitkSpacing[2];
114 itk::Vector<double, 4u> origin4D;
115 origin4D[0] = mitkOrigin[0];
116 origin4D[1] = mitkOrigin[1];
117 origin4D[2] = mitkOrigin[2];
121 nrrdImageIo->SetNumberOfDimensions(dimension);
124 static_cast<itk::ImageIOBase::IOComponentType
>(pixelType.
GetComponentType()) :
125 itk::ImageIOBase::UNKNOWNCOMPONENTTYPE);
128 itk::ImageIORegion ioRegion(dimension);
130 for (
unsigned int i = 0; i < dimension; i++)
132 nrrdImageIo->SetDimensions(i, dimensions[i]);
133 nrrdImageIo->SetSpacing(i, spacing4D[i]);
134 nrrdImageIo->SetOrigin(i, origin4D[i]);
137 mitkDirection.SetVnlVector(geometry->GetIndexToWorldTransform()->GetMatrix().GetVnlMatrix().get_column(i));
138 itk::Vector<double, 4u> direction4D;
139 direction4D[0] = mitkDirection[0];
140 direction4D[1] = mitkDirection[1];
141 direction4D[2] = mitkDirection[2];
153 vnl_vector<double> axisDirection(dimension);
154 for (
unsigned int j = 0; j < dimension; j++)
156 axisDirection[j] = direction4D[j] / spacing4D[i];
158 nrrdImageIo->SetDirection(i, axisDirection);
160 ioRegion.SetSize(i, inputVector->GetLargestPossibleRegion().GetSize(i));
161 ioRegion.SetIndex(i, inputVector->GetLargestPossibleRegion().GetIndex(i));
165 nrrdImageIo->UseCompressionOn();
167 nrrdImageIo->SetIORegion(ioRegion);
168 nrrdImageIo->SetFileName(path);
174 sprintf(keybuffer,
"modality");
175 sprintf(valbuffer,
"org.mitk.image.multilabel");
176 itk::EncapsulateMetaData<std::string>(
177 nrrdImageIo->GetMetaDataDictionary(), std::string(keybuffer), std::string(valbuffer));
179 sprintf(keybuffer,
"layers");
180 sprintf(valbuffer,
"%1d", input->GetNumberOfLayers());
181 itk::EncapsulateMetaData<std::string>(
182 nrrdImageIo->GetMetaDataDictionary(), std::string(keybuffer), std::string(valbuffer));
184 for (
unsigned int layerIdx = 0; layerIdx < input->GetNumberOfLayers(); layerIdx++)
186 sprintf(keybuffer,
"layer_%03u", layerIdx);
187 sprintf(valbuffer,
"%1u", input->GetNumberOfLabels(layerIdx));
188 itk::EncapsulateMetaData<std::string>(
189 nrrdImageIo->GetMetaDataDictionary(), std::string(keybuffer), std::string(valbuffer));
191 auto iter = input->GetLabelSet(layerIdx)->IteratorConstBegin();
192 unsigned int count(0);
193 while (iter != input->GetLabelSet(layerIdx)->IteratorConstEnd())
195 std::unique_ptr<TiXmlDocument> document;
196 document.reset(
new TiXmlDocument());
198 auto *decl =
new TiXmlDeclaration(
"1.0",
"",
"");
199 document->LinkEndChild(decl);
201 document->LinkEndChild(labelElem);
202 TiXmlPrinter printer;
203 printer.SetIndent(
"");
204 printer.SetLineBreak(
"");
206 document->Accept(&printer);
208 sprintf(keybuffer,
"org.mitk.label_%03u_%05u", layerIdx, count);
209 itk::EncapsulateMetaData<std::string>(
210 nrrdImageIo->GetMetaDataDictionary(), std::string(keybuffer), printer.Str());
218 nrrdImageIo->Write(imageAccess.
GetData());
220 catch (
const std::exception &e)
232 itk::NrrdImageIO::Pointer io = itk::NrrdImageIO::New();
233 io->SetFileName(fileName);
234 io->ReadImageInformation();
236 itk::MetaDataDictionary imgMetaDataDictionary = io->GetMetaDataDictionary();
237 std::string value(
"");
238 itk::ExposeMetaData<std::string>(imgMetaDataDictionary,
"modality", value);
239 if (value.compare(
"org.mitk.image.multilabel") == 0)
252 itk::NrrdImageIO::Pointer nrrdImageIO = itk::NrrdImageIO::New();
255 const unsigned int MINDIM = 2;
256 const unsigned int MAXDIM = 4;
260 MITK_INFO <<
"loading " << path <<
" via itk::ImageIOFactory... " << std::endl;
265 mitkThrow() <<
"Empty filename in mitk::ItkImageIO ";
270 nrrdImageIO->SetFileName(path);
271 nrrdImageIO->ReadImageInformation();
273 unsigned int ndim = nrrdImageIO->GetNumberOfDimensions();
274 if (ndim < MINDIM || ndim > MAXDIM)
276 MITK_WARN <<
"Sorry, only dimensions 2, 3 and 4 are supported. The given file has " << ndim
277 <<
" dimensions! Reading as 4D.";
281 itk::ImageIORegion ioRegion(ndim);
282 itk::ImageIORegion::SizeType ioSize = ioRegion.GetSize();
283 itk::ImageIORegion::IndexType ioStart = ioRegion.GetIndex();
285 unsigned int dimensions[MAXDIM];
301 for (i = 0; i < ndim; ++i)
304 ioSize[i] = nrrdImageIO->GetDimensions(i);
307 dimensions[i] = nrrdImageIO->GetDimensions(i);
308 spacing[i] = nrrdImageIO->GetSpacing(i);
314 origin[i] = nrrdImageIO->GetOrigin(i);
318 ioRegion.SetSize(ioSize);
319 ioRegion.SetIndex(ioStart);
321 MITK_INFO <<
"ioRegion: " << ioRegion << std::endl;
322 nrrdImageIO->SetIORegion(ioRegion);
323 void *buffer =
new unsigned char[nrrdImageIO->GetImageSizeInBytes()];
324 nrrdImageIO->Read(buffer);
326 image->Initialize(
MakePixelType(nrrdImageIO), ndim, dimensions);
331 matrix.SetIdentity();
332 unsigned int j, itkDimMax3 = (ndim >= 3 ? 3 : ndim);
333 for (i = 0; i < itkDimMax3; ++i)
334 for (j = 0; j < itkDimMax3; ++j)
335 matrix[i][j] = nrrdImageIO->GetDirection(j)[i];
338 PlaneGeometry *planeGeometry = image->GetSlicedGeometry(0)->GetPlaneGeometry(0);
352 timeGeometry->Initialize(slicedGeometry, image->GetDimension(3));
353 image->SetTimeGeometry(timeGeometry);
356 MITK_INFO <<
"number of image components: " << image->GetPixelType().GetNumberOfComponents() << std::endl;
358 const itk::MetaDataDictionary &dictionary = nrrdImageIO->GetMetaDataDictionary();
359 for (
auto iter = dictionary.Begin(), iterEnd = dictionary.End(); iter != iterEnd;
362 std::string key = std::string(
"meta.") + iter->first;
363 if (iter->second->GetMetaDataObjectTypeInfo() ==
typeid(std::string))
366 dynamic_cast<itk::MetaDataObject<std::string> *
>(iter->second.GetPointer())->GetMetaDataObjectValue();
378 unsigned int numberOfLayers =
GetIntByKey(dictionary,
"layers");
382 for (
unsigned int layerIdx = 0; layerIdx < numberOfLayers; layerIdx++)
384 sprintf(keybuffer,
"layer_%03u", layerIdx);
385 int numberOfLabels =
GetIntByKey(dictionary, keybuffer);
389 for (
int labelIdx = 0; labelIdx < numberOfLabels; labelIdx++)
392 sprintf(keybuffer,
"label_%03u_%05d", layerIdx, labelIdx);
394 doc.Parse(_xmlStr.c_str());
396 TiXmlElement *labelElem = doc.FirstChildElement(
"Label");
397 if (labelElem ==
nullptr)
398 mitkThrow() <<
"Error parsing NRRD header for mitk::LabelSetImage IO";
402 if (label->GetValue() == 0)
403 output->SetExteriorLabel(label);
404 labelSet->AddLabel(label);
405 labelSet->SetLayer(layerIdx);
407 output->AddLabelSetToLayer(layerIdx, labelSet);
410 MITK_INFO <<
"...finished!" << std::endl;
412 std::vector<BaseData::Pointer> result;
413 result.push_back(output.GetPointer());
419 std::vector<std::string> imgMetaKeys = dic.GetKeys();
420 std::vector<std::string>::const_iterator itKey = imgMetaKeys.begin();
421 std::string metaString(
"");
422 for (; itKey != imgMetaKeys.end(); itKey++)
424 itk::ExposeMetaData<std::string>(dic, *itKey, metaString);
425 if (itKey->find(str.c_str()) != std::string::npos)
427 return atoi(metaString.c_str());
435 std::vector<std::string> imgMetaKeys = dic.GetKeys();
436 std::vector<std::string>::const_iterator itKey = imgMetaKeys.begin();
437 std::string metaString(
"");
438 for (; itKey != imgMetaKeys.end(); itKey++)
440 itk::ExposeMetaData<std::string>(dic, *itKey, metaString);
441 if (itKey->find(str.c_str()) != std::string::npos)
452 #endif //__mitkLabelSetImageWriter__cpp
MITKMULTILABEL_EXPORT Image::Pointer ConvertLabelSetImageToImage(LabelSetImage::ConstPointer labelSetImage)
Convert mitk::LabelSetImage to mitk::Image (itk::VectorImage)
void SetSpacing(const mitk::Vector3D &aSpacing, bool enforceSetSpacing=false)
Set the spacing (m_Spacing).
static itk::SmartPointer< mitk::Label > LoadLabelFromTiXmlDocument(TiXmlElement *labelElem)
Creates a mitk::Label from a TiXmlElement.
ConfidenceLevel GetReaderConfidenceLevel() const override
vcl_size_t GetNumberOfComponents() const
Get the number of components of which each element consists.
std::string GetFileName()
MITKMULTILABEL_EXPORT LabelSetImage::Pointer ConvertImageToLabelSetImage(Image::Pointer image)
Convert mitk::Image to mitk::LabelSetImage, templating and differentation between itk::Image and itk:...
int GetIntByKey(const itk::MetaDataDictionary &dic, const std::string &str)
std::string GetStringByKey(const itk::MetaDataDictionary &dic, const std::string &str)
DataCollection - Class to facilitate loading/accessing structured data.
Point3D GetCornerPoint(int id) const
Get the position of the corner number id (in world coordinates)
void Write() override
Write the base data to the specified location or output stream.
virtual void InitializeEvenlySpaced(mitk::PlaneGeometry *geometry2D, unsigned int slices)
Completely initialize this instance as evenly-spaced with slices parallel to the provided PlaneGeomet...
static const int PixelComponentUserType
int GetComponentType() const
Get the component type (the scalar (!) type). Each element may contain m_NumberOfComponents (more tha...
void SetRanking(int ranking)
Set the service ranking for this file writer.
std::string GetLocalFileName() const
Get a local file name for reading.
ConfidenceLevel GetReaderConfidenceLevel() const override
MITKCORE_EXPORT mitk::PixelType MakePixelType(vtkImageData *vtkimagedata)
deduct the PixelType for a given vtk image
ConfidenceLevel
A confidence level describing the confidence of the reader or writer in handling the given data...
Convenience class to temporarily change the current locale.
std::pair< us::ServiceRegistration< IFileReader >, us::ServiceRegistration< IFileWriter > > RegisterService(us::ModuleContext *context=us::GetModuleContext())
void SetOrigin(const Point3D &origin)
Set the origin, i.e. the upper-left corner of the plane.
const BaseData * GetInput() const override
Get the input data set via SetInput().
ConfidenceLevel GetWriterConfidenceLevel() const override
A local file representation for streams.
itk::ImageIOBase::IOPixelType GetPixelType() const
void ValidateOutputLocation() const
mitk::Image::Pointer image
Describes the geometry of a data object consisting of slices.
void SetRanking(int ranking)
Set the service ranking for this file reader.
static TiXmlElement * GetLabelAsTiXmlElement(Label *label)
Creates a TiXmlElement from a mitk::Label.
LabelSetImage class for handling labels and layers in a segmentation session.
ConfidenceLevel GetWriterConfidenceLevel() const override
Describes a two-dimensional, rectangular plane.
std::vector< BaseData::Pointer > Read() override
Reads a number of mitk::LabelSetImages from the file system.
ImageReadAccessor class to get locked read access for a particular image part.
Abstract class for implementing a reader and writer.
const void * GetData() const
Gives const access to the data.
Class for defining the data type of pixels.
mitk::AffineTransform3D * GetIndexToWorldTransform()
Get the transformation used to convert from index to world coordinates.