SPM99 Gem 5: Mesh Plots of t–maps

Subject: Re: Mesh Plots of t-maps
From: John Ashburner <john@FIL.ION.UCL.AC.UK>
Date: Fri, 2 Feb 2001 11:14:20 +0000
To: SPM@JISCMAIL.AC.UK

| I am wishing to create Mesh plots in Matlab of the t-map produced
| from my SPM analysis. Being a somewhat Matlab virgin, I was wondering
| whether
| someone could possibly point me in the direction of exactly how to do this.
|
| Which mat file contains all t-values in the statistic image?

The t values are stored in spmT_????.img files, where ???? refers to
the contrast number.  You can read the values from these images into
Matlab something like:

        pl    = 30; % plane 30
        fname = spm_get(1,'*.img','Name of t image');
        V     = spm_vol(fname);
        M     = spm_matrix([0 0 pl]);
        img   = spm_slice_vol(V,M,V.dim(1:2),1);

Displaying the values can be dome something like:
        surf(img);

There are loads of commands for 3D visualisation in Matlab 5.x.  You can
find out what these are by typing:
        help graph3d

All the best,
-John

SPM99 Gem 4: Histogram of an image

Subject: Re: t-distribution display (histogram) with spm99b
From: john@fil.ion.ucl.ac.uk (John Ashburner)
Date: Fri, 30 Jul 1999 14:06:20 +0100
To: spm@mailbase.ac.uk, jovicich@humc.edu


The attached program should produce the histograms you are after.  To
call it, type:

	V      = spm_vol(spm_get(1,'*.img','Select image...'));
	[n, x] = histvol(V, 100);
	figure;
	bar(x,n);
  

[…]

Regards,
-John

The attached function is here histvol.m and below

function [n, x]=histvol(V, nbins)
% Create Histogram of an image volume
% FORMAT [n, x]=histvol(V, nbins)
% V     - mapped image volume (see spm_vol)
% nbins - number of bins to use.
% n     - number of counts in each bin
% x     - position of bin centres
%_______________________________________________________________________
% @(#)JohnsGems.html	1.42 05/02/02

if nargin==1, nbins = 256; end;

% determine range...
mx = -Inf;
mn =  Inf;
for p=1:V.dim(3),
	img = spm_slice_vol(V,spm_matrix([0 0 p]),V.dim(1:2),1);
	msk = find(isfinite(img));
	mx  = max([max(img(msk)) mx]);
	mn  = min([min(img(msk)) mn]);
end;

% compute histograms...
x = [mn:(mx-mn+1)/nbins:mx];
n = zeros(size(x));
for p=1:V.dim(3),
	img = spm_slice_vol(V,spm_matrix([0 0 p]),V.dim(1:2),1);
	msk = find(isfinite(img));
	n   = n+hist(img(msk),x);
end;
return;

SPM99 Gem 3: NaNing zero values

Subject: Re: normalization of contrast images
From: John Ashburner 
Date: Wed, 2 Aug 2000 14:37:38 +0100 (BST)
To: spm@mailbase.ac.uk, gpagnon@emory.edu
  

[…]

| And, while I am at it, does anybody know how to convert a mask that
| has zeros outside the brain to a mask that has NaN outside the brain?
| I tried ImCalc with something like 'i1(find(i1==0))=NaN', but it
| doesn't like it.

By default, ImCalc outputs the data as 16 bit integer with scalefactors.
There is no NaN representation for this, so the data would need to be
written as floating point or double precision floating point.  I think
you can do this by typing something like:
        P     = spm_get(1,'*.img');
        Q     = 'output.img';
        f     = 'i1.*(i1./i1)';
        flags = {0,0,spm_type('float'),1};
        spm_imcalc_ui(P,Q,f,flags);

Best regards,
-John
  

Note you can NaN-out voxels below a threshold, say, 3:


f = 'i1 + 0./(i1>3)'

Also note that this is a general way for making spm_imcalc write out images with float or double precision; concisely


f = 'sqrt(i1)'; % whatever you like

spm_imcalc_ui('in.img','out.img',f,{[],[],spm_type('float')});

Using  [],[] instead of  0,0 ensures that default values will be used for those two flags.

SPM99 Gem 2: Zeroing NaN values

In addition to setting NaN values to zero, this gem is also useful as a basic skeleton for reading each slice, doing something to it, and then writing it out.

Subject: Re: NaN values in beta values
From: John Ashburner 
Date: Mon, 23 Oct 2000 17:27:24 +0100 (BST)
To: spm@mailbase.ac.uk, steffejr@umdnj.edu

I can't think of any nice way of doing this with ImCalc, so I'm afraid
I'll have to show you a more labour intensive method that should be
modified slightly (as the filenames need changing) before pasting into
Matlab.

	VI       = spm_vol('original_beta.img');
	VO       = VI;
	VO.fname = 'patched_beta.img';
	VO       = spm_create_image(VO);
	for i=1:VI.dim(3),
		img      = spm_slice_vol(VI,spm_matrix([0 0 i]),VI.dim(1:2),0);
		tmp      = find(isnan(img));
		img(tmp) = 0;
		VO       = spm_write_plane(VO,img,i);
	end;


SPM99 Gem 1: Adding blobs to an image

Say you have a statistic image that you created outside of SPM and you want to overlay it on a structural image. The bare bones solution is as follows.

Create a thresholded version of the image, where all subthreshold voxels are set to NaN (See how to set NaNs below). Then…

Subject: Re: Your Message Sent on Fri, 19 Jan 2001 23:28:45 -0800
From: John Ashburner 
Date: Mon, 22 Jan 2001 11:40:24 +0000
To: SPM@JISCMAIL.AC.UK

I think it may take quite a bit of programming to get most of
the routines working with your data.  One thing to get you
started would be to try an undocumented feature of spm_orthviews.m:

        spm_orthviews('image',spm_get(1,'*.img','Select background image'));
        spm_orthviews('addimage',1,spm_get(1,'*.img','select blobs image'));

Best regards,
-John
  

Here’s a different approach, which I understand will show the blobs in a monotone color (instead of hot metal). Also, there are more bells and whistles (it’s less of a hack).

Subject: Re: overlaying resulting image
From: John Ashburner 
Date: Wed, 4 Oct 2000 10:37:01 +0100 (BST)
To: spm@mailbase.ac.uk, duann@salk.edu

| Would you please show me how to overlay a statistical map onto the brain
| template SPM uses. Let's say I have an analyze-formated statistical
| map obtained from other software. It was already normalized to the same
| coordinates as the template images SPM has. How can I overlay this image
| onto the SPM template just like the results shown in SPM convention.

The following is supposed to work.  It uses a hidden undocumented
feature in SPM99, so it may contain bugs....

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

P1 = spm_get(1,'*.img','Specify background image');
P2 = spm_get(1,'*.img','Specify blobs image');

% Clear graphics window..
spm_clf

% Display background image..
h = spm_orthviews('Image', P1,[0.05 0.05 0.9 0.9]);

% Display blobs in red.  Use [0 1 0] for green, [0 0 1] for blue
% [0.6 0 0.8] for purple etc..
spm_orthviews('AddColouredImage', h, P2,[1 0 0]);

% Update the display..
spm_orthviews('Redraw');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Best regards,
-John