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);