Code covered by the BSD License  

Highlights from
Tools for NIfTI and ANALYZE image

4.66667

4.7 | 49 ratings Rate this file 765 Downloads (last 30 days) File Size: 426 KB File ID: #8797
image thumbnail

Tools for NIfTI and ANALYZE image

by

 

23 Oct 2005 (Updated )

Load, save, make, reslice, view (and edit) both NIfTI and ANALYZE data on any platform

| Watch this File

File Information
Description

Please always check NIfTI_tools.pdf for detail descriptions and latest updates.

If you are confused by the Left / Right of an ANALYZE image, please read UseANALYZE.pdf.

You may also want to go through FAQ.pdf for practical solutions and real examples.

Basic Programs:

1. load_untouch_header_only.m: Load only the header section of NIfTI or ANALYZE file. The input file will be automatically detected. NIfTI structure will be returned for NIfTI file, and ANALYZE structure will be returned for ANALYZE file.

2. load_nii.m: Load N-Dimensional NIfTI file (where N can be from 3 to 7) or ANALYZE file (where N can be from 3 to 4), and apply header info (e.g. affine geometric transform, voxel intensity scaling, etc.) to the data. If your file has more than 3-Dimension (e.g. time series etc.), you can also specify a range to extract only 1 or several volumes.

3. save_nii.m: Save N-Dimensional NIfTI structure (where N can be from 3 to 7) that is loaded by "load_nii.m" or made by "make_nii.m" into a NIfTI file.

4. make_nii.m: Make N-Dimensional NIfTI structure (where N can be from 3 to 7) based on the N-Dimensional matrix and other optional parameters (e.g. voxel_size, origin, etc.). Using "save_nii" command, the NIfTI structure that is made by "make_nii" can be saved into a NIfTI file.

5. make_ana.m: Make 3D ANALYZE structure based on the 3D matrix and other optional parameters (e.g. voxel_size, origin, etc.). Using "save_untouch_nii" command, the ANALYZE structure that is made by "make_ana" can be saved into an ANALYZE file in order to be compatible with some ANALYZE only programs.

6. reslice_nii.m: Re-sample 3D (or 4D) NIfTI file, or ANALYZE file with affine matrix M in .mat file, and save the re-sampled data into a new NIfTI file. The program will base on the affine matrix, which is especially useful for oblique images with non-orthogonal rotation or shearing that cannot be loaded with "load_nii.m". You can also specify voxel_size, etc. It will not cause negative effect, as long as you remember not to do slice time correction after using "reslice_nii.m".

7. pad_nii.m: Pad the volume(s) in NIfTI structure from any of the six sides, while keeping the originator, voxel size, data type, and description unchanged. The program is especially useful after you use reslice_nii, since the new volume will most likely have different dimensions.

8. clip_nii.m: Clip the volume(s) in NIfTI structure from any of the six sides, while keeping the originator, voxel size, data type, and description unchanged. The program is especially useful after you use reslice_nii, since the new volume will most likely have different dimensions.

9. view_nii.m: View & Edit 3D (or 4D) NIfTI or ANALYZE structure that is loaded by "load_nii.m" or made by "make_nii.m". Activation map, ROI, etc. can be overlaid on top of a background image (see above picture). Plotted view can be embedded into your existing figure window. If you use it as an individual program, it can also edit the orientation and voxel value of the image, view volume histogram, and save the modified image.

10. load_untouch_nii.m: Load N-Dimensional NIfTI file (where N can be from 3 to 7) or ANALYZE file (where N can be from 3 to 4), but do not apply any changes that are indicated in the header. WARNING: Do not use "view_nii.m" to view the structure that is loaded by "load_untouch_nii.m".

11. save_untouch_nii.m: Save N-Dimensional NIfTI structure (where N can be from 3 to 7) or ANALYZE structure (where N can be from 3 to 4) that is loaded by "load_untouch_nii.m" or made by "make_ana.m" into a new NIfTI or ANALYZE file. If you do not modify the loaded dataset, the header and data in the new saved file should be the same as those in the original file.

Other Programs:

1. collapse_nii_scan.m: Integrate multiple single-scan NIfTI or ANALYZE files into a multiple-scan NIfTI file.

2. expand_nii_scan.m: Break a multiple-scan NIfTI file into multiple single-scan NIfTI files.

3. save_untouch_slice.m: Save back to the original image with a portion of slices that was loaded by load_untouch_nii. You can process those slices matrix in any way, as long as their dimension is not altered.

4. get_nii_frame.m: Return the number of time frames of a NIfTI file.

5. flip_lr.m: Flip NIfTI or ANALYZE file Left-Right along the plane across the originator, and save the L-R flipped data into a NIfTI file. WARNING: Please use this program with caution, although you can always flip it back.

6. load_nii_ext.m: Load header extension from a NIfTI file.

7. mat_into_hdr.m: Integrate affine matrix in old SPM .mat file into its .hdr header file. Thus, the ANALYZE file is converted into a NIfTI file with the updated .hdr header file.

Acknowledgements

Mri Analyze Tools inspired this file.

This file inspired Seconds To Hours, Minutes, Seconds, Composite Image, Create Mosaic.M, Field Mapping Toolbox, Function For Viewing Mri Slices, A Gui To Load And View .Nii Files., Dicom To N If Ti Converter, Generate Synthetic F Mri Data, Siemens Dicom Sort And Convert To N If Ti, 3 D N If Ti Data Viewer, Bipolar Colormap, Rapid: A Routine Assurance Pipeline For Imaging Of Diffusion, and Visualization Of Multi Modal Volume Segmentation.

MATLAB release MATLAB 5.3.1 (R11.1)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (146)
23 Sep 2014 kb  
02 Aug 2014 Jeremy Manning

incredibly useful and well written toolbox. what a service!

22 Jul 2014 Jing

Thanks so much!!!

11 Jul 2014 Shantanu

I came across your MATLAB code on loading and viewing .nii files. I am presently working on brain mapping and brain imaging of Autism patients. I have got the mri images of patients from ABIDE database. But I am really new to MATLAB. I am not able to understand how this code will work. It says to replace the filename with the name of file, I did the same. But I guess it needs some more editing so that i could use it. Could you please help me out as in how to use this code.

26 Jun 2014 Yi Sui

Great work!
I updated it a little bit and added a few new features.
Please check
http://www.mathworks.com/matlabcentral/fileexchange/47072-3d-nifti-data-viewer

20 Jun 2014 Christian  
20 Jun 2014 Christian

thank you very much for this useful tool!

03 Jun 2014 Paul Groot

Hi Sangeetha,

About the LAPACK loading error: (dlopen: cannot load any more object with static TLS)

This is a known issue on linux systems with matlab versions R2012b and higher, and is not related specifically to this toolbox:

http://www.mathworks.de/support/bugreports/961964

It seems there is a new workaround, but a previous suggestion was to add the following line to startup.m:

ones(10)*rand(10);

This makes sure that the relevant libraries are loaded at startup, which did the trick on our systems.

Paul

02 Jun 2014 Sangeetha

Hi, Thanks for this useful work. When I try to load an nii file, I get the error I copied below. What could be the problem?

Error using det
LAPACK loading error:
dlopen: cannot load any more object
with static TLS

Error in xform_nii>change_hdr (line
327)
if det(R) == 0 |
~isequal(R(find(R)), sum(R)')

Error in xform_nii (line 154)
[hdr,orient]=change_hdr(hdr,tolerance,preferredForm);

Error in load_nii (line 185)
nii = xform_nii(nii, tolerance,
preferredForm);

25 May 2014 Xenios

Hi, and congrats on your amazing work here.
I apologize if something similar has been asked before. I have stacks of 16 grayscale slices in tif format, and want to convert them into the nii format. How can I do this? Thanks.

14 Feb 2014 Jimmy Shen

you can't do it. check faq.pdf when you need load_untouch_nii or load_nii

13 Feb 2014 Israna

how can i view the image that is loaded by "load_untouch_nii.m"?

12 Feb 2014 Jimmy Shen

because it's not the business of view_nii to interpret and apply header info.

12 Feb 2014 Israna

Thanks the code is a great help.

But could you please help me understand why I can't use "view_nii.m" to view the structure that is loaded by "load_untouch_nii.m"? and how can I view that?

Thanks

03 Feb 2014 Claire

Sorry, I find it, thank you for the amazing functions

29 Jan 2014 Luke Xie

great functions
thanks for the update

31 Dec 2013 Jimmy Shen

Nicolas, please tell me what is the exact "clues" or "messages" that confuse you. In addition, please tell me what you try to do.

31 Dec 2013 Nicolas Yu

the view_nii not work so well.
The example you give is quite well, but to my big data, it gives clues to use load_nii.m when I am using load_untouch_nii.m, but to use load_untouch_nii.m when I am using load_nii.m. why ?

19 Nov 2013 Jimmy Shen

You can use "load_untouch_nii / save_untouch_nii" pair. Here's an example:

nii = load_untouch_nii('avg152T1_LR_nifti.nii');
nii.hdr.hist.descrip = 'Mengye';
save_untouch_nii(nii, 'new_avg152T1_LR_nifti.nii');

Unless you touch nii.img by yourself, e.g. nii.img(1)=0, it will not be changed, although it is also loaded and saved. Only the header (nii.hdr) is edited in the way you make the change.

In addition, if the input file is in Analyze 7.5 format, the output will be kept in Analyze 7.5 format. If the input is in NIfTI format, the output will be kept in NIfTI format.

That is why I have "load_untouch_" as well as "load_" feature. However, in most case, you want to use "load_" feature, since you don't want to interpret affine matrix in the header, and make all sorts of flipping and rotation by yourself, do you?

19 Nov 2013 mylyu

Hi, Jimmy

Are there ways to load, edit and save .hdr without doing things to .img? Because I found SPM changed my source files headers every time doing co-registration, and I want to change it back. It seems save_nii_hdr() is an internal function and I tried using it but broke my nifti files.

Thank,
Mengye

05 Jul 2013 NH

Perfect! Thank you!

05 Jul 2013 Jimmy Shen

Data for "plot" only contain the coordinates information, while data for "make_nii" need intensity value which is assumed to be distributed on a grid with its coordinates from 1 to the dimention of the grid. In addition, unlike plot, coordinates for images contain only the integer. Therefore, you cannot directly extract the data from a plot and make it to an image.

Export your plot data to an image would be an easy alternative. I think you already did good. All you have to do is to hide the background image and the axes before you export the plot to an image. Here's how to do so:

1. Before export, use mouse click your plot (make it active);

2. Hide the axes by running:

set(gca,'visible','off');

3. Hide the background image by running:

h = get(gca,'child');
for i=1:length(h)
if strcmpi(get(h(i),'type'),'image')
set(h(i),'visible','off');
end
end

4. Export the plot to an image. Now it does not have the background and axes.

05 Jul 2013 NH

Thank you very much for this useful product. I do have a question, if anyone could help me out...

I loaded a .nii file, did some processing and have a new plot that I would like to extract data from and ultimately save as .nii. It is a simple plot that was a result of finding the boundaries of an object. I extracted the data from the plot and entered it into a cell, but the "make_nii" function does not support this datatype. I tried converting the cell to a .mat, but that did not produce a satisfactory result either. I also tried saving the plot as an image and then using "make_nii," which worked, but the result included the border and axes of the image. I want only the data, without the background or axes. Does anyone have any suggestions?

25 Jun 2013 Orestis  
28 May 2013 Guilherme Coco Beltramini  
14 May 2013 Jimmy Shen

"collapse_nii_scan" is used to integrate multiple single-volume NIfTI or ANALYZE files into one multiple-volume NIfTI file. In your case, if you want to concatenate two 4D NIfTI images into one 4D NIfTI images, you should apply "expand_nii_scan" to your both 4D images. All volumes must be in the same folder, and make sure the file name is correctly renamed (i.e. from 001~999 instead of 1~999). Then, apply "collapse_nii_scan" to all those expanded volumes in the specific folder, and you will get a concatenated 4D NIfTI image file.

14 May 2013 Rodolphe

Hello, i tried to concatenate two 4D nifti images using collapse_nii_scan but that gives me an image with just 2 volumes. Am i missing something?

02 May 2013 Edgar Guevara  
18 Oct 2012 Berkin Bilgic  
14 Sep 2012 Jimmy Shen

Hi Zhi:

"collapse_nii_scan.m" will do the job.

Hi Samiy:

This tool can not be used to extract spinal cord. However, once you extracted it and saved into another Analyze/NIfTI file, this tool can load the data into MATLAB for further processing.

11 Sep 2012 Zhi

In FSL, there is a tool called avwmerge, which binds several hdr or nii files into a single hdr or nii file. Some existing applications only use the single hdr/nii file as input. Could I find similar function in your tool box? Many thanks.

11 Jul 2012 Jimmy Shen

Received the image, and it is a special RGB data type one. The nii.img ranges from 0 to 1 as usual, but the output value needs to be scaled by (glmax-glmin)+glmin.

10 Jul 2012 Jimmy Shen

Would you please send me this image, so I can take a look into it for you tomorrow afternoon.

10 Jul 2012 Xiaoying Tang

Hello,
This package works very well for my research. Thanks first. But now I have a problem with vector image. I want to change the pixel value of a xyz vector image by taking its absolute values. I first used: nii = load_nii(1_xyz.img), if I use view_nii(nii), I found everything correctly. Moving the crosshair to 139,63,91, I can read the value is (-0.1784,0.8963,0.3663), which is correct. But if I used: a = nii.img; a(139,63,91,1:3), it will display values as 0.35555,0.9434,0.6535. It seems that the value of a is always positive. I tried to use nii = load_untouch_nii(1_xyz.img); a = nii.img; It has the same positive value.
Do you have any suggestion about this inconsistency between the value of nii.img and that displayed by view_nii(nii)?
Thanks a lot.

10 Jul 2012 Xiaoying Tang

Hello,

This package works very well for my research. Thanks first. But now I have a problem with vector image. I want to change the pixel value of a xyz vector image by taking its absolute values. I first used: nii = load_nii(1_xyz.img), if I use view_nii(nii), I found everything correctly. Moving the crosshair to 139,63,91, I can read the value is (-0.1784,0.8963,0.3663), which is correct. But if I used: a = nii.img; a(139,63,91,1:3), it will display values as 0.35555,0.9434,0.6535. It seems that the value of a is always positive. I tried to use nii = load_untouch_nii(1_xyz.img); a = nii.img; It has the same positive value.

Do you have any suggestion about this inconsistency between the value of nii.img and that displayed by view_nii(nii)?

Thanks a lot.

02 May 2012 Mark

Thanks, that's exactly what I wanted to know!

30 Apr 2012 Jimmy Shen

Sure Mark. You need a reference image by the way, so you can see what will happen before and after you apply the transformation matrix. Here's the example:

1. Download "avg152T1_RL_nifti.nii" from NIfTI site. I use it as reference image.

2. View how the reference image looks like: nii=load_nii('avg152T1_RL_nifti.nii');
view_nii(nii);

3. Assume that I have a Transformation Matrix, which will let the reference image turn 30 degree counter-clockwise on XY plane, here will be the matrix: T=[cos(pi/6) -sin(pi/6) 0; sin(pi/6) cos(pi/6) 0; 0 0 1];

4. Get old_xyz from reference image: rl=load_untouch_nii('avg152T1_RL_nifti.nii');
old_xyz=[rl.hdr.hist.srow_x(1:3);rl.hdr.hist.srow_y(1:3);rl.hdr.hist.srow_z(1:3)];

5. Apply your transformation matrix, and save new_xyz into a new image: new_xyz=T*old_xyz; rl.hdr.hist.srow_x(1:3)=new_xyz(1,:); rl.hdr.hist.srow_y(1:3)=new_xyz(2,:); rl.hdr.hist.srow_z(1:3)=new_xyz(3,:); save_untouch_nii(rl, 'rl30.nii'); Now you already have the "rl30.nii", which is a transformed NIfTI image can be used anywhere.

6. In order to view this image using my toolbox, you need to reslice it: reslice_nii('rl30.nii', 'rl30b.nii'); Now, you can load and view the rotated image: rl30b=load_nii('rl30b.nii'); view_nii(rl30b);

Hopefully this answers your questions.

30 Apr 2012 Mark

Hello,

Is it possible to use reslice_nii to apply a transform to a nifti volume? for example, if I have a transformation matrix that is the result of a 3D coregistration of a functional with an anatomical volume, could I use reslice_nii to apply that transformation matrix to the functional volume to transform it into anatomical space? If so, any chance of some example code?

Thanks very much for the useful code.

23 Apr 2012 Wannabegeek  
19 Apr 2012 Jimmy Shen

To reply your first comment: The problem is that you mixed "make_nii" with "_untouch_" version. If you use "make_nii" to get NIfTI structure, it has to be saved using "save_nii".

To reply your second comment: If you know NIfTI structure well, sure you can modify it and then use "save_nii" to save it. You can even save "non-orthogonal" NIfTI structure to the file with "save_nii".

The reason that I interpret the header with "load_nii" and limit it to "orthogonal" transformation is all about convenience, at least for my work.

BTW, if you take the original NIfTI file, and bring it to other software to display (e.g. SPM), they will also reslice it for you.

Thank you very much for your rating!

19 Apr 2012 Wannabegeek

I think I figured it out.

I read your updates and realized that the untouch option doesn't load the Transformation matrix, so by adding one I was changing the header.

I resolved by cloning the header and using save_nii()

If you are wondering why I didn't use load_nii(), it is b/c ,y data has non-orthogonal transforms and the open tool wouldn't work.

BTW, I think this behavior maybe unjustified. And the advice to reslice is considered a bad idea in my lab, b/c of interpolation artefacts.

19 Apr 2012 Wannabegeek

Hi Jimmy,

I am having an issue using save_untouch_nii().

I load a nifti 4D data set with load_untouch_nii(), make no changes, then try to save with save_untouch_nii() and get a failure with the message:Usage: please use 'save_nii.m' for the modified structure.

I even tried cloning the hdr before the save.

nii = load_untouch_nii('foo.nii');
data = nii.img;
%data = data + 10;
nii_mod = make_nii(data);
%nii_mod.hdr = nii.hdr;
save_untouch_nii(nii_mod,'test1.nii');

15 Apr 2012 Andrew Davis  
01 Mar 2012 Jimmy Shen

Got your data, and did the following test using "analyze75read" "load_untouch_nii" and "load_nii", here the results:

a1=analyze75read('dxx.img');
max(a1(:)), get 3.3943e-08

a2=load_untouch_nii('dxx.img');
max(a2.img(:)), get 3.3943e-08

a1=load_nii('dxx.img');
max(a1.img(:)), get 3.3943e+04

check: a2.hdr.dime.roi_scale
get 1.0000e+12

You told me that you got a voxel value of 1.089e+12 using "analyze75read". I cannot duplicate your result.

01 Mar 2012 Michael

Hi Jimmy. I think i understood correctly your tool and i did use "load_nii" indeed. I am sending you the data.

29 Feb 2012 Jimmy Shen

Without more detail, I cannot duplicate your problem. Please send me your data that indicates it. On the other hand, I wish you could take a look at my web page to better understand this tool. In order to display, you must use "load_nii" instead of "load_untouch_nii". i.e. your data is interpreted properly (touched). There could be many cases, e.g. scale factor is specified in the header file, your data has different orientation, etc. However, in no situation it treats double datatype differently.

29 Feb 2012 Michael

My first post was not submitted. I was saying that the programme failed to display correct values of Analyze files with double datatype. Matlab analyze75read works without problems.
Do you have any idea why is this?

29 Feb 2012 Michael

PS: for example instead of the correct voxel value 1.089e+12, this programme will display 988.1

17 Jan 2012 Jimmy Shen

I never have such a function called "read_nii_img". Please read all functions and usages from:

http://www.rotman-baycrest.on.ca/~jimmy/NIfTI

17 Jan 2012 Jessica Bernard

I've found recently, now that we have upgraded to Matlab 2011a, that many of these functions no longer work properly. When using read_nii_img we are now getting an error saying:

??? Undefined function or method 'read_nii_img' for input arguments of type 'char'

We had successfully run these programs before, but since the update they have not been working. Do you have any suggestions to perhaps work around this? Thanks much!

19 Dec 2011 Jimmy Shen

It seems that "load_nii_hdr" in "apply_fsl_transformation_matrix" has been modified. It should look like this "function [hdr, filetype, fileprefix, machine] = load_nii_hdr(fileprefix)". i.e. It should have 4 output arguments, which is exactly the same amount as "load_untouch_nii" asked for.

19 Dec 2011 Michael

Hi,

using 'load_nii_hdr' within 'load_untouch_nii' I get the following error message:

??? Error using ==> load_nii_hdr
Too many output arguments.

Error in ==> load_untouch_nii at 103
[nii.hdr,nii.filetype,nii.fileprefix,nii.machine] = load_nii_hdr(filename);

Error in ==> apply_fsl_transformation_matrix at 5
vox = load_untouch_nii('/SCR2/DTI/det_track/BM3K/trans/Sem_fun_roi.nii');

Thanks for your help!

Michael

16 Dec 2011 Jimmy Shen

NIfTI supports both ".nii" and ".img/.hdr" file extension. If you do not provide any file extension, it will look for ".img/.hdr" files by default. Therefore, you can easily solve your problem by provide appropriate file extension. e.g. nii = load_nii('filtered_func_data.nii');

16 Dec 2011 Galit

Hi,
Trying to load a .nii file, I got a message:
Cannot find file "filtered_func_data.hdr"
The problem apparently lies in the fact that we don't have a separate header file. Is there a solution other than converting it to .hdr and .img?
Thanks!

21 Oct 2011 David N  
20 Oct 2011 Jimmy Shen

I assume that you have a series of 3D NIfTI (or Analyze) files with the same header information (i.e. same dimension, voxel size, originator, ... etc.), and you want to integrate it into a single 4D file with time series in the file.

If this is the case, you can use my "collapse_nii_scan.m" to do so. Type help collapse_nii_scan to get more information.

For file extension, this function will follow whatever you have. i.e. you will still get a single .hdr/.img file afterwards.

Since all NIfTI compatible software should be able to load a 4D NIfTI (or Analyze) file, we do not support any conversion from .hdr/img to .nii file.

20 Oct 2011 Lirong TAN

Hi,

I want to convert a series of .hdr/.img files into one single .nii file. How can I achieve this? Thanks a lot.

31 Aug 2011 Jimmy Shen

You are not supposed to use "load_nii_hdr.m" & "load_nii_img.m". Both are internal functions, and are not supported when you call them directly.

If you want to take look at the header information, please use "load_untouch_header_only.m".

If you would like to change the voxel value, please use "load_nii.m" to load the NIfTI file, and then use "view_nii.m" to edit voxel value at crosshair (under "Edit" tab), and then click "Save displayed image" under "File" tab.

The reason of inconsistency in your case is caused by the scaling factor in the header that was not properly interpreted by yourself.

31 Aug 2011 Priya

Hi
I am using Tools for NIfTI and ANALYZE image. It is really helpful and my sincere thanks to share your work for the research community.

I am using the images in .hdr and .img format. I am trying to change the pixel value 1 into 5 and then save it as .img. I viewed the saved images using the function view_nii. I could find the pixel value as 5, which i did. But if i open these images in viewer like MRIcroN and FSLVIEW it shows a pixel value as 0.01961. I could not find the reason. Can you please help me in finding the solution to the above problem. I can see that GMax of the output image is 5. But for the input image it is 0.
I have put the lines of code which were used by me.

I would like to send my input file, so it would be better to know my issue. Please let me know a way to send my input file.

[nii1.hdr,nii1.filetype,nii1.fileprefix,nii1.machine] = load_nii_hdr('1sub_110_A-128_5med');
[nii1.img,nii1.hdr] = load_nii_img(nii1.hdr,nii1.filetype,nii1.fileprefix,nii1.machine);
z=find(nii1.img); %number of index---4610
img1=zeros(size(nii1.img));
img1=uint8(img1);
img1(z)=5.00000;
nii1.img=img1;
save_nii(nii1,'out1.img');

Thanks in advance for your help

30 Aug 2011 Jimmy Shen

This is because those parameters & scaling have been interpreted & applied to the image. It is what NIfTI loader supposed to do.

If you want to interpret header by yourself, feel free to try the following commands:

x = load_untouch_nii('b0.hdr');
save_untouch_nii(x, 'b0xx.nii');

For more details, please carefully read all the instructions through, which can be found on my web page:

http://www.rotman-baycrest.on.ca/~jimmy/NIfTI

30 Aug 2011 Zhi

I tried converting an HDR image to a nifti image by using two functions in the package
x = load_nii('b0.hdr');
save_nii(x, 'b0xx.nii');

And then I compare the Q Offsets, affine parameters and Calibration Scaling before and after the conversion. However, they are almost completely different. Is it possible to do the conversion without affecting these parameters?

30 Jul 2011 Jimmy Shen

First, when you use 'save_nii.m', the file that you saved will always be in NIfTI instead of Analyze format.

Second, use 'load_untouch_nii' to load both original Analyze file and saved NIfTI file, and check what is the dimension size and data type of '.img' field.

Finally, I have tested to use 'load_nii.m' to load many Analyze and NIfTI files and then use 'save_nii.m' to save into NIfTI files. I did not find data size "increase remarkably". If it is possible, please upload your original Analyze data to somewhere that I can access, and email me the link (DO NOT USE EMAIL ATTACHMENT), so I can try to duplicate your problem.

By the way, I will not be available until Aug 2.

30 Jul 2011 yang liu

Dear everybody:

I have found the following problems in the using this toolbox.
I can get the data in the analyze format file with 'load_nii.m'.
But when I save the data to analyze format file with 'save_nii.m' without any change, the data size increase remarkly.

28 Jun 2011 Tyler

I downloaded the new program, so I now get a different error suggesting what you just mentioned.

However, reslicing is not an option, as we were using SPM to register images in the first place, so we need the NIFTIs in the current space they are in (I will work on getting images to you, but I don't know if that is a possibility at this point).

28 Jun 2011 Jimmy Shen

First, both "load_nii" & "load_untouch_nii" support SPM NIfTI images. As a matter of fact, there is only one NIfTI standard, all NIfTI compatible software should comply with that standard.

Second, in order to duplicate the error, please upload that image onto anywhere that I can have read access. PLEASE DO NOT SEND BY EMAIL ATTACHMENT.

As you have noticed, NIfTI images can be in any spatial orientation, while "load_nii" can only have 48 orthogonal orientations. In that case, the program will prompt you to use "reslice_nii" to interpolate the image. Since you did not get the appropriate prompt, I am interested to take a look at the image that you are loading.

Please check my NIfTI web page for more details:

http://www.rotman-baycrest.on.ca/~jimmy/NIfTI

28 Jun 2011 Tyler

Edit: error here

load_nii(pathTo.imgFile)
**??? Error using ==> xform_nii>change_hdr at 236
Transform of this NIFTI data is not supported by the
program**.

Error in ==> xform_nii at 90
[hdr orient] = change_hdr(hdr);

Error in ==> load_nii at 71
nii = xform_nii(nii);

28 Jun 2011 Tyler

Mr Shen,

I have had good success in general with this package; however, in dealing with SPM NIFTIs (http://www.fil.ion.ucl.ac.uk/spm/) I cannot load with load_nii.

I must use load_untouch_nii, however, when I use this, the NIFTIs are in a random spatial orientation, with the image matrix needing to be flipped and/or rotated to be in correct orientation.

Do you know a way to fix this?? It is greatly slowing my research :/

Thanks!

Tyler

20 May 2011 Navid Samavati

Yes, and now that you mentioned sometimes the old analyze format it is read as [0 0 0] it makes more sense. I think that's probably my case.

20 May 2011 Jimmy Shen

Have you read:
http://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields as I mentioned?

As you can see, "origin" in NIfTI is expressed in sform or qform. When you use "load_nii", you should find it under: hdr.hist.originator(1:3)

Sometimes, with old ANALYZE image, the value is [0 0 0] which does not make sense, then you have no choice but use: hdr.dime.dim(2:4)/2.

Hope this helps.

20 May 2011 Navid Samavati

Thanks for your response!

By start position, I mean the origin (x,y,z). I couldn't find the origin of my image data anywhere in the header structure in MATLAB.

20 May 2011 Jimmy Shen

The start positions for x, y, z are all 1. i.e. XYZvoxal=[1 1 1] is the place to start.

Please also check NIfTI header fields at:
http://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields

and let me know whether I understand your question correctly.

20 May 2011 Navid Samavati

Hi Jimmy,

I can't find the start position of the pixels or voxels in x, y , and z directions in the header structure. I read my analyze image using load_nii. The image is fine. I just don't find the start position.

Thanks,
Navdi

13 Apr 2011 Jimmy Shen

Here's an example:
nii = load_nii('mydata.img',vol_id);
slice = nii.img(:,:,slice_id);
slice=round(63*(slice-min(slice(:)))/max(slice(:)))+1;
imwrite(slice,jet,'myslice.jpg');

13 Apr 2011 Whemberton

Hi Jimmy. Really it's a very nice code.

I have a question. How can i do to extract a single slice of a 4D nifti brain volume and save it into a regular image file (i.e.: jpeg, bmp...), using a common color map (i.e.: ge_color)??

Thanks for attention.

W.

29 Jan 2011 Victor Alchanatis  
03 Aug 2010 Jimmy Shen

You may not notice the tolerance argument in "load_nii". By default, we allow no more than 10% of distortion. You can set it to 0, you will be prompted to use "reslice_nii" to interpolate the image.

If you just want to change negative value and NAN value to 0, you can simply use "load_untouch_nii" and "save_untouch_nii" pair to do the job.

02 Aug 2010 Xiaoying Tang

Hi Jimmy,

I have some problem. My goal is to change the negative value and the NAN value in an image into 0 and then save it as .nii. I used the load_nii program and then changed the value into 0, and then used the save_nii. Everything seemed to be fine. But I finally found that the FOV of the image changed a little from: Field of VIew-Width: 204; Field of View-Height: 256; Slice Thickness:1 to Field of View-WIdth:203.992; Field of View-Height:255.909;Slice Thickness: 0.99968. But the image dimensions remained the same. Do you understand what I mean? I mean the voxel size changed. Could you please have a look at this problem? It is very strange.

Thanks a lot.
Xiaoying

31 Jul 2010 Xiaoying Tang

Hi Jimmy,

I have some problem. My goal is to change the negative value and the NAN value in an image into 0 and then save it as .nii. I used the load_nii program and then changed the value into 0, and then used the save_nii. Everything seemed to be fine. But I finally found that the FOV of the image changed a little from: Field of VIew-Width: 204; Field of View-Height: 256; Slice Thickness:1 to Field of View-WIdth:203.992; Field of View-Height:255.909;Slice Thickness: 0.99968. But the image dimensions remained the same. Do you understand what I mean? I mean the voxel size changed. Could you please have a look at this problem? It is very strange.

Thanks a lot.
Xiaoying

17 Jun 2010 Xiaoying Tang

Jimmy,

I solved the problem. Thanks a lot.

Best,
Xiaoying

17 Jun 2010 Jimmy Shen

First, you don't have to use "make_nii", which just creates a NIfTI struct for you based on your N-D matrix.

Second, make_nii supports float data. Type help make_nii for more details. Did you receive any error message?

17 Jun 2010 Xiaoying Tang

Hi Jimmy,

Thank you very much for your scripts. They are really useful.

Now I want to read some nii file and set the pixel value which is below zero. I first load the nii file and then change the value. Now I need to save it back into nii file. I guess I first should make_nii, and then save_nii. But it seems that make_nii doesn't support float data type. Do you have good suggestion?

Best,
Xiaoying

15 Jun 2010 Jimmy Shen

Hi Juan:

You can check "Question about overlay" category under:
http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/FAQ.htm
There are several questions and answers in this topic.

You said that you have the x,y and z directions of each voxel. The x,y and z directions must be converted into the index regarding to the first voxel. Probably, you already have the brain region that represents the eigen image. Let's assume that you have it in a binary image called "brain_mask.nii", while the anatomical image is called "ana.nii". Here's what you can try:

1. Use "ana = load_nii(ana.nii)" to load the anatomical image, and make sure that variable "ana.img" is either in "single" or "double". If not, use step 2 to convert it.

2. To convert variable "ana.img" to "single", you need to use "make_nii" command: "ana = make_nii(single(ana.img), ana.hdr.dime.pixdim(2:4), ana.hdr.hist.originator(1:3))".

3. Use "mask = load_nii(brain_mask.nii)" to load the brain
mask image, and assign value and index to "opt" struct: "opt.setvalue.idx = find(mask.img); opt.setvalue.val = eigenvector;". You can see more detail to use "setvalue" by command: "help view_nii".

4. Add other values to "opt" struct: "opt.command = 'init'; opt.useinterp = 0;".

5. Plot eigen image with underlaid background by command: "view_nii(ana, opt);".

6. Don't click "interp on/off" menu. It doesn't work properly. If you would like to see the interpolated one, use: "opt.useinterp = 1; view_nii(ana, opt);" instead.

If you still have question, please feel free to ask me.

Jimmy

15 Jun 2010 Juan

Hi Jimmy.
Thank you very much for this extremely useful toolbox.
My question is about how to overlay in the image. I need to overlay the principal eigenvector of each voxel on the image; I have the x,y and z directions of each voxel in a matlab array already but I want to know how can I display over the same image or if its possible to modify your code to keep just the principal image and get rid of all the options that you gave like color and position of crosshair, etc. because I mainly need to show the image and display the eigenvectors over it.
Thanks,
Juan

04 Jun 2010 Jimmy Shen

Hi Preeti:

1) That's right, it does not support .avw format. So please save it in .hdr/.img or .nii format before you open them in MATLAB.

2) 300 slices should be okay on many new computers. If your computer cannot hold this much data in its memory, you may want to take 1 or several slices at a time to analyze. This feature was implemented on Jan. 6, 2010.

04 Jun 2010 Preeti

I am using AnalyzeDirect Software for lung cancer detection and retrieval. i have segmented the lungs from chest CT scan of more than 300 slices (DICOM). I have saved the result in .avw format as well as in Analyze7.5 format. Now when i tried to open these files in MATLAB i got these problems

1) the code only suppports 'hdr/.img' format i.e Analyze7.5 format. i was not able to load .avw file
2) as no. of slices are more than 300 it gives 'Out of Memory' error when i opened '.hdr/.img' data.

how to resolve these two problems. Please help!

26 Jan 2010 Jimmy Shen

Hi Anne-Lene:

Don't worry. The following tips will give you some more help.

If you did not see difference after using "expend_nii_scan', it means that you only have 1 scan (1 volume) in your file. Since you said "...look at the nifti images separatley...", I thought you have several images (volumes or scans) in 1 file, and would like to treat them separately.

The first step you need to do is to load your image into MATLAB by "load_nii" command (Please look at "help load_nii" before using it).

Let's say you have an image "file1.nii" (or "file1.img/hdr"). By command:
nii = load_nii('file1.nii');
or
nii = load_nii('file1.img');
You can get a 3D matrix in "nii.img", and its header information in "nii.hdr".

You mentioned that you would like to change the image into another datatype. Here's how:

You can either change the header information directly (if you are familiar with the NIfTI header) then use "save_nii", or to use "make_nii" to create a new NIfTI structure (like nii).

For example:
datatype = 16; % change datatype to float32
nii2 = make_nii(nii.img, nii.hdr.dime.pixdim(2:4), nii.hdr.hist.originator(1:3), datatype);
save_nii(nii2, 'file2.nii'); % either to use nii ext
save_nii(nii2, 'file2.img'); % or to use img/hdr ext
By doing this, you changed it to Float32 data type, and saved it into "file2.nii" (or "file2.img/hdr").

If you have a MATLAB algorithm that you made by yourself as you mentioned, I think you will be more interested in the img matrix ("nii.img"). The "nii.hdr" is the header information to describe how "nii.img" is oriented, what is the voxel size, and originator, and many more.

Finally, I have to correct you that "make_nii" will not convert image to any extension. It only makes a NIfTI structure from N-D matrix and some other parameters (voxel size, originator, data type, etc.). Please double check the help, and make sure that you know how to use it.

If you have further question, please be more specific (e.g. make a point list), so I know how to help you.

Jimmy

26 Jan 2010 Anne-Lene

I have looked at those links and tried expand_nii_scan, and I'm afraid I still don't understand. My file has the nii extension and when I use expand I get another nii file, I don't see the difference between that and my original file, when I use view_nii.

I saw that using make_nii I could convert images with the img/hdr extension, but I couldn't get it to work on my file with nii extension.

Anne-Lene

25 Jan 2010 Jimmy Shen

Hi Anne-Lene:

No questions are stupid.

Yes. You can use my tool to look at NIfTI images separately and also convert them to another datatype.

Since NIfTI supports both img/hdr and nii extensions, so my tool supports any of them.

Most help can be obtained by using help command. e.g. help make_nii.

There are several other resources that you can get help:
http://www.rotman-baycrest.on.ca/~jimmy/NIfTI
http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/FAQ.htm
http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/examples.txt

Command "expand_nii_scan" is used to break a multiple-scan NIfTI file into multiple single-scan NIfTI files, so you can look at them separately.

If you want to convert img data type, you can use "save_nii" after use "make_nii" command. If you are familiar with NIfTI structure, you can modify "hdr.dime" directly, and then use "save_nii" to save.

If you have further question, please make it more specific, so I can help you.

Jimmy

25 Jan 2010 Anne-Lene

Hi!

I am a beginner in using nifti so this may seem like a stupid question, but i hope you can help me.

I have used fsl prelude to unwrap my mri images, and they are now in the nifti format. I now need to compare these to images with images that I have unwrapped with a matlab algoritm that i made myself.

Can i use your tools to look at the nifti images separatley and perhaps convert them to another datatype that i can use in matlab?

I tought maybe your tip in the help save_nii could help me, but i don't see how to use it, do i need img/hdr files instead of nii?

I will be very greatful for some guidance.

Anne-Lene

06 Jan 2010 Jimmy Shen

Hi David:

I just got chance to look into this issue.

Since it is too complicated to modify "load_nii.m" to load specific slices of NIfTI and Analyze formats, I modified "load_untouch_nii.m" only. That means, you will take care of image orientation based on its header information, because "load_untouch_nii.m" does not apply any changes to the IMG matrix that is indicated in the HDR.

I hope this could still somehow help you to load large dataset.

Jimmy

24 Nov 2009 David

This is a fantastic and highly useful piece of software.

I'm just wondering if there is anyway to load just one or more specific slices from analyze and nifti formats? I know it is straightforward to select the desired slices from nii.img after load, but I would like to avoid the memory usage with the full 4D, 5D,tsc load.

Thank you for sharing this work Jimmy

10 Nov 2009 Jimmy Shen

Hi Michael:

First, I am wondering how you could simply rename an .img file to a .nii file. NIfTI supports both extensions, but for .img extension, you need to save the header separately in .hdr file. So there is no way for people to just "... rename the .img file to .nii file ..." like you said.

Second, I looked into Francesca's data, and the size of the image data does not match the size that is indicated in the header. For such a file, I cannot image any software can process it.

I am glad to take a look at your samples. Would you please upload them onto your server, and post the link here?

Thanks,
Jimmy

10 Nov 2009 Michael Zeineh

Hi Francesca and Jimmy,

Funny, I have run into the same problem with MRIcro. I found a workaround. If with MRIcro you save the roi as a separate analyze header (rather than the embedded header), then it will open with MRIcro. However, this will still not open with Jimmy's tools. However, if you rename the .img file to .nii, then both Jimmy's tool will load it.

Jimmy, I am happy to email some limited sample images if you want.

Michael

09 Nov 2009 Jimmy Shen

Hi Wei:

Thanks for the rate.

When you use "load_untouch_nii.m", it just load the img and hdr, but does not apply any changes (e.g. scl_slope, affine matrix, etc) indicated in the header. Therefore, I always suggest people to use "load_nii.m" in most cases. Please check the description of "load_untouch_nii.m" & "load_nii.m" on http://www.rotman-baycrest.on.ca/~jimmy/NIfTI.

You are right, the unexpected value was caused by the "scl_slope" parameter, which is properly applied when you use "load_nii.m". However, I am not sure whether you have noticed that this is a radiological image, i.e. Right on LHS and Left on RHS. Here, L/RHS means Left/RightHandSide.

When you use "load_nii.m", it will do all the proper flipping and rotation according to the affine matrix in the header, and the img will always be in RAS orientation (i.e. x: L->R, y: P->A, z: I->S). In your particular case, instead of use [32 32 23], you should use [33 32 23], since x axis is flipped, i.e. new_x = max_x(64) - old_x(32) + 1 = 33.

Other software may choose to do so with proper labeling around Axial / Sagittal / Coronal view, e.g. FSL does so.

Please feel free to let me know if you have further question.

Jimmy

09 Nov 2009 Francesca

Hi Jimmy,

you're right, I've tried to open the .nii file with MRIcro and an error about expected header dimensions appears. The wrog step is probably when i try to export .roi to .nii, but actually there's no other way to do it with MRIcro. I'll try to find some other way!

Thanks a lot for your help and thanks again for your nifti tool!

francesca

08 Nov 2009 Wei Liu

OK I think I found the parameter for scaling: they are hdr.dime.scl_slope and hdr.dime.scl_inter. Now I know how these packages works, and I can scale the voxel intensity myself if I want. Sorry for the cursory questions, and thanks for the good tool! -Wei

08 Nov 2009 Wei Liu

Hi Jimmy,

When reading a nifti file I found the voxel gray values are different with other tools. What I did is:
- 'untouch load' the file: fmri_mean = load_untouch_nii(.../meanfM00223_004');
- print voxel value of mri_mean.img(32,32,23). The value is 9506.
- But when I open the same file with fslview, I found the same voxel has different value. And other voxels are also different. the fslview snapshot is attached. Because in fslview the voxel coordinates begins from 0 to dim-1, the same voxel in fslview has coordinate [31 31 22].

- Use the application 'Imageviewer' from itk, and found the voxel value is same with fslview. Also attached snapshot. Same to fslview the coordinate are [31 31 22] for the same voxel.

- check the header of the nifti file by fsl tool 'fslhd':
datatype 4
nbyper 2
bitpix 16

That means it's int16.

-Check the fmri_mean structure in matlab, and found the data type is 4:
datatype: 4
bitpix: 16

But why did your nifti tool give different gray value with other packages? I put all the snapshot and the nifti files at www.sci.utah.edu/~weiliu/q01/ for your reference.

By the way this is excellent tool. Thanks!
Wei

06 Nov 2009 Felipe Salinas

Sorry for not rating this sooner....

06 Nov 2009 Jimmy Shen

Hi Francesca:

First, thank you very much for the rating, and I really appreciate it.

It seems that "lCC_19850624TRTN_2x2x2_b1000_a_fa.nii'" is corrupted. Have you tried to open it successfully under MRIcro? If so, please upload this file and let me take a look at it?

In addition, from the error message that you posted, it seems that you are using a very old version of my tools. I noticed this by the line number showing the error. However, I still believe that the error is caused by the corrupted image.

Please let me know,
Jimmy

06 Nov 2009 Francesca

Dear Jimmy,

i'm just a beginner with all this "nifti imaging world" but I've already done enough for understanding that you've done a very great and smart job!thanks!

Well, i have a problem with loading a .nii file. (obtained by exporting a .ROI file with MRIcro). I'll post the error that i get:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

>> ROI=load_nii('lCC_19850624TRTN_2x2x2_b1000_a_fa.nii');
??? Error using ==> reshape
To RESHAPE the number of elements must not change.

Error in ==> load_nii_img>read_image at 266
img = squeeze(reshape(img, [hdr.dime.dim(2:4) length(img_idx)]));

Error in ==> load_nii_img at 62
[img,hdr] = read_image(hdr,filetype,fileprefix,machine,img_idx,old_RGB);

Error in ==> load_nii at 66
[nii.img,nii.hdr] = ...

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Could you help me?

Thanks a lot and all the best!

francesca

31 Oct 2009 Jimmy Shen

Hi Alex:

Theoretically, with the header information in hand, it is feasible to do slice collapse/expand in addition to scan collapse/expand. Currently, I didn't find such a tool, but may consider your suggestion in the future.

Thanks for your feedback.
Jimmy

31 Oct 2009 Jimmy Shen

Hi Wen-Tung:

The problem is probably in a module that is used by ImageJ. I tried MRIcron, and got the same result as you described. i.e. when hdr.dime.datatype=32 & hdr.dime.bitpix=64, it does not support. when hdr.dime.datatype=64 & hdr.dime.bitpix=128, it works.

In order to make sure what datatype ANALYZE format is supposed to support, I double checked the Analyze document:
http://eeg.sourceforge.net/ANALYZE75.pdf
It says that Analyze format should only support 32/64, rather than 64/128.

I also tried other popular software like AFNI. It turns out that 32/64 is supported by AFNI. When I tried 64/128, it complains "Unsupported ANALYZE datatype =64", which is correct.

Therefore, if you have to use datatype=32 complex, you have to find correct software to use. AFNI is one of them that I have just tested.

All the best!
Jimmy

30 Oct 2009 Alex

Dear Jimmy,

I would like to create large NIfTI files using a computer with relatively small memory. It seems I could do this by processing several slices at a time, and then reprocessing with collapse_nii_scan. This seems a bit clumsy and I guess it would also believe that collapsed parts were a time series rather than stitching together one large volume? Is there a tool to stream slices into a NIfTI file, supposing that I can provide some header info from the beginning?

Thanks,
Alex.

30 Oct 2009 Wen-Tung Wang

Thank you for the note, Jimmy.
First, sorry that I didn't write it clearer in my previous posting. ImageJ is a freeware from NIH (http://rsbweb.nih.gov/ij/index.html) that have numerous users in medical imaging community. ImageJ has a plugin (http://rsbweb.nih.gov/ij/plugins/index.html) that can open/save image in Analyze format. I was trying to save an MRI image, after some processing using Matlab scripts, in Analyze format and view it using ImageJ.
I tried your very nice example, it works well. Yet, it is still not clear to me why ImageJ cannot read the output file. Using datatype=64, ImageJ can read the file, but this is not the correct datatype and there are sinusoidal modulations across the image.
Thank you.
Wen-Tung

29 Oct 2009 Jimmy Shen

Hi Wen-Tung:

First, thank you for the rating.

Your script is correct, but I didn't get any error message. You said " ... trying to read the test.img using ImageJ, ...". Is it a typo?

Here's an example that I tested, and you can duplicate the process:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
img1=rand(3,3)
img2=rand(3,3)
myMat=complex(img1,img2)
datatype=32;
ana = make_ana(myMat,[],[],datatype);
save_untouch_nii(ana,'C:\Data\test');
ana=load_untouch_nii('C:\Data\test')
nii=load_nii('C:\Data\test')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Did you get error message when testing the above script?

Jimmy

28 Oct 2009 Wen-Tung Wang

Hi, Jimmy:
I tried to save a comlpex 2D matrix (an MRI image) in Analyze format using your scripts:
datatype=32;
ana = make_ans(myMat,[],[],datatype);
save_untouch_nii(ana,'C:\Data\test');
When trying to read the test.img using ImageJ, it gave error message "Data type 32 not supported".
Is it that I didn't use the scripts correctly?
Thank you.
Wen-Tung

16 Sep 2009 Jimmy Shen

Hi Marta:

How did you create your NIfTI file? Here's an example that is reproducable:

nii=make_nii(rand(91,109,91)*255);
max(nii.img(:))
save_nii(nii,'mynifti.nii')

As you can see, the highest value of voxel is never set to 1, and you can open 'mynifti.nii' with any NIfTI compatible tools.

Please feel free to ask any questions.

Jimmy

16 Sep 2009 M Var

Hi.

The programs are great, but I seem to have a problem creating NIFTI files with this program. The created NIFTI files often are completely blank with only the highest value pixel set to 1. This can be sorted by changing the scale of the inout matrix (i.e. multiplying all the values by 100), but it is hard to determine what the right scaling is for all images when I don't know what the mechanism behind this error is.

Do you have an ideas that may help?

Many thanks,
Marta

07 Aug 2009 Jimmy Shen

Hi Prateep:

when you load an image file, e.g.:
nii = load_nii('yourimg.nii')

nii.hdr.dime.pixdim(2:4) will be the width, height, and depth of a voxel.

If you view it with view_nii(nii), click menu "View" and then click "Image Information", the "voxel size" is the width, height, and depth of a voxel.

Since both Analyze & NIfTI image should have the same voxel size for all voxels in an image, the maximum and minimum size should be the same.

The distance in voxel from origin can be obtained by subtract value at "[XYZ] at origin" with value at "[XYZ] at crosshair". For distance in millimeter from origin, since value at "[XYZ] at origin" is [0 0 0], you can just read value at "[XYZ] at crosshair".

Please feel free to ask more questions,

Jimmy

07 Aug 2009 prateep mukherjee

Hi Jimmy,

How can we find the maximum and minimum depth,width and height in a 3d .nii image using your tool , assuming that the image is in RAS orientation ?

Also, using this tool, can we find the distance of a pixel from the origin? Please give some hint in this regard.

The images I am using right now are "avg152T1_RL_nifti.nii" and "avg152T1_LR_nifti.nii" from http://nifti.nimh.nih.gov/nifti-1/data.

Thanks,
Prateep.

03 Jul 2009 Jimmy Shen

Hi Kris:

Thanks for your feedback. I have fixed the problem. Instead if using nii.img=double(nii.img); I only made double the three 2D images that are displayed. If the original type is uint8, I will leave it as is.

Again, thanks for the feedback. I have just uploaded the new programs, and you can see it here next week.

Jimmy

03 Jul 2009 Jimmy Shen

Hi Pieter:

It is because you took the advantage of my default "tolerance", which allows 10% distortion. You can use my "reslice.m" program, and specify the voxel size to exactly what you want.

Jiimmy

03 Jul 2009 Pieter Vandemaele

Hi Jimmy,

You can ignore my previous question, I did read the FAQ on you site...
I hope you will have time to update/expand the program, it is very usefull.

Pieter

02 Jul 2009 Pieter Vandemaele

Hi Jimmy,

I got some problems using the headers with your nice tool.

When I load a 4-D nifti file header with load_nii_hdr and compare it with the header from the .hdr field using load_nii, I get different pixdim values:
load_nii_hdr:

nifti_hdr = load_nii_hdr('nifti_file');
nifti_image = load_nii('nifti_file');

nifti_hdr.dime.pixdim is [1 4.5313 4.5313 4.5000 200 1 1 1]
nifti_image.hdr.dime.pixdim is [1 4.5212 4.5312 4.4900 200 1 1 1]

The difference of the pixdim arrays is [0 0.01 0 0.01 0 0 0 0]

Did I found a bug or is there a bug in my head?

Pieter

30 Jun 2009 Kris Thielemans

Hi Jimmy

there seems to be a problem in view_nii when using data that is (natively?) in single format. When I switch to "interp off" and click in one of the panels to move the cross-hair, the other panels get blank, and I see "Warning: CData must be double or uint8.." in my matlab prompt. I can fix this problem by doing something like:

nii.img=double(nii.img);

No other problems so far, so many thanks for the nice software!

Kris

30 Jun 2009 Kris Thielemans

Hi Jimmy

I have a question regarding the license. The matlab front-end says this is BSD license, and so does your license.txt. However, a few files (including load_nii.m and save_nii.m) contain the lines

% Part of this file is copied and modified under GNU license from
% MRI_TOOLBOX developed by CNSP in Flinders University, Australia

It seems to me that those files should then by distributed under the GNU license as well. Could you please clarify that? Sorry for the trouble.

Kris

12 Jun 2009 Jimmy Shen

Hi Maddy:

Yes, it is easy to do so with my tools. Here’s the steps:

1. Load nii file;
2. Find an unused intensity level. If not available, add another level;
3. Find the index of the circle and circles in successive slices;
4. Mark them with the value that you choose in Step 2;
5. Create a colormap file;
6. View brain with circles;

If you are still having problem to create circles, please upload the 2 nii file to your ftp server. The first nii file should be the original volume, the second one should be the one with initial circle. Please also tell me exactly what slices do you want the circle to be drawn, and what color do you want the circle to be drawn. I will then reply you with the modified nii containing the circles.

Jimmy

12 Jun 2009 Maddy

Hi Jimmy,

Wonderful piece of work and a very useful one at that! I would be pleased to know if I can use it for my specific case.

A rod-like observation chamber that we have inserted in the skull shows up as a circle in some of the initial slices of MRI. What I want to do is to project the exact outline of the circle onto a few other deeper slices, so that it can be found, where exactly the projection of the chamber lies in the successive slices. Thereby, the region that would be encircled if the rod-like chamber were to be inserted further inside can also be found. Simply put, it is like overlaying a circle of specified diameter and position onto each successive slice.

I tried doing it with the view_nii function with the circle saved in .jpeg/.fig formats, giving the figure handle and the nii, using the description in the help section of the view function. But I had trouble with the figure properties, especially the function ‘set’. I get errors in almost every figure property, starting from ‘menu bar’ at line number 291 in the program. I am a beginner in matlab. I was actually surprised I could use other functions, which is why I say that your file is so user-friendly. I would be happy to know how I can go about doing it…

To sum up, all I want to know is, if there is a way of plotting a circle,( given its radius and position in those co-ordinates), onto successive slices.

05 Mar 2009 Jimmy Shen

Hi Nicole:

Here's the definition of AC Origin:
http://en.wikipedia.org/wiki/Anterior_commissure

In order to use 'make_nii.m', you already have a 3D matrix, you can only tell the AC Origin by your eye, instead of any conversion.

Because the data generated by 'make_nii.m' is in RAS orientation, the negative z coordinate is downwards, i.e. z coordinates is from Inferior to Superior.

Jimmy

05 Mar 2009 Nicole

Hi Jimmy,

I'm sorry to repeat my question, but the entries of AC origin are still not clear to me, mainly because I don't know what is meant by "AC origin".

I now know that voxels are being counted (not the position in mm). Now, is it the origin in question related to the x, y, z offset of the slab of slices in the brain (i.e. the offset when positioning the slices during the scan), or is it the origin within the slab of slices itself? I presume it is the former.

If it is the former, then I'm not sure why it has to be relative to img(1,1,1), as opposed to the overall offset of the slab. I have my offset in mm in the readout, phase encode, and slice directions. Can I just convert these values to numbers of voxels?

Finally, is the z coordinate negative upwards, or negative downwards? (i.e. a more superior slice would have a larger negative z coordinate than a more inferior slice)

As a side note, I'm only using make_nii and save_nii, to then analyze the data in FSL.

Hopefully I've made my confusion clearer this time. Thanks for your help,

Nicole

05 Mar 2009 Jimmy Shen

Hi Nicole:

First: 'origin' parameter in 'make_nii.m' is in voxel, which is relative to the first voxel of 'img' parameter, i.e. img(1,1,1);

Second: It would be much clearer if I use an example to explain this:

img=125:249; img=reshape(img,[5,5,5]);
nii=make_nii(img,[1,1,1],[3,3,2]);
view_nii(nii);

Yes, we know AC Origin means [0 0 0] in millimeter. However, you must tell the NIfTI data where is your [0 0 0] millimeter, so other people can also know it when they open your NIfTI data. Therefore, parameter 'origin' can only be expressed in voxel to locate the exact position of your 3D matrix to be the AC Origin.

Jimmy

04 Mar 2009 Nicole

Hi Jimmy,

Your code has been very useful to me; I've been using make_nii and save_nii. My question is regarding the AC origin for make_nii. First of all, I presume the coordinates should be in mm, like the voxel size. Then, I was wondering if AC origin refers to the position of the central slice. If so, for the 3rd coordinate (referring to axial slices), does negative (e.g. -20) indicate an upward translation (i.e. more superior slice)? This is the convention that I'm used to, but I am not sure it applies to make_nii as well.

Thanks!

Nicole

05 Dec 2008 Simon Robinson

These are great tools for reading and writing NIfTI - a core part of all my programs and very well supported. Thanks.

06 Oct 2008 Simon Robinson  
08 Aug 2008 Marianna Jakab

Please take out the ":" of the link below, that takes you to an invalid page.

Two example datasets are provided under NIfTI web site http://nifti.nimh.nih.gov/nifti-1/data: "avg152T1_LR_nifti.nii" and "avg152T1_RL_nifti.nii".
whereas http://nifti.nimh.nih.gov/nifti-1/data is a very nice and informative page.
Thanks.

04 Jul 2008 so si  
24 Jun 2008 mmei rezk  
16 Jun 2008 Stefan Haufe  
03 Sep 2007 Assaf RMATHALBazon

After a cursory inspection this seems like a great tool.

31 Aug 2007 Mark Bolding

I use this all of the time. I rocks.

30 Jul 2007 Jimmy Shen

Stella,

Here are the answers:

1. It is correct that "nii_002.original.hdr.hist.originator" is [256 0 0 0 0], because "t1_icbm_normal_1mm_pn0_rf0" is in Analyze 7.5 format and "001" is in NIfTI format that does not have obvious "originator" field. please let me know if you are still not clear.

2. "nii_01.hdr.dime.xyzt_units" is just an information field. When it is 1, xyz are in "meters"; when it is 2, xyz are in "millimeters"; when it is 3, xyz are in "micrometers"; when it is 0, xyz units are unknown and can only be interpreted by the author. I don't know why this field helped you, and wonder if it is the correct way.

3. It is very strange that you got "[-2 -2 -2 0 0]" for "nii_002.hdr.hist.originator". I need to look at both "t1_icbm_normal_1mm_pn0_rf0.img/hdr" & "001.img/hdr" in order to further answer this question. Would you please upload them to your FTP site and send me the link?

28 Jul 2007 Stella zheng

1. I have manually set the nii_01.hdr.dime.xyzt_units=2;It can be converted by freesurfer now. Thanks!
2. The other problems may be due to the orignal Analyze image is created with Big endian, while this toolbox writes the new Analyze file with little endian. I am not sure about it and how to solve it.

28 Jul 2007 Stella Zheng

Sorry.

2.In nii_002, Originator in nii_002.original.hdr.hist is [256 0 0 0 0], while it is [-2 -2 -2 0 0] in nii_002.hdr.hist.

28 Jul 2007 Stella Zheng

Dear everybody:

I have found the followingproblems in the using this toolbox.
Data: t1_icbm_normal_1mm_pn0_rf0.rawb is downloaded from brainweb,then converted to Analyze format(t1_icbm_normal_1mm_pn0_rf0.img and t1_icbm_normal_1mm_pn0_rf0.hdr )(without *.mat).

Following procedures are applied:

nii_001 = load_nii('t1_icbm_normal_1mm_pn0_rf0', [], 1)
save_nii(nii_001,'001', 1);
nii_002 = load_nii('001', [], 1)

It is expected that the header information should be same, but there is following difference:

1. In nii_001, Originator in nii_001.original.hdr.hist is same as in nii.hdr.hist as [0 0 0 0 0].

2.In nii_002, Originator in nii_001.original.hdr.hist is [256 0 0 0 0], while it is [-2 -2 -2 0 0] in nii_001.hdr.hist.

3. The origin of t1_icbm_normal_1mm_pn0_rf0.img shown in MRIcro is [0 0 0], origin of 001.img shown in MRIcro is [2 2 2]

4. rot_orient=[],flip_orient=[] in nii_001.hdr.hist and nii_002.hdr.hist, but not in their origianl header.

5. when 001.img is converted to *.mgz in FreeSurfer, the error message is as below

mri_convert ./orig/001.img ./orig/001.mgz
reading from ./orig/001.img...
INFO: reading as a two-file NIFTI
nifti1Read(): unknown space units 0 in ./orig/001.hdr

Highly appreciate your help if somebody can help to solve the problem.

Best regards,
Stella,

SCE,Nanyang Technoligical Univeristy
Singapore,

26 Jul 2007 Stella zheng

The best tool I have used for Analyze image reading and writing. Thanks a lot for your contribution and sharing.

02 May 2007 Ning Cao

(Possible) Bug Report:

A good toolbox for loading, saving and viewing Analyze MR images. Thank you for improving it from time to time.

I just want to report a possible bug in 20070426 version.

When viewing a 4D image using view_nii, the "value at crosshair" and "value at cursor" always display the value of the first 3D volume.

view_nii.m L3036, the code 'imgvalue = double(img(sag,cor,axi));' making the imgvalue always the value of the first 3D volume.

26 Dec 2006 abbas kader

A good toolbox for the viewing the Nifti formate file in MATLABe especillay when u did processing in FSL and you wnat to interpretted in MATLAB
Thanks alot

20 Sep 2006 jeff a

best utilities to read dynamic analyze files i have found

14 May 2006 r Huang

Hi Jimmy,

Your software is very useful. Many thanks for your great offer.

Could you please indicate (1) how to overlay 2 or 3 other images together, (2) how to choose different threshold?

Thanks in advance

rhuang

15 Mar 2006 Craig Hamilton

Very useful, well done. How about support for complex datatypes?

07 Mar 2006 Jimmy Shen

How scl_slope affect data_type?

Hi Ged:

Thanks for the URL you sent me. The way Jonas handling "scl_slope" is to convert image data type to "double", which makes sense, although it is not specified on NIFTI documentation (see URL below): http://nifti.nimh.nih.gov/nifti-1/documentation/nifti1fields/nifti1fields_pages/scl_slopeinter.html

I modified my "xform.m". So it will convert the image data to "double" in the case that "scl_slope" is used. I am updating this file to MATLAB Central File Exchange, and NIFTI_20060307 will appear there soon.

Thanks again for your valuable input,

Jimmy

-----Original Message-----

Hi Jimmy,

Thanks for getting back to me. Unfortunately something else must be wrong in that case, since the image in Matlab has only the values 0 or 1, while the image viewed in FSLview or SPM has a range of values between zero and 1, the image type is uint8.

Best,
Ged.

07 Mar 2006 Jimmy Shen

How to get original information from NIFTI hdr?

Hi Ged:

Thank you very much for your input.

Actually both "scl_slope" and "scl_inter" parameters have been correctly
read and applied to the "img" variable of the output NIFTI structure (see
"xform_nii.m" file): nii.img = scl_slope * double(nii.img) + hdr.dime.scl_inter;

The reason to display "hdr.dime.scl_slope" as zero is a feature of my
package. It signifies that the "img" variable has already been modified. You
can also find that "hdr.hist.qform_code" and "hdr.hist.sform_code" will be
set to zero after proper affine transformation.

The original value of "hdr" can be easily found by: hdr =
load_nii_hdr(filename); You should have correct value (0.003922) there.

Jimmy

-----Original Message-----

Hi Jimmy,

I've found your NiFTI toolbox very useful, but I'm having some
problems with some data stored in uint8 .nii with a scaling factor.
the data appears to load in as a binary image, and the value of
nii.hdr.dime.scl_slope is zero, instead of the correct value
(0.003922) which I can see using e.g. spm5 or avwhd from FSL.

Many thanks for any help you can offer,

Ged.

13 Feb 2006 Jimmy Shen

Hi Henry:

This is an advanced feature, and it is already included in the toolbox.

Here is the brief guide to use this feature:

1. Use "ana = load_nii(ana.img)" to load your analyze image to "ana" struct, and make sure that variable "ana.img" is either in "single" or "double". If not, use step 2 to convert it.

2. To convert variable "ana.img" to "single", you need to use "make_nii" command: "ana = make_nii(ana.img, ana.hdr.dime.pixdim(2:4), ana.hdr.hist.originator(1:3), 16)".

3. Use "thresh = load_nii(thresh.img)" to load your thresholded image to "thresh" struct, and extract its value and index to "opt" struct: "opt.setvalue.idx = find(thresh.img); opt.setvalue.val = thresh.img(find(thresh.img));". You can see more detail to use "setvalue" by command: "help view_nii".

4. Add other values to "opt" struct: "opt.command = 'init'; opt.useinterp = 0;".

5. Plot thresholded image with underlaid analyzed image by command: "view_nii(ana, opt);".

6. Don't click "interp on/off" menu. It doesn't work properly. If you would like to see the interpolated one, use: "opt.useinterp = 1; view_nii(ana, opt);" instead.

Please let me know if you can plot your thresholded image with underlaid analyzed image.

Jimmy

-----Original Message-----
I have been using the Nifti toolbox for Matlab recently and was wondering whether it is possible to make an overlay of a thresholded image onto the analyzed image. In effect that would mean that all 0 values of the thresholded image should be transparent so that the underlying functional image can be seen.

Thanks a lot for your help in advance and for making such a useful tool available!

Yours sincerely,

Henry Lütcke

Biomedizinische NMR Forschungs GmbH

am Max-Planck Institut für Biophysikalische Chemie

Am Fassberg 11

37077 Göttingen

Germany

24 Nov 2005 zhi yang  
15 Nov 2005 Jimmy Shen

Hi Anita: Thanks for the feedback. However, I checked but did not find any problem to load or save nii file with non-integer datatype. For example, you can download a typical NIFTI data (zstat1.nii) from: http://nifti.nimh.nih.gov/nifti-1/data This file is in single (float32) datatype. You can output to nii structure using: nii=load_nii('zstat1.nii'), and output to a new file using: save_nii(nii, 'newfile.nii'). If you still have problem, please email me, and let me take a look at your data.

14 Nov 2005 Anita D

this program works good when i output the nii file as int, but when i output the nii file as unint, the image is distorted.

Updates
09 Nov 2005

Images whose cardinal planes are slightly off Cartesian coordinates will also be loaded. See detail in 'xform_nii.m'.

11 Nov 2005

I didn't see the 'xform_nii.m' was updated in File Exchange. So, I uploaded again with another zip filename.

17 Nov 2005

It now supports both new_RGB24 (RGB triple) and old_RGB24 (used by Analyze 6.0 from AnalyzeDirect Inc). Help file "view_nii_hlp.txt" is also modified.

17 Nov 2005

It now supports both new_RGB (RGB triple) & old_RGB (used by Analyze 6.0 from AnalyzeDirect Inc). Help file "view_nii_hlp.txt" is also modified.

22 Nov 2005

Updated help file "view_nii_hlp.txt"

22 Nov 2005

Updated help file "view_nii_hlp.txt".

22 Nov 2005

Menu bar is added to convert image to standard RAS orientation and to display image information.

28 Nov 2005

Modified display format for RGB24 data value.

28 Nov 2005

Updated code

29 Nov 2005

NIFTI_20051128 is tested from MATLAB version R11 to R14 on both PC & Linux

15 Dec 2005

1. fix a bug for the initial display of coronal & sagittal view
2. added a function to expand a multiple-scan NIFTI file into multiple single-scan NIFTI files

24 Feb 2006

Fixed a bug to reorder "pixdim" field when performing sform/qform transform. Thanks to Jeff Gunter from Mayo Clinic who reported this bug.

27 Feb 2006

1. Fixed a bug to reorder "pixdim" and "originator" field for some NIFTI data. 2. Added "rot_orient" and "flip_orient" fields under "hdr.hist" if package make conversion of the NIFTI data into RAS orientation system.

01 Mar 2006

set "rot_orient" and "flip_orient" fields under "hdr.hist" to empty for old ANALYZE 7.5 format or if the NIFTI data is already in RAS orientation.

08 Mar 2006

Image data type will be converted to "double" in the case that "scl_slope" is used.

13 Mar 2006

"nii.hdr.scl_slope" will take "avw.hdr.roi_scale" value, which is a non-ANALYZE7.5 field but exclusively used by SPM.

23 Mar 2006

It now supports both COMPLEX64 and COMPLEX128 data type.

23 Mar 2006

It now supports both COMPLEX64 and COMPLEX128 data type.

20 Apr 2006

Size of some image data is incorrectly larger than what specified in "hdr.dime.dim" field. So it caused problem to load image data. Image data is now always loaded according to the size that is specified in its header.

06 Jun 2006

1. There was a bug in converting some permuted images to RAS orientation. It has been fixed now. Thanks to Jeff Gunter from Mayo Clinic who reported this bug.

2. hdr.dime.glmax and glmin are updated if hdr.dime.scl_slope is non-zero.

28 Jun 2006

1. "unxform_nii" from Jeff is included to provide an option of putting image orientation back to its original status. 2. "expand_nii_scan" is modified so the expanded image files will be appended with a 4-digit number.

05 Jul 2006

Thanks to Michael Harms from WUSTL who reported and fixed some bugs in loading and making RGB data. He also added codes to save AnalyzeDirect compatible RGB data.

27 Jul 2006

Due to round-off of quaternions (quatern_b/c/d), sqrt(1.0-(b*b+c*c+d*d)) may become complex because value inside sqrt may go below 0 (e.g. -1e-6). Instead of complex, now 0 will be used in this case. Thanks to Jeff Gunter who reported this issue.

25 Sep 2006

Added "mat_into_hdr.m" script to convert the ANALYZE 7.5 SPM Reoriented image file into NIfTI format, and integrate the affine matrix in its matlab file into its header file.

18 Dec 2006

Improved data scaling process, and fixed a bug in calculating origin position. Detail will be posted on http://www.rotman-baycrest.on.ca/~jimmy/NIFTI

21 Dec 2006

1. "Save displayed image as ..." is added in the "File" menu of "view_nii" window. 2. Removed integer rounding for "hdr.hist.originator". Please check more detail in: http://www.rotman-baycrest.on.ca/~jimmy/NIFTI/#update.

23 Apr 2007

1. Automatically integrate affine matrix in .mat file of earlier versions of SPM into .hdr structure. 2. fixed a bug in "mat_into_hdr.m". Please check more detail in: http://www.rotman-baycrest.on.ca/~jimmy/NIFTI/#update

27 Apr 2007

1. Modified save_nii command, so earlier versions of SPM can also open it with correct originator. 2. Modified http://www.rotman-baycrest.on.ca/~jimmy/NIFTI/FAQ.htm with several categories

03 May 2007

Thanks to Ning Cao from UKY who reported and fixed a bug in view_nii.m file. Please check more detail at: http://www.rotman-baycrest.on.ca/~jimmy/NIFTI/#update

04 Feb 2008

Thanks to Jeff Gunter from Mayo who suggested to display a warning message instead of throwing an error for a very oblique image. Especially thanks to his code of checking qform rotation before applying voxel size modulation.

09 Apr 2008

Added a new feature to load and save NIfTI's header extension (added "load_nii_ext.m" and moified "save_nii.m"), and fixed a bug when loading qform data, which was introduced on 01-FEB-2008.

09 Jul 2008

Thanks to the feedback of Holger Krause from Heinrich-Heine University Dusseldorf, the bug in "mat_into_hdr.m" when input file containing a path has been fixed.

20 Aug 2008

1. New program reslice_nii.m is provided to perform any 3D affine transform and to generate an isotropic image. 2. New program flip_lr.m is provided for L-R flipping. Please check more detail at: http://www.rotman-baycrest.on.ca/~jimmy/NIFTI/#update

22 Aug 2008

Added a "verbose" parameter for "reslice_nii.m" to provide an opportunity to disable the progress display.

29 Aug 2008

Added "load_untouch_nii.m" and "save_untouch_nii.m" program pair. See detail in Description above and FAQ at http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/FAQ.htm.

23 Oct 2008

1. Properly handle fread/'*char' problem with foreign characters in MATLAB 7 and above; 2. Reordered input parameters for 'reslice_nii.m' program;

24 Oct 2008

update didn't show up

04 Dec 2008

Fixed a bug in fliplr.m when reading files.

05 Dec 2008

Default data type for 'make_nii.m' now follows the data type of 'img' matrix, instead of float32.

17 Mar 2009

1. Thanks to the feedback of Bryce Wilkins from USC, a typo in one of my message display is fixed.

2. Thanks to the suggestion of Ashish Raj from Cornell, 'expand_nii_scan.m' is modified and 'collapse_nii_scan.m' is added.

25 Mar 2009

Thanks to the feedback of Kate Fissell from University of Pittsburgh, transformation matrix M will no longer be saved by save_untouch_nii.m.

18 Jun 2009

Just receive warning from MATLAB: "If I do not license my code with BSD, my code will be removed."

03 Jul 2009

Fixed several bugs, and posted informative table:

http://www.rotman-baycrest.on.ca/~jimmy/UseANALYZE.htm

09 Sep 2009

While an N-Dimensional matrix can be saved into a NIfTI file using "make_nii / save_nii" command pair, a 3D matrix can also be saved into an ANALYZE file using "make_ana / save_untouch_nii" in order to be compatible with some ANALYZE only programs.

05 Jan 2010

"load_untouch_nii" now supports loading specific slices of NIfTI or Analyze format.

06 Jan 2010

1. "load_untouch_nii" now supports loading specific slices of NIfTI or Analyze format.
2. MATLAB ask me to remove any "under GNU license" phrase in any file.

13 Apr 2010

Fixed a bug in "collapse_nii_scan" to collapse Analyze format data.

19 Aug 2010

Thanks to Rembrandt from Radboud University Nijmegen (Netherlands), I made 2 small changes to handle the exceptions.

03 Feb 2011

Thanks to the feedback of Roman Fleysher from Yeshiva University, I fixed a bug when loading a quaternion form NIfTI data.

15 Feb 2011

1. Fixed an overlay problem in view_nii.m, so the color of min/max is now showing properly.
2. Included an overlay example in http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/FAQ.htm and http://www.rotman-baycrest.on.ca/~jimmy/NIfTI/examples.txt.

10 Mar 2011

New feature is added in "view_nii" program to let you edit voxel values or set landmarks. Also thanks to the code from Roman, which speed up "load_untouch_nii_img" program when the slices are not loaded at once.

02 May 2011

New program "load_untouch_header_only.m" and "save_untouch_slice.m" is provided. Check http://www.rotman-baycrest.on.ca/~jimmy/NIFTI for more details.

09 Jun 2011

You can now create RGB NIfTI / ANALYZE file structure using make_nii / make_ana program.

10 Jun 2011

Fixed a bug for yesterday's release

01 Sep 2011

"make_nii.m" is now able to automatically detect both single and double complex data type.

21 Sep 2011

Thanks to the feedback of Matthew Bickell from University of Cape Town, a bug is fixed when edit voxel in millimeter unit.

16 Oct 2012

Added some new features and fixed some bugs. For more detail, please visit:

http://www.rotman-baycrest.on.ca/~jimmy/NIfTI

07 Mar 2013

Since voxel size can be less than 0, I will change the default voxel_size in reslice_nii.m from rounded minimum voxel_size in original NIfTI header to absolute minimum voxel_size in original NIfTI header. This fixed reslice_nii bug.

22 Jan 2014

1. Thanks to the feedback and contribution of Chris McNorgan from Western University, the rri_orient.m now have optional parameter for orientation vector.
2. New program pad_nii.m is available together with clip_nii.m. See example in FAQ.pdf.

Contact us