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.
202 lines
7.2 KiB
C++
202 lines
7.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkMetaImageReader.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 vtkMetaImageReader
|
|
* @brief read binary UNC meta image data
|
|
*
|
|
* One of the formats for which a reader is already available in the toolkit is
|
|
* the MetaImage file format. This is a fairly simple yet powerful format
|
|
* consisting of a text header and a binary data section. The following
|
|
* instructions describe how you can write a MetaImage header for the data that
|
|
* you download from the BrainWeb page.
|
|
*
|
|
* The minimal structure of the MetaImage header is the following:
|
|
*
|
|
* NDims = 3
|
|
* DimSize = 181 217 181
|
|
* ElementType = MET_UCHAR
|
|
* ElementSpacing = 1.0 1.0 1.0
|
|
* ElementByteOrderMSB = False
|
|
* ElementDataFile = brainweb1.raw
|
|
*
|
|
* * NDims indicate that this is a 3D image. ITK can handle images of
|
|
* arbitrary dimension.
|
|
* * DimSize indicates the size of the volume in pixels along each
|
|
* direction.
|
|
* * ElementType indicate the primitive type used for pixels. In this case
|
|
* is "unsigned char", implying that the data is digitized in 8 bits /
|
|
* pixel.
|
|
* * ElementSpacing indicates the physical separation between the center of
|
|
* one pixel and the center of the next pixel along each direction in space.
|
|
* The units used are millimeters.
|
|
* * ElementByteOrderMSB indicates is the data is encoded in little or big
|
|
* endian order. You might want to play with this value when moving data
|
|
* between different computer platforms.
|
|
* * ElementDataFile is the name of the file containing the raw binary data
|
|
* of the image. This file must be in the same directory as the header.
|
|
*
|
|
* MetaImage headers are expected to have extension: ".mha" or ".mhd"
|
|
*
|
|
* Once you write this header text file, it should be possible to read the
|
|
* image into your ITK based application using the itk::FileIOToImageFilter
|
|
* class.
|
|
*
|
|
*
|
|
*
|
|
*/
|
|
|
|
#ifndef vtkMetaImageReader_h
|
|
#define vtkMetaImageReader_h
|
|
|
|
#include "vtkIOImageModule.h" // For export macro
|
|
#include "vtkImageReader2.h"
|
|
|
|
namespace vtkmetaio
|
|
{
|
|
class MetaImage;
|
|
} // forward declaration
|
|
|
|
class VTKIOIMAGE_EXPORT vtkMetaImageReader : public vtkImageReader2
|
|
{
|
|
public:
|
|
vtkTypeMacro(vtkMetaImageReader, vtkImageReader2);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
/**
|
|
* Construct object with FlipNormals turned off and Normals set to true.
|
|
*/
|
|
static vtkMetaImageReader* New();
|
|
|
|
const char* GetFileExtensions() override { return ".mhd .mha"; }
|
|
|
|
const char* GetDescriptiveName() override { return "MetaIO Library: MetaImage"; }
|
|
|
|
// These duplicate functions in vtkImageReader2, vtkMedicalImageReader.
|
|
double* GetPixelSpacing() { return this->GetDataSpacing(); }
|
|
int GetWidth() { return (this->GetDataExtent()[1] - this->GetDataExtent()[0] + 1); }
|
|
int GetHeight() { return (this->GetDataExtent()[3] - this->GetDataExtent()[2] + 1); }
|
|
double* GetImagePositionPatient() { return this->GetDataOrigin(); }
|
|
int GetNumberOfComponents() { return this->GetNumberOfScalarComponents(); }
|
|
int GetPixelRepresentation() { return this->GetDataScalarType(); }
|
|
int GetDataByteOrder(void) override;
|
|
|
|
vtkGetMacro(RescaleSlope, double);
|
|
vtkGetMacro(RescaleOffset, double);
|
|
vtkGetMacro(BitsAllocated, int);
|
|
vtkGetStringMacro(DistanceUnits);
|
|
vtkGetStringMacro(AnatomicalOrientation);
|
|
vtkGetMacro(GantryAngle, double);
|
|
vtkGetStringMacro(PatientName);
|
|
vtkGetStringMacro(PatientID);
|
|
vtkGetStringMacro(Date);
|
|
vtkGetStringMacro(Series);
|
|
vtkGetStringMacro(ImageNumber);
|
|
vtkGetStringMacro(Modality);
|
|
vtkGetStringMacro(StudyID);
|
|
vtkGetStringMacro(StudyUID);
|
|
vtkGetStringMacro(TransferSyntaxUID);
|
|
|
|
/**
|
|
* Test whether the file with the given name can be read by this
|
|
* reader.
|
|
*/
|
|
int CanReadFile(const char* name) override;
|
|
|
|
protected:
|
|
vtkMetaImageReader();
|
|
~vtkMetaImageReader() override;
|
|
|
|
// These functions make no sense for this (or most) file readers
|
|
// and should be hidden from the user...but then the getsettest fails.
|
|
/*virtual void SetFilePrefix(const char * arg)
|
|
{ vtkImageReader2::SetFilePrefix(arg); }
|
|
virtual void SetFilePattern(const char * arg)
|
|
{ vtkImageReader2::SetFilePattern(arg); }
|
|
virtual void SetDataScalarType(int type)
|
|
{ vtkImageReader2::SetDataScalarType(type); }
|
|
virtual void SetDataScalarTypeToFloat()
|
|
{ this->SetDataScalarType(VTK_FLOAT); }
|
|
virtual void SetDataScalarTypeToDouble()
|
|
{ this->SetDataScalarType(VTK_DOUBLE); }
|
|
virtual void SetDataScalarTypeToInt()
|
|
{ this->SetDataScalarType(VTK_INT); }
|
|
virtual void SetDataScalarTypeToShort()
|
|
{ this->SetDataScalarType(VTK_SHORT); }
|
|
virtual void SetDataScalarTypeToUnsignedShort()
|
|
{this->SetDataScalarType(VTK_UNSIGNED_SHORT);}
|
|
virtual void SetDataScalarTypeToUnsignedChar()
|
|
{this->SetDataScalarType(VTK_UNSIGNED_CHAR);}
|
|
vtkSetMacro(NumberOfScalarComponents, int);
|
|
vtkSetVector6Macro(DataExtent, int);
|
|
vtkSetMacro(FileDimensionality, int);
|
|
vtkSetVector3Macro(DataSpacing, double);
|
|
vtkSetVector3Macro(DataOrigin, double);
|
|
vtkSetMacro(HeaderSize, unsigned long);
|
|
unsigned long GetHeaderSize(unsigned long)
|
|
{ return 0; }
|
|
virtual void SetDataByteOrderToBigEndian()
|
|
{ this->SetDataByteOrderToBigEndian(); }
|
|
virtual void SetDataByteOrderToLittleEndian()
|
|
{ this->SetDataByteOrderToBigEndian(); }
|
|
virtual void SetDataByteOrder(int order)
|
|
{ this->SetDataByteOrder(order); }
|
|
vtkSetMacro(FileNameSliceOffset,int);
|
|
vtkSetMacro(FileNameSliceSpacing,int);
|
|
vtkSetMacro(SwapBytes, int);
|
|
virtual int OpenFile()
|
|
{ return vtkImageReader2::OpenFile(); }
|
|
virtual void SeekFile(int i, int j, int k)
|
|
{ vtkImageReader2::SeekFile(i, j, k); }
|
|
vtkSetMacro(FileLowerLeft, int);
|
|
virtual void ComputeInternalFileName(int slice)
|
|
{ vtkImageReader2::ComputeInternalFileName(slice); }
|
|
vtkGetStringMacro(InternalFileName);
|
|
const char * GetDataByteOrderAsString(void)
|
|
{ return vtkImageReader2::GetDataByteOrderAsString(); }
|
|
unsigned long GetHeaderSize(void)
|
|
{ return vtkImageReader2::GetHeaderSize(); }*/
|
|
|
|
void ExecuteInformation() override;
|
|
void ExecuteDataWithInformation(vtkDataObject* out, vtkInformation* outInfo) override;
|
|
int RequestInformation(vtkInformation* request, vtkInformationVector** inputVector,
|
|
vtkInformationVector* outputVector) override;
|
|
|
|
private:
|
|
vtkMetaImageReader(const vtkMetaImageReader&) = delete;
|
|
void operator=(const vtkMetaImageReader&) = delete;
|
|
|
|
vtkmetaio::MetaImage* MetaImagePtr;
|
|
|
|
double GantryAngle;
|
|
char PatientName[255];
|
|
char PatientID[255];
|
|
char Date[255];
|
|
char Series[255];
|
|
char Study[255];
|
|
char ImageNumber[255];
|
|
char Modality[255];
|
|
char StudyID[255];
|
|
char StudyUID[255];
|
|
char TransferSyntaxUID[255];
|
|
|
|
double RescaleSlope;
|
|
double RescaleOffset;
|
|
int BitsAllocated;
|
|
char DistanceUnits[255];
|
|
char AnatomicalOrientation[255];
|
|
};
|
|
|
|
#endif
|