TheLibrary
A brief overview on the library for those who want to include it in their own programs. The distribution is capable of creating a static and shared library on most architectures with the use of GNU's libtool. Here you can see an overview of the related man-page <medcon.3>. For more information you should look into the sourcecode itself. The library is intended to ease the use of read/write routines for the various medical image formats (primarily used in nuclear medicine). The FILEINFO structure holds all the interesting data and pointers to the images. A fast introduction:
#include "medcon.h"
-----------------------------------------------------------------------
Important Global Variables
-----------------------------------------------------------------------
char prefix[MDC_MAX_PREFIX + 1]; /* prefix for output filenames */
/* the command-line input data */
char *mdc_arg_files[]; /* pointers to input files (files) */
int mdc_arg_convs[]; /* conversions selected (counter) */
int mdc_arg_total[]; /* totals of files & conversions */
/* options set from command-line */
Int8 MDC_INFO; /* print image info */
Int8 MDC_INTERACTIVE; /* interactive read */
Int8 MDC_CONVERT; /* do conversion */
Int8 MDC_EXTRACT; /* extract images */
Int8 MDC_PIXELS; /* print pixel values */
Int8 MDC_SKIP_PREVIEW; /* skip first preview image */
Int8 MDC_DICOM_MOSAIC; /* support mosaic files */
Int8 MDC_DICOM_CONTRAST; /* enable contrast window center/width */
Int8 MDC_TRUE_GAP; /* spacing is true gap/overlap */
Int8 MDC_DEBUG; /* show debug info */
Int8 MDC_ANLZ_REV; /* analyze reverse images */
Int8 MDC_ANLZ_SPM; /* analyze for SPM */
Int8 MDC_GIF_OPTIONS; /* define gif options */
Int8 MDC_COLOR_MAP; /* gray colormap selected */
Int8 MDC_MAKE_GRAY; /* force remap to grayscale */
Int8 MDC_DITHER_COLOR; /* dither color reduction */
Int8 MDC_FORCE_INT; /* force writing BIT?_? pixs*/
Int8 MDC_ALIAS NAME; /* use alias name based on ID's */
Int8 MDC_PREFIX_DISABLED; /* prevent the prefix in names */
Int8 MDC_PATIENT_ANON; /* make patient anonymous */
Int8 MDC_FLIP_HORIZONTAL; /* flip horizontal (x) */
Int8 MDC_FLIP_VERTICAL; /* flip vertical (y) */
Int8 MDC_NEGATIVE; /* preserve negative pixels */
Int8 MDC_QUANTIFY; /* preserve quantification (one factor) */
Int8 MDC_CALIBRATE; /* preserve calibration (two factors) */
Int8 MDC_VERBOSE; /* verbose mode */
Int8 MDC_NORM_OVER_FRAMES; /* normalize over frames */
/* `QUANTIFY' & `CALIBRATE' may NOT be ON at the same time! */
----------------------------------------------------------------------
Important Defines
-----------------------------------------------------------------------
/* supported formats */
#define MDC_FRMT_NONE 0 /* unsupported format */
#define MDC_FRMT_RAW 1 /* Read Interactive */
/* Write RAW Binary */
#define MDC_FRMT_ASCII 2 /* Write RAW Ascii */
#define MDC_FRMT_GIF 3 /* GIF89a or GIF87a */
#define MDC_FRMT_ACR 4 /* Acr/Nema 2.0 (Papyrus) */
#define MDC_FRMT_INW 5 /* INW (RUG) */
#define MDC_FRMT_ECAT6 6 /* Siemens CTI ECAT 6.4 */
#define MDC_FRMT_ECAT7 7 /* Siemens CTI ECAT 7 */
#define MDC_FRMT_INTF 8 /* InterFile 3.3*/
#define MDC_FRMT_ANLZ 9 /* Analyze */
#define MDC_FRMT_DICM 10 /* DICOM */
#define MDC_FRMT_PNG 11 /* PNG */
#define MDC_FRMT_CONC 12 /* Concorde/µPET */
#define MDC_MAX_FMTS 13 /* total + 1 */
/* supported color maps */
#define MDC_MAP_PRESENT 0 /* 256 RGB colormap */
#define MDC_MAP_GRAY 1 /* grayscale colormap */
#define MDC_MAP_INVERTED 2 /* inverted colormap */
#define MDC_MAP_RAINBOW 3 /* rainbow colormap */
#define MDC_MAP_COMBINED 4 /* combined colormap */
#define MDC_MAP_HOTMETAL 5 /* hotmetal colormap */
#define MDC_MAP_LOADED 6 /* external LUT loaded */
-----------------------------------------------------------------------
Important Definitions
-----------------------------------------------------------------------
typedef struct Gated_Data_t {
Int8 gspect_nesting; /* gated spect nesting */
float nr_projections; /* number of projections */
float extent_rotation; /* extent of rotation */
float study_duration; /* study duration (ms) */
float image_duration; /* image duration (ms) */
float time_per_proj; /* time per proj (ms) */
float window_low; /* lower limit (ms) */
float window_high; /* higher limit (ms) */
float cycles_observed; /* cycles observed */
float cycles_acquired; /* cycles acquired */
} GATED_DATA;
typedef struct Acquisition_Data_t {
Int16 rotation_direction; /* direction of rotation */
Int16 detector_motion; /* type detector motion */
float angle_start; /* start angle (interfile = 180 - dicom) */
float angle_step; /* angular step */
float scan_arc; /* angular range */
} ACQ_DATA;
typedef struct Dynamic_Data_t {
Uint32 nr_of_slices; /* images in time frame */
float time_frame_start; /* start time frame (ms) */
float time_frame_delay; /* delay this frame (ms) */
float time_frame_duration; /* duration frame (ms) */
float delay_slices; /* delay each slice (ms) */
} DYNAMIC_DATA;
typedef struct Image_Data_t {
/* ** general data ** */
Uint32 width, height; /* image dimension */
Int16 bits,type; /* bits/pixel & datatype */
Uint16 flags; /* extra flag */
double min, max; /* min/max pixelvalue */
double qmin, qmax; /* quantified min/max */
double fmin, fmax; /* min/max in whole frame */
double qfmin, qfmax; /* in whole frame (quant) */
float rescale_slope; /* rescale slope */
float rescale_intercept; /* rescale intercept */
Uint8 *buf; /* pointer to raw image */
/* ** internal items ** */
Int16 rescaled; /* rescaled YES or NO */
double rescaled_min; /* new rescaled max */
double rescaled_max; /* new rescaled min */
double rescaled_fctr; /* new rescale fctr */
double rescaled_slope; /* new rescaled slope */
double rescaled_intercept; /* new rescaled intercept */
/* ** ecat64 items ** */
Int16 quant_units; /* quantification units */
Int16 calibr_units; /* calibration units */
float quant_scale; /* quantification scale */
float calibr_fctr; /* calibration factor */
float intercept; /* scale intercept */
float pixel_xsize; /* pixel size X (mm) */
float pixel_ysize; /* pixel size Y (mm) */
float slice_width; /* slice width (mm) */
Uint32 frame_number; /* part of frame # (1-based) */
float slice_start; /* start of slice (ms) */
float recon_scale; /* recon magnification */
/* ** Acr/Nema items ** */
char image_mod[3]; /* images modality */
float image_pos_dev[3]; /* image pos. device (mm) */
float image_orient_dev[6]; /* image orient device (mm) */
float image_pos_pat[3]; /* image pos. patient (mm) */
float image_orient_dev[6]; /* image orient patient (mm) */
float slice_spacing; /* space btw centres (mm) */
float ct_zoom_fctr; /* CT image zoom factor */
} IMG_DATA;
typedef struct File_Info_t {
FILE *ifp; /* pointer to input file */
FILE *ofp; /* pointer to output file */
char ipath[MDC_MAX_PATH + 1]; /* path to input file */
char opath[MDC_MAX_PATH + 1]; /* path to output file */
char *idir; /* dir to input file */
char *odir; /* dir to output file */
char *ifname; /* name of input file */
char *ofname; /* name of output file */
int rawconv; /* FRMT_RAW | FRMT_ASCII */
int endian; /* endian type of file */
int compression; /* file compression */
int truncated; /* truncated ? */
int diff_type; /* images with diff type */
int diff_size; /* images with diff size */
Uint32 number; /* total number of images */
Uint32 mwidth, mheight; /* global max dimensions */
Uint16 bits, type; /* global bits & datatype */
Int16 dim[8]; /* [0] = # of dimensions */
/* [1] = X-dim (pixels) */
/* [2] = Y-dim (pixels) */
/* [3] = Z-dim (planes) */
/* [4] = (frames) */
/* [5] = (gates) */
/* [6] = (beds) */
/* ... */
/* values must be 1-based */
float pixdim[8]; /* [0] = # of dimensions */
/* [1] = X-dim (mm) */
/* [2] = Y-dim (mm) */
/* [3] = Z-dim (mm) */
/* [4] = time (ms) */
/* ... */
double glmin, glmax; /* global min/max value */
double qglmin, qglmax; /* quantified min/max */
Int8 pat_slice_orient; /* combined flag */
char pat_pos[MDC_MAXSTR]; /* patient position */
char pat_orient[MDC_MAXSTR]; /* patient orientation */
char patient_sex[MDC_MAXSTR]; /* sex of patient */
char patient_name[MDC_MAXSTR]; /* name of patient */
char patient_id[MDC_MAXSTR]; /* id of patient */
char patient_dob[MDC_MAXSTR]; /* birth of patient YYYYMMDD */
float patient_weight; /* weight of patient (kg) */
char study_descr[MDC_MAXSTR]; /* study description */
char study_id[MDC_MAXSTR]; /* study id */
Int16 study_date_day; /* day of study */
Int16 study_date_month; /* month of study */
Int16 study_date_year; /* year of study */
Int16 study_time_hour; /* hour of study */
Int16 study_time_minute; /* minute of study */
Int16 study_time_second; /* second of study */
Int16 nr_series; /* number of series */
Int16 nr_acquisition; /* number of acquisition */
Int16 nr_instance; /* number of instance (image) */
Int16 decay_corrected; /* decay corrected ? */
Int16 flood_corrected; /* flood corrected ? */
Int16 acquisition_type; /* acquisition type */
Int16 reconstructed; /* reconstructed ? */
char recon_method[MDC_MAXSTR]; /* reconstruction method */
Int16 rotation_direction; /* direction of rotation */
Int16 detector_motion; /* type detector motion */
char institution[MDC_MAXSTR]; /* name of institution */
char manufacturer[MDC_MAXSTR]; /* name of manufacturer */
char series_descr[MDC_MAXSTR]; /* series description */
char radiopharma[MDC_MAXSTR]; /* radiopharmaceutical */
char filter_type[MDC_MAXSTR]; /* filter type */
char isotope_code[MDC_MAXSTR]; /* isotope */
float isotope_halflife; /* halflife of isotope */
float injected_dose; /* amount injected (MBq) */
float gantry_tilt; /* gantry tilt */
Uint8 map; /* index 256 colormap */
Uint8 palette[768]; /* global palette */
char *comment; /* whatever comment */
Uint32 comm_length; /* length of comment */
Uint32 gatednr; /* number of gated entries */
GATED_DATA *gdata; /* array of GATED_DATA */
Uint32 acqnr; /* number of acq. data entries */
ACQ_DATA *acqdata; /* array of ACQ_DATA entries */
Uint32 dynnr; /* number of dynamic data entries */
DYNAMIC_DATA *dyndata; /* array of DYNAMIC_DATA entries */
IMG_DATA *image; /* array of IMG_DATA images */
} FILEINFO;
------------------------------------------------------------------------
Important Functions
------------------------------------------------------------------------
void MdcInit(void), void MdcFinish(void);
int MdcHandleArgs ( FILEINFO *fi, int argc, char *argv[], int MAXFILES );
void MdcPrintUsage ( char *pgrname );
int MdcOpenFile ( FILEINFO *fi, char *path );
int MdcReadFile ( FILEINFO *fi, int filenr, char *(*ReadFunc)(FILEINFO *fi));
int MdcWriteFile ( FILEINFO *fi, int format, int prefixnr, char *(*WriteFunc)(FILEINFO *fi));
void MdcCloseFile ( FILE *fp );
void MdcInitFI ( FILEINFO *fi, char *path );
void MdcFreeIDs ( FILEINFO *fi );
void MdcCleanUpFI ( FILEINFO *fi );
void MdcResetIDs ( FILEINFO *fi );
void MdcPrintFI ( FILEINFO *fi );
void MdcSplitPath ( char path[], char **dir, char **fname );
int MdcGetFrmt ( FILEINFO *fi );
void MdcGetColorMap ( int map, Uint8 palette[] );
char *MdcImagesPixelFiddle ( FILEINFO *fi);
void MdcPrntMesg ( char *fmt, ... );
void MdcPrntWarn ( char *fmt, ... );
void MdcPrntErr ( int code, char *fmt, ... );
char *MdcReadRAW ( FILEINFO *fi ); char *MdcWriteRAW ( FILEINFO *fi );
char *MdcReadGIF ( FILEINFO *fi ); char *MdcWriteGIF ( FILEINFO *fi );
char *MdcReadACR ( FILEINFO *fi ); char *MdcWriteACR ( FILEINFO *fi );
char *MdcReadINW ( FILEINFO *fi ); char *MdcWriteINW ( FILEINFO *fi );
char *MdcReadECAT6 ( FILEINFO *fi ), *MdcReadECAT7 ( FILEINFO *fi ); char *MdcWriteECAT6 ( FILEINFO *fi );
char *MdcReadINTF ( FILEINFO *fi ); char *MdcWriteINTF ( FILEINFO *fi );
char *MdcReadANLZ ( FILEINFO *fi ); char *MdcWriteANLZ ( FILEINFO *fi );
char *MdcReadDICM ( FILEINFO *fi ); char *MdcWriteDICM ( FILEINFO *fi );
char *MdcReadCONC ( FILEINFO *fi ); char *MdcWriteCONC ( FILEINFO *fi );
A sample C-source code to show the usage of the most basic functions. Little MedCon so to speak:
-----------------------------------------------------------------------
/*
* filename: testit.c
*/
#include <stdio.h>
#include "medcon.h"
#undef VERSION /* prevent any conflict */
#define VERSION "TestIt v2.3"
void NewPrefix(int n)
{
sprintf(prefix,"my%02d-",n); /* max of MDC_MAX_PREFIX (5) chars */
}
int main(int argc, char *argv[])
{
FILEINFO fi;
int *total = mdc_arg_total; /* total arguments of files & conversions */
int *convs = mdc_arg_convs; /* counter for each conversion format */
char **files = mdc_arg_files; /* array of pointers to input filenames */
int f, c; /* some counters */
int t=0; /* counter for the output name prefix */
int convert, err=MDC_OK; /* some variables */
/* check arguments */
if (argc < 2) {
printf("%s - %s\n",VERSION,MdcGetLibLongVersion());
MdcPrintUsage(argv[0]);
}
/* init library */
MdcInit();
/* handle arguments, last one determines max inputfiles */
if (MdcHandleArgs(&fi,argc,argv,MDC_MAX_FILES) != MDC_OK)
MdcPrintUsage(argv[0]);
/* check output/conversion formats */
if (total[MDC_CONVS] == 0) {
printf("\n%s: ERROR : No output format specified\n\n",argv[0]);
return(MDC_BAD_CODE);
}
/* do the stuff for each input file */
for (f=0; f<total[MDC_FILES]; f++) {
if ((err = MdcOpenFile(&fi, files[f])) != MDC_OK) return(err);
if ((err = MdcReadFile(&fi, f+1, NULL)) != MDC_OK) return(err);
/* do the conversions */
if (total[MDC_CONVS] > 0) {
/* go through conversion formats */
for (c=1; c<MDC_MAX_FRMTS; c++) {
convert = convs[c];
/* write output format when selected */
while (convert -- > 0) {
if ((err = MdcWriteFile(&fi, c, t++, NULL)) != MDC_OK) {
MdcCleanUpFI(&fi);
return(err);
}
}
}
}
/* clean up FILEINFO struct */
MdcCleanUpFI(&fi);
}
/* finish library */
MdcFinish();
return(err);
}
-----------------------------------------------------------------------
Example `Makefile' for compiling `testit.c':
-----------------------------------------------------------------------
#
# filename: Makefile
#
CC = gcc
CCOPTS = -Wall -g
CFLAGS = $(CCOPTS)
INCS = `xmedcon-config --cflags`
LIBS = `xmedcon-config --libs`
testit: testit.c
$(CC) $(CFLAGS) $(INCS) -o testit testit.c $(LIBS)
# don't forget to put a <tab> before $(CC). You can loose this with copy & paste
-----------------------------------------------------------------------
<< Introduction | Documentation | Program - CLI >>