Hello Guillaume,
Thank you for your prompt reply. Playing with the kernels as you suggested helped me understand how this might aid results when the FWHM is particularly small.
As a minor suggestion, if the next version of SPM mentioned in the GUI that smoothing does not use a _strictly_ Gaussian kernel, it might be beneficial to researchers trying to replicate others' results. Often people will read the help info from the GUI and quote it as such in their methods. Just a suggestion :)
All the best,
Lee
-----Original Message-----
From: Guillaume Flandin [mailto:[log in to unmask]]
Sent: Tuesday, 16 October 2018 7:08 PM
To: Reid, Lee (H&B, Herston - RBWH) <[log in to unmask]>; [log in to unmask]
Subject: Re: [SPM] Smoothing does not match other libraries?
Dear Lee,
The smoothing kernel used by SPM is defined here:
https://github.com/spm/spm12/blob/master/spm_smooth.m#L94-L99
https://github.com/spm/spm12/blob/master/spm_smoothkern.m
and the following piece of code lets you compute the value you observed in your tests:
s = [5 5 5];
VOX = [2.63889 2.63889 2.6];
s = s./VOX;
s1 = s/sqrt(8*log(2));
x = round(6*s1(1)); x = -x:x; x = spm_smoothkern(s(1),x,1); x=x/sum(x); y = round(6*s1(2)); y = -y:y; y = spm_smoothkern(s(2),y,1); y=y/sum(y); z = round(6*s1(3)); z = -z:z; z = spm_smoothkern(s(3),z,1); z=z/sum(z);
x(6) * y(6) * z(6)
ans =
0.084563073998470
As documented in spm_smoothkern.m, SPM does use a Gaussian kernel convolved with 1st degree B-spline to take sampling into account. If you were to use a Gaussian kernel only by uncommenting line 31 and returning immediately from that function:
https://github.com/spm/spm12/blob/master/spm_smoothkern.m#L31
rerunning the code above would give you:
>> x(6) * y(6) * z(6)
ans =
0.120088858959157
which matches your observations from the other software.
Best regards,
Guillaume.
On 16/10/2018 09:03, Lee Reid wrote:
> Hi SPM users,
>
>
>
> I have been trying to port some SPM12 functions to/from other software.
> I have found that the smoothing performed by SPM does not match that
> of three other libraries. This gives me slightly different fMRI
> results when applied to a real dataset.
>
>
>
> I assume that I have misunderstood something in SPM, but I can't
> pinpoint what.
>
>
>
> To investigate this, I created a floating point nifti. All voxels were
> set at 0, except for one which had a value of 1 slightly off centre
> (37, 34, 24)
>
>
>
> MRtrix reports the following header information:
>
> ************************************************
>
> Image: "one_voxel_f.nii"
>
> ************************************************
>
> Dimensions: 72 x 72 x 45
>
> Voxel size: 2.63889 x 2.63889 x 2.6
>
> Data strides: [ -1 -2 3 ]
>
> Format: NIfTI-1.1
>
> Data type: 32 bit float (little endian)
>
> Intensity scaling: offset = 0, multiplier = 1
>
> Transform: 1 0.009765 -4.042e-14 -93.11
>
> -0.009765 1 -1.456e-13 -76.32
>
> 3.9e-14 1.46e-13 1 -43.68
>
> comments: FSL5.0
>
> mrtrix_version: 90438389
>
>
>
> SPM reports the same voxel size for this image.
>
> I then smoothed the image with a FWHM=5mm in four libraries:
>
> *MRtrix 3 *(Linux; appears to use a kernel)*:
> */mrfilter -fwhm 5 one_voxel_f.nii -force smooth
> one_voxel_f_smoothed_mrtrix.nii/
>
> *FSL *(Linux)*:*
>
> /fslmaths one_voxel_f.nii -s 2.1233225751656191608629182945473
> smoothed_fsl.nii.gz/
>
> *An in-house library *(Windows) which applies smoothing via a fourier
> transform, again FHWM = 5mm
>
> *-----
> SPM via the gui *(Windows)*:
> */Images to Smooth/ one_voxel_f.nii
>
> /FWHM/ 5 5 5
> /Data Type/ FLOAT64 - double prec. float (I have also tried SAME)
>
> /Implicit Masking/ No
> /Filename prefix/ spm_5mm_FWHM_
>
> *-----*
>
>
> All four libraries state that their input argument should be stated in mm.
>
>
> For the centrally smoothed voxel,
>
> MRtrix, FSL, and the in-house code produce 0.1205, 0.1200, and 0.1201,
> respectively.
>
> SPM produces 0.0846
>
>
>
> For the voxel above
>
> MRtrix, FSL, and the in-house code produce 0.0570, 0.0567, and 0.0567,
> respectively.
>
> SPM produces 0.0467
>
>
>
> Other voxels follow a similar pattern
>
>
>
> The header is not changed meaningfully by spm:
>
>
>
> ************************************************
>
> Image: "spm_5mmFWHM_one_voxel_f.nii"
>
> ************************************************
>
> Dimensions: 72 x 72 x 45
>
> Voxel size: 2.63889 x 2.63889 x 2.6
>
> Data strides: [ -1 -2 3 ]
>
> Format: NIfTI-1.1
>
> Data type: 64 bit float (little endian)
>
> Intensity scaling: offset = 0, multiplier = 1
>
> Transform: 1 0.009765 0 -93.11
>
> -0.009765 1 0 -76.32
>
> -0 -0 1 -43.68
>
> mrtrix_version: 90438389 - conv(5,5,5)
>
>
>
>
>
> So why the difference?
>
> Have I hit a bug or misunderstood how to use SPM?
>
>
>
> Many thanks for any insights,
>
> Lee
>
--
Guillaume Flandin, PhD
Wellcome Centre for Human Neuroimaging
UCL Queen Square Institute of Neurology
London WC1N 3BG
|