Skip to content

Commit d42f7a0

Browse files
committed
FEAT: clean_gwc now available in MB
1 parent e43fb8c commit d42f7a0

File tree

1 file changed

+8
-94
lines changed

1 file changed

+8
-94
lines changed

spm_CTseg.m

Lines changed: 8 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -192,20 +192,21 @@
192192
run.v_settings = v_settings;
193193
run.tol = tol;
194194
run.aff = 'Aff(3)';
195+
run.del_settings = 1e3;
195196
% image
196197
run.gmm.pr.file = {pth_int};
197198
run.gmm.pr.hyperpriors = [];
198199
run.gmm.chan.images = {Nii(1).dat.fname};
199200
run.gmm.chan.modality = 2;
200201
run.gmm.chan.inu.inu_reg = 1e6;
201202
% output settings
202-
out = struct;
203-
out.result = {fullfile(run.odir{1},['mb_fit_' run.onam '.mat'])};
204-
out.c = 1:K;
205-
out.wc = find(tc(:,2))';
206-
out.mwc = find(tc(:,3))';
207-
out.vox = vox;
208-
out.proc_zn = {@(x) clean_gwc(x, struct('gm',ix_gm,'wm',ix_wm,'csf',ix_csf))};
203+
out = struct;
204+
out.result = {fullfile(run.odir{1},['mb_fit_' run.onam '.mat'])};
205+
out.c = 1:K;
206+
out.wc = find(tc(:,2))';
207+
out.mwc = find(tc(:,3))';
208+
out.vox = vox;
209+
out.clean_gwc = struct('do',true,'gm',ix_gm,'wm',ix_wm,'csf',ix_csf,'level',1);
209210

210211
% fit model and write output
211212
jobs{1}.spm.tools.mb.run = run;
@@ -427,93 +428,6 @@
427428
npth = VO.fname;
428429
%==========================================================================
429430

430-
%==========================================================================
431-
function zn = clean_gwc(zn,ixt,level)
432-
if nargin < 2 || isempty(ixt)
433-
% Default SPM12 template ordering
434-
ixt = struct('gm',1,'wm',2,'csf',3);
435-
end
436-
if nargin < 3, level = 1; end
437-
438-
b = sum(zn(:,:,:,ixt.wm),4);
439-
440-
% Build a 3x3x3 seperable smoothing kernel
441-
kx=[0.75 1 0.75];
442-
ky=[0.75 1 0.75];
443-
kz=[0.75 1 0.75];
444-
sm=sum(kron(kron(kz,ky),kx))^(1/3);
445-
kx=kx/sm; ky=ky/sm; kz=kz/sm;
446-
447-
% Erosions and conditional dilations
448-
th1 = 0.15;
449-
if level==2, th1 = 0.2; end
450-
niter = 32;
451-
niter2 = 32;
452-
for j=1:niter
453-
if j>2
454-
th = th1;
455-
else
456-
th = 0.6;
457-
end % Dilate after two its of erosion
458-
for i=1:size(b,3)
459-
gp = double(sum(zn(:,:,i,ixt.gm),4));
460-
wp = double(sum(zn(:,:,i,ixt.wm),4));
461-
bp = double(b(:,:,i));
462-
bp = (bp>th).*(wp+gp);
463-
b(:,:,i) = bp;
464-
end
465-
spm_conv_vol(b,b,kx,ky,kz,-[1 1 1]);
466-
end
467-
468-
% Also clean up the CSF.
469-
if niter2 > 0
470-
c = b;
471-
for j=1:niter2
472-
for i=1:size(b,3)
473-
gp = double(sum(zn(:,:,i,ixt.gm),4));
474-
wp = double(sum(zn(:,:,i,ixt.wm),4));
475-
cp = double(sum(zn(:,:,i,ixt.csf),4));
476-
bp = double(c(:,:,i));
477-
bp = (bp>th).*(wp+gp+cp);
478-
c(:,:,i) = bp;
479-
end
480-
spm_conv_vol(c,c,kx,ky,kz,-[1 1 1]);
481-
end
482-
end
483-
484-
th = 0.05;
485-
for i=1:size(b,3)
486-
slices = cell(1,size(zn,4));
487-
for k1=1:size(zn,4)
488-
slices{k1} = double(zn(:,:,i,k1));
489-
end
490-
bp = double(b(:,:,i));
491-
bp = ((bp>th).*(sum(cat(3,slices{ixt.gm}),3)+sum(cat(3,slices{ixt.wm}),3)))>th;
492-
for i1=1:numel(ixt.gm)
493-
slices{ixt.gm(i1)} = slices{ixt.gm(i1)}.*bp;
494-
end
495-
for i1=1:numel(ixt.wm)
496-
slices{ixt.wm(i1)} = slices{ixt.wm(i1)}.*bp;
497-
end
498-
499-
if niter2>0
500-
cp = double(c(:,:,i));
501-
cp = ((cp>th).*(sum(cat(3,slices{ixt.gm}),3)+sum(cat(3,slices{ixt.wm}),3)+sum(cat(3,slices{ixt.csf}),3)))>th;
502-
503-
for i1=1:numel(ixt.csf)
504-
slices{ixt.csf(i1)} = slices{ixt.csf(i1)}.*cp;
505-
end
506-
end
507-
tot = zeros(size(bp))+eps;
508-
for k1=1:size(zn,4)
509-
tot = tot + slices{k1};
510-
end
511-
for k1=1:size(zn,4)
512-
zn(:,:,i,k1) = slices{k1}./tot;
513-
end
514-
end
515-
%==========================================================================
516-
517431
%==========================================================================
518432
function reslice2mni(res, pth_Mmni, Mmu)
519433
% Load affine matrix that aligns MB template with SPM template

0 commit comments

Comments
 (0)