@niivue/niimath
is a JavaScript + WASM library for performing mathemetical operations on NIFTI files. This library is intended to be used in the browser, not in a Node.js environment.
All image processing operations are performed using the WASM build of niimath, making it much faster than a pure JavaScript implementation. The image processing takes place in a separate worker thread, so it won't block the main thread in your application.
The @niivue/niimath
JavaScript library offers an object oriented API for working with the niimath
CLI. Since niimath
is a CLI tool, the API implemented in @niivue/niimath
is just a wrapper around the CLI options and arguments.
For example, the difference of gaussian command niimath input.nii -dog 2 3.2 output.nii
can be executed using the following @niivue/niimath
JavaScript code:
import { Niimath } from '@niivue/niimath';
const niimath = new Niimath();
// call the init() method to load the wasm before processing images
await niimath.init();
// 1. selectedFile is a browser File object
// 2. note the use of the final run() method to execute the command.
// 3. note the use of await. The run method returns a promise that resolves to the output file if the command is successful.
const outFile = await niimath.image(selectedFile).dog(2, 3.2).run();
The @niivue/niimath
library also supports the -mesh
options available in the niimath
CLI. However, the JavaScript API is slightly different from the volume processing due to the use of the -mesh
suboptions.
import { Niimath } from '@niivue/niimath';
const niimath = new Niimath();
await niimath.init();
const outName = 'out.mz3'; // outname must be a mesh format!
const outMesh = await niimath.image(selectedFile)
.mesh({
i: 'm', // 'd'ark, 'm'edium, 'b'right or numeric (e.g. 128) isosurface
b: 1, // fill bubbles
})
.run(outName);
/*
Here's the help from the niimath CLI program
The mesh option has multiple sub-options:
-mesh : meshify requires 'd'ark, 'm'edium, 'b'right or numeric isosurface ('niimath bet -mesh -i d mesh.gii')
-i <isovalue> : 'd'ark, 'm'edium, 'b'right or numeric isosurface
-a <atlasFile> : roi based atlas to mesh
-b <fillBubbles> : fill bubbles
-l <onlyLargest> : only largest
-o <originalMC> : original marching cubes
-q <quality> : quality
-s <postSmooth> : post smooth
-r <reduceFraction> : reduce fraction
-v <verbose> : verbose
*/
To install @niivue/niimath
in your project, run the following command:
# TODO: publish to npm
# npm install @niivue/niimath
Fist, cd
into the js
directory of the niimath
repository.
# from niimath root directory
cd js
To install a local build of the library, run the following command:
npm run build
Then, install the library using the following command:
npm pack # will create a .tgz file in the root directory
Then, install the @niivue/niimath
library in your application locally using the following command:
npm install /path/to/niivue-niimath.tgz
First cd
into the js
directory of the niimath
repository.
# from niimath root directory
cd js
To install the dependencies, run the following command:
npm install
To build the library, run the following command
npm run build
To run the tests, run the following command:
npm run test
To test that the @niivue/niimath
library is working correctly, you can run the following command:
npm run demo