A step back in Time[edit | edit source]
MINC was originally written by Peter Neelin back in the dark ages (1992). Here is his original "Justification" for MINC:
We have been using netCDF for over a year now for medical imaging and have found it to be a good basis for a file format in a development environment. It's great when you have to get in and muck around with files; I don't know what it would be like in a commercial environment with image databases, PACS, etc. I say that it is a good "basis" for a format because it does have some limitations, both in general and for medical imaging. We have developed an extension called "minc" (Medical Imaging NetCDF) that tries to overcome these limitations. I'll give you a brief description of the motivation for minc and what it adds to NetCDF. The limitations of NetCDF (in no particular order): 1) No conventions for medical imaging : A pretty obvious one since NetCDF is a general data format, but one still needs to come up with some variable/attribute names and other conventions. 2) Some important areas have unclear or inadequate conventions : The best example is scaling for images. If you put all your images in one byte variable (that is subscripted over time, z, y and x, for example), then NetCDF only allows a global scaling to functional values for all images. Another example would be the inability to specify the fact that pixels in an image are regularly spaced. 3) Low-level interface only : There are lots of things missing from the interface at the low-level (no automatic type conversion, etc.), and there is no high-level interface (can I load a volume in one call?). 4) Lack of generic applications : I gather that they are working on them, but I haven't seen any. There are no medical imaging specific applications. Again, no surprise, but users need them (resampling volumes is perhaps the most used application that we have). What minc gives you: 1) Conventions for medical imaging : Attributes based loosely on ACR-NEMA elements (at least those that I thought were the most important). Dimension names, variable names, etc. Conventions for world coordinates (again based on ACR-NEMA). I haven't yet looked into DICOM (successor to ACR-NEMA), but I expect it to be very similar. 2) More conventions : Image scaling. Extra attributes for dimension variables. Handling of unknown values (e.g. resampled pixels that lie outside the original volume). A scheme for a hierarchical ordering of data in a file. 3a) Medium-level interface (C and Fortran) : Adds useful stuff like type conversion and other simple operations. Routines for simplifying use of some minc conventions. Automatic pixel conversion and image resizing (e.g. I want pixels in the range 0 to 200, regardless of what is in the file; I have an old application that insists on 256x256 images). 3b) High-level interface (C only) : Load a volume. Get voxel-to-world transformation. Macros to get pixel values and/or functional values. General transform routines. Etc. 4) Generic applications : Resampling, header editor, rawtominc, minctoraw, header info, general transform programs. I hope to add some more in the next few months: reshaping the image variable, concatenating files, smoothing images, converting some minc conventions to NetCDF (scaling and dimension coordinates). 5) Not enough documentation yet. (3a) has some documentation, (3b) has no docs, (4) has some. There is no overview or easy introduction. 6) Built and maintained on SGI (Irix 4). Should compile out of the box on SUN (SunOS 4.1.3) (without FORTRAN interface). Compiled on SGI (Irix 5). Compiled on VAX (VMS), but hasn't been tested recently (and no simple build procedure). I don't have access to any other machines (except an IBM RS6000 that isn't running properly), so that's it. I think that someone is giving it a shot on a PC but I haven't heard back (I tried to avoid problems with shorts, ints and longs, but some parts are bound to have problems with MS/Borland compilers - should work with gcc). Because of the lack of documentation in certain areas, I haven't yet made minc available through anonymous ftp. If you are interested, I can make the current version available for you. Some other notes of interest: Now that NCSA HDF has a NetCDF interface I want to look into that (particularly since there is explicit Mac support from NCSA, but not UCAR). The new Xmosaic can read NetCDF headers. NetCDF is really good for machines with IEEE representation, but apparently there are speed problems with CRAYs.
And here is his original sales pitch for MINC:
Minc (Medical Image NetCDF) came out of a frustration with a proliferation of image file formats within our lab. Not only did each modality and scanner have a different format, but almost every programmer had their own. One of the original design goals was to have a format that was general enough to keep all of the programmers and users of different modalities happy. As well, we wanted a standard API so that we could be reasonably sure that programs could exchange data without trouble. The decision was made to build the format around the NetCDF general data format (although it was originally designed for use in the atmospheric physics community, it is a general data format). This format is reasonably simple, extremely general, self-documenting, easily extensible by users and portable. By simple, I mean that the basic data structure is a multi-dimensional array, called a variable. All components of a NetCDF file are named, which means that the format is self-documenting. The variables in a file are related to each other by the use of named dimensions and can have associated attributes (strings or numbers). This simple set of concepts is easily applied to a broad range of data. A standard API ensures that access is only done through names (so the format is easily extended by adding new variables and attributes) and that data are always correctly stored in a form that allows transparent sharing across very diverse machine architectures. Minc adds to this a number of things: First of all, it adds concepts and conventions at a higher level that ensure that data can be exchanged between programs. Simple conventions like how to store patient or acquisition information with standard names (many of these fields have been borrowed from the original ACR-NEMA documentation), and more complex concepts like the distinction between data (voxel) sampling grids and real-world coordinate systems that are independent of images. Beyond that, it adds a medium-level library for facilitating the use of the conventions and for doing things like automatic data conversion and file decompression, a high-level library for encapsulating a whole dataset in a simple internal structure (a volume can be loaded with a single function call), and a series of very general file manipulation programs and generic applications. These applications include conversion from scanner formats, raw data import/export, resampling, averaging, simple math, concatenation, reshaping, lookup table conversions, transform manipulation, coordinate conversion. As well, many specific user applications have been developed: 3D display and manual segmentation, 3D display (tri-slice) for manual registration and image merging (fusion), automatic registration, blurring, statistics (within volume and across volumes), intensity normalization, MRI RF inhomogeneity correction, image simulation, image classification and the list goes on (a dangerous list to make since it inevitably misses things and I risk offending people!). Furthermore, a matlab interface has been developed that allows us to interact easily with the data and which helps speed the development and prototyping of algorithms. We have used minc to store MRI images (3D and 4D), CT images (3D), PET images (3D and 4D), SPECT images, macrocryotome images (very large 3D RGB volumes), voxel labels, voxel probability maps, statistical fields, N-dimensional histograms, images in fourier space, deformation fields, etc. Any N-dimensional grid-based scalar or vector data can be stored in a minc file (NetCDF has a default limit of 32 dimensions and minc requires at least 2 dimensions so that we can talk about an image). Data types include byte, short, long, float and double with conversions done transparently.
Peter Neelin then maintained and coded for the minc library for the next 10 years or more at which point the reins were handed over to the current group of MINC authors.