nifti1.h
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C头文件 代码 · 共 1,370 行 · 第 1/5 页
H
1,370 行
program doesn't know how to interpret the data within. Of course, any
program can simply ignore all extended header sections simply by jumping
straight to the image data using vox_offset.
-----------------------------------------------------------------------------*/
/*! \struct nifti1_extender
\brief This structure represents a 4-byte string that should follow the
binary nifti_1_header data in a NIFTI-1 header file. If the char
values are {1,0,0,0}, the file is expected to contain extensions,
values of {0,0,0,0} imply the file does not contain extensions.
Other sequences of values are not currently defined.
*/
struct nifti1_extender { char extension[4] ; } ;
typedef struct nifti1_extender nifti1_extender ;
/*! \struct nifti1_extension
\brief Data structure defining the fields of a header extension.
*/
struct nifti1_extension {
int esize ; /*!< size of extension, in bytes (must be multiple of 16) */
int ecode ; /*!< extension code, one of the NIFTI_ECODE_ values */
char * edata ; /*!< raw data, with no byte swapping (length is esize-8) */
} ;
typedef struct nifti1_extension nifti1_extension ;
/*---------------------------------------------------------------------------*/
/* DATA DIMENSIONALITY (as in ANALYZE 7.5):
---------------------------------------
dim[0] = number of dimensions;
- if dim[0] is outside range 1..7, then the header information
needs to be byte swapped appropriately
- ANALYZE supports dim[0] up to 7, but NIFTI-1 reserves
dimensions 1,2,3 for space (x,y,z), 4 for time (t), and
5,6,7 for anything else needed.
dim[i] = length of dimension #i, for i=1..dim[0] (must be positive)
- also see the discussion of intent_code, far below
pixdim[i] = voxel width along dimension #i, i=1..dim[0] (positive)
- cf. ORIENTATION section below for use of pixdim[0]
- the units of pixdim can be specified with the xyzt_units
field (also described far below).
Number of bits per voxel value is in bitpix, which MUST correspond with
the datatype field. The total number of bytes in the image data is
dim[1] * ... * dim[dim[0]] * bitpix / 8
In NIFTI-1 files, dimensions 1,2,3 are for space, dimension 4 is for time,
and dimension 5 is for storing multiple values at each spatiotemporal
voxel. Some examples:
- A typical whole-brain FMRI experiment's time series:
- dim[0] = 4
- dim[1] = 64 pixdim[1] = 3.75 xyzt_units = NIFTI_UNITS_MM
- dim[2] = 64 pixdim[2] = 3.75 | NIFTI_UNITS_SEC
- dim[3] = 20 pixdim[3] = 5.0
- dim[4] = 120 pixdim[4] = 2.0
- A typical T1-weighted anatomical volume:
- dim[0] = 3
- dim[1] = 256 pixdim[1] = 1.0 xyzt_units = NIFTI_UNITS_MM
- dim[2] = 256 pixdim[2] = 1.0
- dim[3] = 128 pixdim[3] = 1.1
- A single slice EPI time series:
- dim[0] = 4
- dim[1] = 64 pixdim[1] = 3.75 xyzt_units = NIFTI_UNITS_MM
- dim[2] = 64 pixdim[2] = 3.75 | NIFTI_UNITS_SEC
- dim[3] = 1 pixdim[3] = 5.0
- dim[4] = 1200 pixdim[4] = 0.2
- A 3-vector stored at each point in a 3D volume:
- dim[0] = 5
- dim[1] = 256 pixdim[1] = 1.0 xyzt_units = NIFTI_UNITS_MM
- dim[2] = 256 pixdim[2] = 1.0
- dim[3] = 128 pixdim[3] = 1.1
- dim[4] = 1 pixdim[4] = 0.0
- dim[5] = 3 intent_code = NIFTI_INTENT_VECTOR
- A single time series with a 3x3 matrix at each point:
- dim[0] = 5
- dim[1] = 1 xyzt_units = NIFTI_UNITS_SEC
- dim[2] = 1
- dim[3] = 1
- dim[4] = 1200 pixdim[4] = 0.2
- dim[5] = 9 intent_code = NIFTI_INTENT_GENMATRIX
- intent_p1 = intent_p2 = 3.0 (indicates matrix dimensions)
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* DATA STORAGE:
------------
If the magic field is "n+1", then the voxel data is stored in the
same file as the header. In this case, the voxel data starts at offset
(int)vox_offset into the header file. Thus, vox_offset=352.0 means that
the data starts immediately after the NIFTI-1 header. If vox_offset is
greater than 352, the NIFTI-1 format does not say much about the
contents of the dataset file between the end of the header and the
start of the data.
FILES:
-----
If the magic field is "ni1", then the voxel data is stored in the
associated ".img" file, starting at offset 0 (i.e., vox_offset is not
used in this case, and should be set to 0.0).
When storing NIFTI-1 datasets in pairs of files, it is customary to name
the files in the pattern "name.hdr" and "name.img", as in ANALYZE 7.5.
When storing in a single file ("n+1"), the file name should be in
the form "name.nii" (the ".nft" and ".nif" suffixes are already taken;
cf. http://www.icdatamaster.com/n.html ).
BYTE ORDERING:
-------------
The byte order of the data arrays is presumed to be the same as the byte
order of the header (which is determined by examining dim[0]).
Floating point types are presumed to be stored in IEEE-754 format.
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* DETAILS ABOUT vox_offset:
------------------------
In a .nii file, the vox_offset field value is interpreted as the start
location of the image data bytes in that file. In a .hdr/.img file pair,
the vox_offset field value is the start location of the image data
bytes in the .img file.
* If vox_offset is less than 352 in a .nii file, it is equivalent
to 352 (i.e., image data never starts before byte #352 in a .nii file).
* The default value for vox_offset in a .nii file is 352.
* In a .hdr file, the default value for vox_offset is 0.
* vox_offset should be an integer multiple of 16; otherwise, some
programs may not work properly (e.g., SPM). This is to allow
memory-mapped input to be properly byte-aligned.
Note that since vox_offset is an IEEE-754 32 bit float (for compatibility
with the ANALYZE-7.5 format), it effectively has a 24 bit mantissa. All
integers from 0 to 2^24 can be represented exactly in this format, but not
all larger integers are exactly storable as IEEE-754 32 bit floats. However,
unless you plan to have vox_offset be potentially larger than 16 MB, this
should not be an issue. (Actually, any integral multiple of 16 up to 2^27
can be represented exactly in this format, which allows for up to 128 MB
of random information before the image data. If that isn't enough, then
perhaps this format isn't right for you.)
In a .img file (i.e., image data stored separately from the NIfTI-1
header), data bytes between #0 and #vox_offset-1 (inclusive) are completely
undefined and unregulated by the NIfTI-1 standard. One potential use of
having vox_offset > 0 in the .hdr/.img file pair storage method is to make
the .img file be a copy of (or link to) a pre-existing image file in some
other format, such as DICOM; then vox_offset would be set to the offset of
the image data in this file. (It may not be possible to follow the
"multiple-of-16 rule" with an arbitrary external file; using the NIfTI-1
format in such a case may lead to a file that is incompatible with software
that relies on vox_offset being a multiple of 16.)
In a .nii file, data bytes between #348 and #vox_offset-1 (inclusive) may
be used to store user-defined extra information; similarly, in a .hdr file,
any data bytes after byte #347 are available for user-defined extra
information. The (very weak) regulation of this extra header data is
described elsewhere.
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* DATA SCALING:
------------
If the scl_slope field is nonzero, then each voxel value in the dataset
should be scaled as
y = scl_slope * x + scl_inter
where x = voxel value stored
y = "true" voxel value
Normally, we would expect this scaling to be used to store "true" floating
values in a smaller integer datatype, but that is not required. That is,
it is legal to use scaling even if the datatype is a float type (crazy,
perhaps, but legal).
- However, the scaling is to be ignored if datatype is DT_RGB24.
- If datatype is a complex type, then the scaling is to be
applied to both the real and imaginary parts.
The cal_min and cal_max fields (if nonzero) are used for mapping (possibly
scaled) dataset values to display colors:
- Minimum display intensity (black) corresponds to dataset value cal_min.
- Maximum display intensity (white) corresponds to dataset value cal_max.
- Dataset values below cal_min should display as black also, and values
above cal_max as white.
- Colors "black" and "white", of course, may refer to any scalar display
scheme (e.g., a color lookup table specified via aux_file).
- cal_min and cal_max only make sense when applied to scalar-valued
datasets (i.e., dim[0] < 5 or dim[5] = 1).
-----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* TYPE OF DATA (acceptable values for datatype field):
---------------------------------------------------
Values of datatype smaller than 256 are ANALYZE 7.5 compatible.
Larger values are NIFTI-1 additions. These are all multiples of 256, so
that no bits below position 8 are set in datatype. But there is no need
to use only powers-of-2, as the original ANALYZE 7.5 datatype codes do.
The additional codes are intended to include a complete list of basic
scalar types, including signed and unsigned integers from 8 to 64 bits,
floats from 32 to 128 bits, and complex (float pairs) from 64 to 256 bits.
Note that most programs will support only a few of these datatypes!
A NIFTI-1 program should fail gracefully (e.g., print a warning message)
when it encounters a dataset with a type it doesn't like.
-----------------------------------------------------------------------------*/
#undef DT_UNKNOWN /* defined in dirent.h on some Unix systems */
/*! \defgroup NIFTI1_DATATYPES
\brief nifti1 datatype codes
@{
*/
/*--- the original ANALYZE 7.5 type codes ---*/
#define DT_NONE 0
#define DT_UNKNOWN 0 /* what it says, dude */
#define DT_BINARY 1 /* binary (1 bit/voxel) */
#define DT_UNSIGNED_CHAR 2 /* unsigned char (8 bits/voxel) */
#define DT_SIGNED_SHORT 4 /* signed short (16 bits/voxel) */
#define DT_SIGNED_INT 8 /* signed int (32 bits/voxel) */
#define DT_FLOAT 16 /* float (32 bits/voxel) */
#define DT_COMPLEX 32 /* complex (64 bits/voxel) */
#define DT_DOUBLE 64 /* double (64 bits/voxel) */
#define DT_RGB 128 /* RGB triple (24 bits/voxel) */
#define DT_ALL 255 /* not very useful (?) */
/*----- another set of names for the same ---*/
#define DT_UINT8 2
#define DT_INT16 4
#define DT_INT32 8
#define DT_FLOAT32 16
#define DT_COMPLEX64 32
#define DT_FLOAT64 64
#define DT_RGB24 128
/*------------------- new codes for NIFTI ---*/
#define DT_INT8 256 /* signed char (8 bits) */
#define DT_UINT16 512 /* unsigned short (16 bits) */
#define DT_UINT32 768 /* unsigned int (32 bits) */
#define DT_INT64 1024 /* long long (64 bits) */
#define DT_UINT64 1280 /* unsigned long long (64 bits) */
#define DT_FLOAT128 1536 /* long double (128 bits) */
#define DT_COMPLEX128 1792 /* double pair (128 bits) */
#define DT_COMPLEX256 2048 /* long double pair (256 bits) */
#define DT_RGBA32 2304 /* 4 byte RGBA (32 bits/voxel) */
/* @} */
/*------- aliases for all the above codes ---*/
/*! \defgroup NIFTI1_DATATYPE_ALIASES
\brief aliases for the nifti1 datatype codes
@{
*/
/*! unsigned char. */
#define NIFTI_TYPE_UINT8 2
/*! signed short. */
#define NIFTI_TYPE_INT16 4
/*! signed int. */
#define NIFTI_TYPE_INT32 8
/*! 32 bit float. */
#define NIFTI_TYPE_FLOAT32 16
/*! 64 bit complex = 2 32 bit floats. */
#define NIFTI_TYPE_COMPLEX64 32
/*! 64 bit float = double. */
#define NIFTI_TYPE_FLOAT64 64
/*! 3 8 bit bytes. */
#define NIFTI_TYPE_RGB24 128
/*! signed char. */
#define NIFTI_TYPE_INT8 256
/*! unsigned short. */
#define NIFTI_TYPE_UINT16 512
/*! unsigned int. */
#define NIFTI_TYPE_UINT32 768
/*! signed long long. */
#define NIFTI_TYPE_INT64 1024
/*! unsigned long long. */
#define NIFTI_TYPE_UINT64 1280
/*! 128 bit float = long double. */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?