WebMRI is an extensible web-based neuroimaging platform built on top of BrainBrowser. It extends BrainBrowser VolumeViewer with a plugin system, which enables running processing algorithms on the loaded volumes. WebMRI comes with two tools that were ported from C++ to WebAssembly using Emscripten: BET (Brain Extraction Tool) and FLIRT (FMRIB's Linear Registration Tool) of FSL (FMRIB Software Library). The ports are based on FSL version 3.3.11.
The projects consists of app
and fsl
. The app
folder contains the code of the application based on BrainBrowser. It integrates bet2.wasm
and flirt.wasm
.
The fsl
folder contains the FSL 3.3.11 codebase modified so that it builds with Emscripten.
The directory structure of app
is as follows:
/color-maps: It contains the color maps used by BrainBrowser
to render volumes.
/plugin-GUIs: It contains the JSONs of plugin GUIs. GUIs for the plugins are automatically generated based on the JSON.
/src: It contains the JavaScript and asm.js code of the project.
->brainbrowser: It contains all the BrainBrowser
code used for WebMRI
. The main component is VolumeViewer
.
-->/volume-viewer: It contains the rendering logic to show volumes.
--->/plugins: WebMRI
extends VolumeViewer
with a plugin system in which bet2.js
and flirt.js
are defined. The files defined here are the outputs of the Emscripten compilation and can be thought of as the web equivalents of native command line programs.
--->/workers: It contains the web workers needed to run the plugins on worker threads.
--->/volume-loaders: WebMRI
extends BrainBrowser's volume-loaders with dicom.js
, which is an Emscripten port of dicom2nifti. When DICOM files are requested to be loaded in the program, they are first converted to NIfTI and after that are they loaded.
- The plugin has to be able to read input in NIfTI format.
- The plugin has to generate its output in NIfTI format.
- The plugin has to provide a command-line interface.
- Define the plugin in
main.config.js
:
BrainBrowser.config.set("plugins", [
...
{
name: "Name of my plugin",
title: "Title shown on the plugin dialog",
author: "https://link/to/plugin/author/website",
id: "myId",
worker: "src/brainbrowser/volume-viewer/workers/my_worker.js",
gui: "plugin-GUIs/my_menu.json"
}
...
])
- Add a JSON describing the GUI of the plugin, and the command line arguments it handles:
[{
"type" : "infile",
"ext": "nii",
"text" : "Input volume"
},
{
"type": "outfile",
"namebuild": "betted_,%0"
},
{
"name" : "-f",
"type" : "number",
"min" : 0,
"def" : 0.5,
"max" : 1,
"text" : "Fractional intensity thresshold"
},
{
"name" : "-o",
"type" : "bool",
"text" : "Brain outline mask"
}
...
]
- Add a web worker at
src/app/src/brainbrowser/volume-viewer/workers
to invoke your plugin:
//In case of Emscripten ported plugins, this JavaScript is usually the wrapper script that invokes
//the WebAssembly module. See bet2.js and flirt.js for an example.
importScripts("../plugins/my_plugin.js");
self.addEventListener("message", function(event) {
var my_files = event.data;
var MyModule = {
files: my_files,
passBack: function(result) {
self.postMessage(result);
},
arguments: ["-some", "-arguments"]
};
plugin_run(MyModule);
});
- Serve
WebMRI
and see your plugins in action.
Try out WebMRI here!
-
Openening a NIfTI file "File" -> "Open NIfTI" Please note that the NIfTI file to be loaded has to be uncompressed. You can use the test files in the
test_data
folder. -
Opening DICOM series "File" -> "Open DICOM" -> Select all the DICOM slices. Please note that it will take more time to load DICOM than NIfTI, because the system internally converts the DICOM series to NIfTI.
-
Processing the loaded volume
- Select a plugin from the "Tools" menu.
- Select an input volume, then click on "Run". The output file(s) generated by the plugin will be available in the "Workspace" widget on the left side of the screen.
- To further process an output file, move it to the "root" workspace folder by clicking on the blue "up" arrow next to the file name. This way the volume will be visible to plugins, and it can be selected as an input volume.
- Performing linear registration
- Load two input volumes.
- Run the "Brain extration" tool on both of the volumes, one by one.
- Move the generated brain extracted volumes to the "root" "Workspace" folder.
- Open the "Registration tool", and select one of the volumes as reference, the other one as input.
- Click on "Run", and wait for the registration to complete.
- An output file will be generated, and the filename will have the following pattern "input_file_name_to_reference_file_name".
- Move the generated file to the "root" "Workspace" folder and remove the original input volume.
- Select the "Create overlay" menu item from the "File" menu.
- A new slider control named "Blend" will show up in the "Volume controls" widget. You can use it to fade between the input and the reference volume.
- Windowing
You can change the windowing levels by moving the start and end marker of the slider located in the Volume controls widget.
See the LICENSE