You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
238 lines
7.1 KiB
C
238 lines
7.1 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
Program: Visualization Toolkit
|
||
|
Module: vtkNIFTIImageWriter.h
|
||
|
|
||
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
||
|
All rights reserved.
|
||
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
||
|
|
||
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
||
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||
|
PURPOSE. See the above copyright notice for more information.
|
||
|
|
||
|
=========================================================================*/
|
||
|
/**
|
||
|
* @class vtkNIFTIImageWriter
|
||
|
* @brief Write NIfTI-1 and NIfTI-2 medical image files
|
||
|
*
|
||
|
* This class writes NIFTI files, either in .nii format or as separate
|
||
|
* .img and .hdr files. If told to write a file that ends in ".gz",
|
||
|
* then the writer will automatically compress the file with zlib.
|
||
|
* Images of type unsigned char that have 3 or 4 scalar components
|
||
|
* will automatically be written as RGB or RGBA respectively. Images
|
||
|
* of type float or double that have 2 components will automatically be
|
||
|
* written as complex values.
|
||
|
* @par Thanks:
|
||
|
* This class was contributed to VTK by the Calgary Image Processing and
|
||
|
* Analysis Centre (CIPAC).
|
||
|
* @sa
|
||
|
* vtkNIFTIImageReader
|
||
|
*/
|
||
|
|
||
|
#ifndef vtkNIFTIImageWriter_h
|
||
|
#define vtkNIFTIImageWriter_h
|
||
|
|
||
|
#include "vtkIOImageModule.h" // For export macro
|
||
|
#include "vtkImageWriter.h"
|
||
|
|
||
|
class vtkMatrix4x4;
|
||
|
class vtkNIFTIImageHeader;
|
||
|
|
||
|
class VTKIOIMAGE_EXPORT vtkNIFTIImageWriter : public vtkImageWriter
|
||
|
{
|
||
|
public:
|
||
|
//@{
|
||
|
/**
|
||
|
* Static method for construction.
|
||
|
*/
|
||
|
static vtkNIFTIImageWriter* New();
|
||
|
vtkTypeMacro(vtkNIFTIImageWriter, vtkImageWriter);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Print information about this object.
|
||
|
*/
|
||
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the version number for the NIfTI file format to use.
|
||
|
* This can be 1, 2, or 0 (the default). If set to zero, then it
|
||
|
* will save as NIfTI version 1 unless SetNIFTIHeader() provided
|
||
|
* header information from a NIfTI version 2 file.
|
||
|
*/
|
||
|
vtkSetMacro(NIFTIVersion, int);
|
||
|
vtkGetMacro(NIFTIVersion, int);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set a short description (max 80 chars) of how the file was produced.
|
||
|
* The default description is "VTKX.Y" where X.Y is the VTK version.
|
||
|
*/
|
||
|
vtkSetStringMacro(Description);
|
||
|
vtkGetStringMacro(Description);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the time dimension to use in the NIFTI file (or zero if none).
|
||
|
* The number of components of the input data must be divisible by the time
|
||
|
* dimension if the time dimension is not set to zero. The vector dimension
|
||
|
* will be set to the number of components divided by the time dimension.
|
||
|
*/
|
||
|
vtkGetMacro(TimeDimension, int);
|
||
|
vtkSetMacro(TimeDimension, int);
|
||
|
vtkGetMacro(TimeSpacing, double);
|
||
|
vtkSetMacro(TimeSpacing, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the slope and intercept for calibrating the scalar values.
|
||
|
* Other programs that read the NIFTI file can use the equation
|
||
|
* v = u*RescaleSlope + RescaleIntercept to rescale the data to
|
||
|
* real values. If both the slope and the intercept are zero,
|
||
|
* then the SclSlope and SclIntercept in the header info provided
|
||
|
* via SetNIFTIHeader() are used instead.
|
||
|
*/
|
||
|
vtkSetMacro(RescaleSlope, double);
|
||
|
vtkGetMacro(RescaleSlope, double);
|
||
|
vtkSetMacro(RescaleIntercept, double);
|
||
|
vtkGetMacro(RescaleIntercept, double);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Write planar RGB (separate R, G, and B planes), rather than packed RGB.
|
||
|
* Use this option with extreme caution: the NIFTI standard requires RGB
|
||
|
* pixels to be packed. The Analyze format, however, was used to store
|
||
|
* both planar RGB and packed RGB depending on the software, without any
|
||
|
* indication in the header about which convention was being used.
|
||
|
*/
|
||
|
vtkGetMacro(PlanarRGB, bool);
|
||
|
vtkSetMacro(PlanarRGB, bool);
|
||
|
vtkBooleanMacro(PlanarRGB, bool);
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The QFac sets the ordering of the slices in the NIFTI file.
|
||
|
* If QFac is -1, then the slice ordering in the file will be reversed
|
||
|
* as compared to VTK. Use with caution.
|
||
|
*/
|
||
|
vtkSetMacro(QFac, double);
|
||
|
vtkGetMacro(QFac, double);
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Set the "qform" orientation and offset for the image data.
|
||
|
* The 3x3 portion of the matrix must be orthonormal and have a
|
||
|
* positive determinant, it will be used to compute the quaternion.
|
||
|
* The last column of the matrix will be used for the offset.
|
||
|
* In the NIFTI header, the qform_code will be set to 1.
|
||
|
*/
|
||
|
void SetQFormMatrix(vtkMatrix4x4*);
|
||
|
vtkMatrix4x4* GetQFormMatrix() { return this->QFormMatrix; }
|
||
|
|
||
|
/**
|
||
|
* Set a matrix for the "sform" transformation stored in the file.
|
||
|
* Unlike the qform matrix, the sform matrix can contain scaling
|
||
|
* information. Before being stored in the NIFTI header, the
|
||
|
* first three columns of the matrix will be multiplied by the voxel
|
||
|
* spacing. In the NIFTI header, the sform_code will be set to 2.
|
||
|
*/
|
||
|
void SetSFormMatrix(vtkMatrix4x4*);
|
||
|
vtkMatrix4x4* GetSFormMatrix() { return this->SFormMatrix; }
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Set the NIFTI header information to use when writing the file.
|
||
|
* The data dimensions and pixdim from the supplied header will be
|
||
|
* ignored. Likewise, the QForm and SForm information in the supplied
|
||
|
* header will be ignored if you have called SetQFormMatrix() or
|
||
|
* SetSFormMatrix() to provide the orientation information for the file.
|
||
|
*/
|
||
|
void SetNIFTIHeader(vtkNIFTIImageHeader* hdr);
|
||
|
vtkNIFTIImageHeader* GetNIFTIHeader();
|
||
|
//@}
|
||
|
|
||
|
protected:
|
||
|
vtkNIFTIImageWriter();
|
||
|
~vtkNIFTIImageWriter() override;
|
||
|
|
||
|
/**
|
||
|
* Generate the header information for the file.
|
||
|
*/
|
||
|
int GenerateHeader(vtkInformation* info, bool singleFile);
|
||
|
|
||
|
/**
|
||
|
* The main execution method, which writes the file.
|
||
|
*/
|
||
|
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
|
||
|
vtkInformationVector* outputVector) override;
|
||
|
|
||
|
/**
|
||
|
* Make a new filename by replacing extension "ext1" with "ext2".
|
||
|
* The extensions must include a period, must be three characters
|
||
|
* long, and must be lower case. A new string is returned that must
|
||
|
* be deleted by the caller.
|
||
|
*/
|
||
|
static char* ReplaceExtension(const char* fname, const char* ext1, const char* ext2);
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The size and spacing of the Time dimension to use in the file.
|
||
|
*/
|
||
|
int TimeDimension;
|
||
|
double TimeSpacing;
|
||
|
//@}
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* Information for rescaling data to quantitative units.
|
||
|
*/
|
||
|
double RescaleIntercept;
|
||
|
double RescaleSlope;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Is -1 if VTK slice order is opposite to NIFTI slice order, +1 otherwise.
|
||
|
*/
|
||
|
double QFac;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The orientation matrices for the NIFTI file.
|
||
|
*/
|
||
|
vtkMatrix4x4* QFormMatrix;
|
||
|
vtkMatrix4x4* SFormMatrix;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* A description of how the file was produced.
|
||
|
*/
|
||
|
char* Description;
|
||
|
|
||
|
//@{
|
||
|
/**
|
||
|
* The header information.
|
||
|
*/
|
||
|
vtkNIFTIImageHeader* NIFTIHeader;
|
||
|
vtkNIFTIImageHeader* OwnHeader;
|
||
|
int NIFTIVersion;
|
||
|
//@}
|
||
|
|
||
|
/**
|
||
|
* Use planar RGB instead of the default (packed).
|
||
|
*/
|
||
|
bool PlanarRGB;
|
||
|
|
||
|
private:
|
||
|
vtkNIFTIImageWriter(const vtkNIFTIImageWriter&) = delete;
|
||
|
void operator=(const vtkNIFTIImageWriter&) = delete;
|
||
|
};
|
||
|
|
||
|
#endif // vtkNIFTIImageWriter_h
|