SPM/操作指南
|  | SPM 华夏公益教科书已迁移至 https://www.fil.ion.ucl.ac.uk/spm/docs/ | 
此页面列出了使用 SPM 的一系列操作指南。它们应该适用于所有最近版本的软件。

要更改图像的原点
- 使用 SPM 显示打开图像
- 移动十字线位置,使其大致指向 前连合 (AC)。
- 单击“设置原点”按钮
- 单击“重新定向”按钮并按完成(您的图像已选中)。如果您想将相同的变换应用于其他图像(例如,如果您有一系列功能图像),请在此阶段选择所有图像。
- 对“您是否要保存重新定向矩阵?”说“否”。
这会将图像的原点(0 0 0 毫米坐标)设置为 AC。您可能还想旋转图像,使其更好地与 MNI 空间对齐:为此,您还需要编辑围绕 俯仰、横滚和偏航轴 的旋转(以 弧度 为单位)的条目。
您还可以尝试使用 配准 自动执行此过程。
另请参见:查找连合。
对于早期版本的 SPM,请参阅 重新定位 MRI。
使用 ImCalc 功能,其中 表达式 为“mean(X)”,数据矩阵 选项设置为“是 - 将图像读入数据矩阵”。您还可以为平均图像选择输出文件名(例如 mean.img)及其目录(默认值为当前文件夹)。
或者,您可以使用 spm_mean_ui 函数,但选项数量有限 - 应优先选择 ImCalc。
如果您想计算总和,只需使用 表达式 “sum(X)” 即可。
如果您更改了数据的存储位置和/或 SPM 的安装位置,则批处理文件和 SPM.mat 中包含的完整路径将失效。SPM 中提供了一个实用程序函数 spm_changepath,用于在 MAT 文件中用另一个字符串替换一个字符串的所有出现。例如
spm_changepath('SPM.mat','C:\mydata','D:\Experiments\data');
将更新 SPM.mat 文件,用 D:\Experiments\data 替换 C:\mydata 的所有出现。初始文件的备份可以在 SPM.mat.old 中找到。运行时将显示所有已更改路径的列表。
默认情况下,颜色限制的范围是渲染数据的最小值/最大值。如果您想自己指定它们,可以使用以下代码。
对于表面渲染,使用
H = getappdata(get(findobj('Tag','SPMMeshRender'),'Parent'),'handles');
spm_mesh_render('CLim',H) % return current limits
spm_mesh_render('CLim',H,[0 16]); % set limits to [0 16]
对于三个正交视图上的渲染,使用
global st
st.vols{1}.blobs{1}.min = 0;
st.vols{1}.blobs{1}.max = 16;
spm_orthviews('redraw');
以下代码将读取一个二进制掩码(ROI),执行连通分量标记,过滤掉体素大小(变量 k)小于特定大小的所有簇,并将其保存为另一个掩码(ROIf)。
ROI  = 'myvoi.nii';  % input image (binary, ie a mask)
k    = 100;          % minimal cluster size
ROIf = 'newvoi.nii'; % output image (filtered on cluster size)
%-Connected Component labelling
V = spm_vol(ROI);
dat = spm_read_vols(V);
[l2, num] = spm_bwlabel(double(dat>0),26);
if ~num, warning('No clusters found.'); end
%-Extent threshold, and sort clusters according to their extent
[n, ni] = sort(histc(l2(:),0:num), 1, 'descend');
l  = zeros(size(l2));
n  = n(2:end); ni = ni(2:end)-1;
ni = ni(n>=k); n  = n(n>=k);
for i=1:length(n), l(l2==ni(i)) = i; end
clear l2 ni
fprintf('Selected %d clusters (out of %d) in image.\n',length(n),num);
%-Write new image
V.fname = ROIf;
spm_write_vol(V,l~=0); % save as binary image. Remove '~=0' so as to
                       % have cluster labels as their size. 
                       % or use (l~=0).*dat if input image was not binary
在您的 MATLAB 路径中保存以下函数
function openimg(img)
spm_image('Display',img);
function opennii(nii)
N=nifti(nii);
if size(N.dat,4) == 1
   spm_image('Display',nii);
else
   if ~isdeployed, addpath(fullfile(spm('Dir'),'spm_orthviews')); end
   spm_ov_browser('ui',spm_select('expand',nii));
end
使用“显示”>“添加叠加层”或“检查配准”>“叠加层”>“添加彩色图像”后,键入以下内容
global st
col = st.vols{1}.blobs{1}.colour;
st.vols{1}.blobs{1}.colour = struct('cmap',[0 0 0;col],'prop',0.5);
运行以下内容(使用适当的体素大小),并选择您要重新采样的图像。重新切片的图像将以“r”前缀保存
voxsiz = [2 2 2]; % new voxel size {mm}
V = spm_select([1 Inf],'image');
V = spm_vol(V);
for i=1:numel(V)
   bb        = spm_get_bbox(V(i));
   VV(1:2)   = V(i);
   VV(1).mat = spm_matrix([bb(1,:) 0 0 0 voxsiz])*spm_matrix([-1 -1 -1]);
   VV(1).dim = ceil(VV(1).mat \ [bb(2,:) 1]' - 0.1)';
   VV(1).dim = VV(1).dim(1:3);
   spm_reslice(VV,struct('mean',false,'which',1,'interp',0)); % 1 for linear
end
以下函数(来自 此处)将对图像进行刚性对齐,以匹配 T1 模板
function auto_reorient(p)
if ~nargin
    [p,sts] = spm_select(Inf,'image');
    if ~sts, return; end
end
p = cellstr(p);
vg = spm_vol(fullfile(spm('Dir'),'canonical','avg152T1.nii'));
tmp = [tempname '.nii'];
for i=1:numel(p)
    spm_smooth(p{i},tmp,[12 12 12]);
    vf = spm_vol(tmp);
    M  = spm_affreg(vg,vf,struct('regtype','rigid'));
    [u,s,v] = svd(M(1:3,1:3));
    M(1:3,1:3) = u*v';
    N  = nifti(p{i});
    N.mat = M*N.mat;
    create(N);
end
spm_unlink(tmp);
