nifti1_io.c
来自「DTMK软件开发包,此为开源软件,是一款很好的医学图像开发资源.」· C语言 代码 · 共 1,582 行 · 第 1/5 页
C
1,582 行
fprintf(stderr,"** sorting screw-up, way to go, rick!\n");
free(stmp); free(itmp); *slist = NULL; *sindex = NULL;
return -1;
}
}
if( g_opts.debug > 2 ) fprintf(stderr,"-d sorting is okay\n");
return 0;
}
/*----------------------------------------------------------------------*/
/*! valid_nifti_brick_list - check sub-brick list for image
*
* This function verifies that nbricks and blist are appropriate
* for use with this nim, based on the dimensions.
*
* \param nim nifti_image to check against
* \param nbricks number of brick indices in blist
* \param blist list of brick indices to check in nim
* \param disp_error if this flag is set, report errors to user
*
* \return 1 if valid, 0 if not
*//*--------------------------------------------------------------------*/
int valid_nifti_brick_list(nifti_image * nim , int nbricks,
const int * blist, int disp_error)
{
int c, nsubs;
if( !nim ){
if( disp_error || g_opts.debug > 0 )
fprintf(stderr,"** valid_nifti_brick_list: missing nifti image\n");
return 0;
}
if( nbricks <= 0 || !blist ){
if( disp_error || g_opts.debug > 1 )
fprintf(stderr,"** valid_nifti_brick_list: no brick list to check\n");
return 0;
}
if( nim->dim[0] < 3 ){
if( disp_error || g_opts.debug > 1 )
fprintf(stderr,"** cannot read explict brick list from %d-D dataset\n",
nim->dim[0]);
return 0;
}
/* nsubs sub-brick is nt*nu*nv*nw */
for( c = 4, nsubs = 1; c <= nim->dim[0]; c++ )
nsubs *= nim->dim[c];
if( nsubs <= 0 ){
fprintf(stderr,"** VNBL warning: bad dim list (%d,%d,%d,%d)\n",
nim->dim[4], nim->dim[5], nim->dim[6], nim->dim[7]);
return 0;
}
for( c = 0; c < nbricks; c++ )
if( (blist[c] < 0) || (blist[c] >= nsubs) ){
if( disp_error || g_opts.debug > 1 )
fprintf(stderr,
"-d ** bad sub-brick chooser %d (#%d), valid range is [0,%d]\n",
blist[c], c, nsubs-1);
return 0;
}
return 1; /* all is well */
}
#if 0
/* set any non-positive values to 1 */
static int int_force_positive( int * list, int nel )
{
int c;
if( !list || nel < 0 ){
if( g_opts.debug > 0 )
fprintf(stderr,"** int_force_positive: bad params (%p,%d)\n",
(void *)list,nel);
return -1;
}
for( c = 0; c < nel; c++ )
if( list[c] <= 0 ) list[c] = 1;
return 0;
}
#endif
/* end of new nifti_image_read_bricks() functionality */
/*----------------------------------------------------------------------*/
/*! display the orientation from the quaternian fields
*
* \param mesg if non-NULL, display this message first
* \param mat the matrix to convert to "nearest" orientation
*
* \return -1 if results cannot be determined, 0 if okay
*//*--------------------------------------------------------------------*/
int nifti_disp_matrix_orient( const char * mesg, mat44 mat )
{
int i, j, k;
if ( mesg ) fputs( mesg, stderr ); /* use stdout? */
nifti_mat44_to_orientation( mat, &i,&j,&k );
if ( i <= 0 || j <= 0 || k <= 0 ) return -1;
/* so we have good codes */
fprintf(stderr, " i orientation = '%s'\n"
" j orientation = '%s'\n"
" k orientation = '%s'\n",
nifti_orientation_string(i),
nifti_orientation_string(j),
nifti_orientation_string(k) );
return 0;
}
/*----------------------------------------------------------------------*/
/*! duplicate the given string (alloc length+1)
*
* \return allocated pointer (or NULL on failure)
*//*--------------------------------------------------------------------*/
char *nifti_strdup(const char *str)
{
char *dup= (char *)malloc( strlen(str)+1 );
if (dup) strcpy(dup,str);
return dup;
}
/*---------------------------------------------------------------------------*/
/*! Return a pointer to a string holding the name of a NIFTI datatype.
\param dt NIfTI-1 datatype
\return pointer to static string holding the datatype name
\warning Do not free() or modify this string!
It points to static storage.
\sa NIFTI1_DATATYPES group in nifti1.h
*//*-------------------------------------------------------------------------*/
char *nifti_datatype_string( int dt )
{
switch( dt ){
case DT_UNKNOWN: return "UNKNOWN" ;
case DT_BINARY: return "BINARY" ;
case DT_INT8: return "INT8" ;
case DT_UINT8: return "UINT8" ;
case DT_INT16: return "INT16" ;
case DT_UINT16: return "UINT16" ;
case DT_INT32: return "INT32" ;
case DT_UINT32: return "UINT32" ;
case DT_INT64: return "INT64" ;
case DT_UINT64: return "UINT64" ;
case DT_FLOAT32: return "FLOAT32" ;
case DT_FLOAT64: return "FLOAT64" ;
case DT_FLOAT128: return "FLOAT128" ;
case DT_COMPLEX64: return "COMPLEX64" ;
case DT_COMPLEX128: return "COMPLEX128" ;
case DT_COMPLEX256: return "COMPLEX256" ;
case DT_RGB24: return "RGB24" ;
case DT_RGBA32: return "RGBA32" ;
}
return "**ILLEGAL**" ;
}
/*----------------------------------------------------------------------*/
/*! Determine if the datatype code dt is an integer type (1=YES, 0=NO).
\return whether the given NIfTI-1 datatype code is valid
\sa NIFTI1_DATATYPES group in nifti1.h
*//*--------------------------------------------------------------------*/
int nifti_is_inttype( int dt )
{
switch( dt ){
case DT_UNKNOWN: return 0 ;
case DT_BINARY: return 0 ;
case DT_INT8: return 1 ;
case DT_UINT8: return 1 ;
case DT_INT16: return 1 ;
case DT_UINT16: return 1 ;
case DT_INT32: return 1 ;
case DT_UINT32: return 1 ;
case DT_INT64: return 1 ;
case DT_UINT64: return 1 ;
case DT_FLOAT32: return 0 ;
case DT_FLOAT64: return 0 ;
case DT_FLOAT128: return 0 ;
case DT_COMPLEX64: return 0 ;
case DT_COMPLEX128: return 0 ;
case DT_COMPLEX256: return 0 ;
case DT_RGB24: return 1 ;
case DT_RGBA32: return 1 ;
}
return 0 ;
}
/*---------------------------------------------------------------------------*/
/*! Return a pointer to a string holding the name of a NIFTI units type.
\param uu NIfTI-1 unit code
\return pointer to static string for the given unit type
\warning Do not free() or modify this string!
It points to static storage.
\sa NIFTI1_UNITS group in nifti1.h
*//*-------------------------------------------------------------------------*/
char *nifti_units_string( int uu )
{
switch( uu ){
case NIFTI_UNITS_METER: return "m" ;
case NIFTI_UNITS_MM: return "mm" ;
case NIFTI_UNITS_MICRON: return "um" ;
case NIFTI_UNITS_SEC: return "s" ;
case NIFTI_UNITS_MSEC: return "ms" ;
case NIFTI_UNITS_USEC: return "us" ;
case NIFTI_UNITS_HZ: return "Hz" ;
case NIFTI_UNITS_PPM: return "ppm" ;
case NIFTI_UNITS_RADS: return "rad/s" ;
}
return "Unknown" ;
}
/*---------------------------------------------------------------------------*/
/*! Return a pointer to a string holding the name of a NIFTI transform type.
\param xx NIfTI-1 xform code
\return pointer to static string describing xform code
\warning Do not free() or modify this string!
It points to static storage.
\sa NIFTI1_XFORM_CODES group in nifti1.h
*//*-------------------------------------------------------------------------*/
char *nifti_xform_string( int xx )
{
switch( xx ){
case NIFTI_XFORM_SCANNER_ANAT: return "Scanner Anat" ;
case NIFTI_XFORM_ALIGNED_ANAT: return "Aligned Anat" ;
case NIFTI_XFORM_TALAIRACH: return "Talairach" ;
case NIFTI_XFORM_MNI_152: return "MNI_152" ;
}
return "Unknown" ;
}
/*---------------------------------------------------------------------------*/
/*! Return a pointer to a string holding the name of a NIFTI intent type.
\param ii NIfTI-1 intent code
\return pointer to static string describing code
\warning Do not free() or modify this string!
It points to static storage.
\sa NIFTI1_INTENT_CODES group in nifti1.h
*//*-------------------------------------------------------------------------*/
char *nifti_intent_string( int ii )
{
switch( ii ){
case NIFTI_INTENT_CORREL: return "Correlation statistic" ;
case NIFTI_INTENT_TTEST: return "T-statistic" ;
case NIFTI_INTENT_FTEST: return "F-statistic" ;
case NIFTI_INTENT_ZSCORE: return "Z-score" ;
case NIFTI_INTENT_CHISQ: return "Chi-squared distribution" ;
case NIFTI_INTENT_BETA: return "Beta distribution" ;
case NIFTI_INTENT_BINOM: return "Binomial distribution" ;
case NIFTI_INTENT_GAMMA: return "Gamma distribution" ;
case NIFTI_INTENT_POISSON: return "Poisson distribution" ;
case NIFTI_INTENT_NORMAL: return "Normal distribution" ;
case NIFTI_INTENT_FTEST_NONC: return "F-statistic noncentral" ;
case NIFTI_INTENT_CHISQ_NONC: return "Chi-squared noncentral" ;
case NIFTI_INTENT_LOGISTIC: return "Logistic distribution" ;
case NIFTI_INTENT_LAPLACE: return "Laplace distribution" ;
case NIFTI_INTENT_UNIFORM: return "Uniform distribition" ;
case NIFTI_INTENT_TTEST_NONC: return "T-statistic noncentral" ;
case NIFTI_INTENT_WEIBULL: return "Weibull distribution" ;
case NIFTI_INTENT_CHI: return "Chi distribution" ;
case NIFTI_INTENT_INVGAUSS: return "Inverse Gaussian distribution" ;
case NIFTI_INTENT_EXTVAL: return "Extreme Value distribution" ;
case NIFTI_INTENT_PVAL: return "P-value" ;
case NIFTI_INTENT_LOGPVAL: return "Log P-value" ;
case NIFTI_INTENT_LOG10PVAL: return "Log10 P-value" ;
case NIFTI_INTENT_ESTIMATE: return "Estimate" ;
case NIFTI_INTENT_LABEL: return "Label index" ;
case NIFTI_INTENT_NEURONAME: return "NeuroNames index" ;
case NIFTI_INTENT_GENMATRIX: return "General matrix" ;
case NIFTI_INTENT_SYMMATRIX: return "Symmetric matrix" ;
case NIFTI_INTENT_DISPVECT: return "Displacement vector" ;
case NIFTI_INTENT_VECTOR: return "Vector" ;
case NIFTI_INTENT_POINTSET: return "Pointset" ;
case NIFTI_INTENT_TRIANGLE: return "Triangle" ;
case NIFTI_INTENT_QUATERNION: return "Quaternion" ;
case NIFTI_INTENT_DIMLESS: return "Dimensionless number" ;
}
return "Unknown" ;
}
/*---------------------------------------------------------------------------*/
/*! Return a pointer to a string holding the name of a NIFTI slice_code.
\param ss NIfTI-1 slice order code
\return pointer to static string describing code
\warning Do not free() or modify this string!
It points to static storage.
\sa NIFTI1_SLICE_ORDER group in nifti1.h
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?