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
|