SNR calculation comparable to dipy?


I’m curious if MRtrix has the capability to estimate SNR similarly to dipy. Thanks!


1 Like

Hi Amanda,

If you specifically want to estimate SNR according to the dipy docs, it is certainly possible to replicate their pipeline with MRtrix commands. You’d need to delineate ROIs for the corpus callosum and for the air around the subject head, and could then use mrstats to compute the mean in the former and the standard deviation in the latter. However, that is not the approach I would recommend.

In general, SNR can be defined as mean(signal) / std(noise). The signal is of course dependent on the anatomy (and microstructure). The noise level is also spatially variant, because it depends on the coil profile. Hence, there is no such thing as the SNR of a DWI dataset. At best, one may estimate the mean SNR in white matter at b=1000 (for example). Because both the signal and the noise level are spatially dependent, both should also be estimated in the same region (in contrast to the dipy pipeline).

Therefore, the main challenge is to estimate the noise level within the brain, rather than in a region around it. It is reasonable to assume that the noise level map is constant across the different DWI gradients (volumes) in your acquisition. MRtrix offers 2 tools that exploit this property to estimate the noise level map (a 3-D image) from a DWI dataset. The legacy tool is dwi2noise, which simply computes the root-mean-squared (RMS) residual of a low-order signal SH fit in each voxel. More recently, we have added this method (Veraart et al., MRM 2015) as part of dwidenoise, which I recommend over the SH fit. The paper is also a good read on the subject in general. Have a look at our tutorial on dwidenoise for its use; you can get the noise level with the output option -noise.

You may then compute SNR as the ratio between the mean b=X volumes and the noise level. You will notice that the resulting maps have clear anatomical contrast in them. You can then report median values across WM, specific ROIs, or the full brain.




Wonderful, thank you for the thorough explanation, Daan! MRtrix seems to be quite a useful tool overall, and I appreciate you and everyone else who contributes to it & helps its users. It’s quite a supportive community. Thanks again! :grin:

Hi MRtrix team,

I have a doubt about my images, and I think this is the correct post to ask for it.

My doubt is: is there any minimal SNR for cSD to work on the images? or where I can found this information? Any advice will be really helpful. Thanks in advance.



It’s a difficult one to answer exactly, but in my experience when SNR drops below ~15 (as measured in the b=0 images within the region of interest), things start to look a bit messy. My suspicion is that at this SNR level, and when looking at b ≈ 3000 s/mm², the SNR in the DW images is getting too close to 1 for comfort. At this level, even lots of measurements won’t necessarily help all that much since the Rician bias will wash out the contrast.

As to where to find that information, well to be honest, there isn’t really any particular reference for that. Part of the problem is that there is an interaction with the Rician bias, but also with the b-value, the number of volumes acquired, the use of parallel imaging, etc, all of which complicates things a bit. So my SNR > 15 recommendation really is just my personal experience…

Hi Donald,

Thank you very much, that is really useful indeed.



Dear Christiaens,

To follow your suggestions for SNR calculation at the level of the whole brain, is this what you had in mind?

dwidenoise -noise noise.mif predwi.mif predwi_denoised.mif  
mrstats -output mean -allvolumes predwi.mif


mrstats -output mean -allvolumes noise.mif
= noise


If so, what would be acceptable lower limits for the whole-brain SNR (this is relevant to us as we adjust our dwi protocols at high b ~3000, 4000 values) if tractography or downstream connectome analyses are planned?

Thank you,

Hi Octavian,

You’re close, but a few things to remark:

  1. You probably want to compute these estimates within a brain mask, rather than the full image.
  2. For the signal part, it’s more sensible to look at SNR in each shell, rather then all data combined. You can also compute these measures on the denoised data (athough I don’t expect it to make a big difference).

So, you could do:

dwidenoise -noise noise.mif predwi.mif predwi_denoised.mif
mrstats -output mean -mask mask.mif noise.mif        # --> noise
dwiextract -shell X predwi_denoised.mif - | mrstats -output mean -mask mask.mif -allvolumes -        # --> signal in shell X

Then, SNR in shell X = mean signal in shell X / noise. If you plot these for increasing b-values (assuming you have multi-shell data), you’ll see that SNR decreases exponential’ish for increasing b-value, due to the signal attenuation with b. Many papers report a single value, which I can only assume is the SNR at b=0 but it’s often hard to know for sure.

If at all possible, I would aim for SNR>5 at the outer shell (highest b-value). In practice, this can be difficult to achieve though.


1 Like

Great, Daan, thank you Octavian