Brain surface plot with MatLab

1 min read

This is an example of brain activation plotted on surface. In many circumstances surface view is much more straightforward than a slice view. Here is how I created such a plot using MatLab and SPM.

Environment and Tools:

  1. Windows XP
  2. MatLab (v7.6)
  3. SPM (v8)

Step 1. Generate “faces” and “vertices” of the surface using SPM

If you prefer to use SPM’s interface, launch SPM, then click “Render …” box and click “Xtract surface”. You are asked to input an image file. Select an image file and press Done. Select “Save Extracted Surface” and a few seconds later you will find a file called “surf_???.mat” saved in the current directory. Load this mat file and you will find two variables, faces and vertices. These two variables will be used in the future steps.

If you prefer to use command line, you can simple call function

spm_surf(‘xxx.img’, threshold)

About the input image: If you want to plot surface of brain, you should use a segmentation tool (such as FSL) to get the gray matter image, and use this image as input to spm_surf. If you want to plot the surface of skull, you can input the original structural image but with careful choice of threshold.

Step 2. Plot the surface

Plot using MatLab’s patch function. Here is a sample code

p=patch(‘faces’,faces,’vertices’,vertices, ‘facecolor’, ‘flat’,  ‘edgecolor’, ‘none’, ‘facealpha’, 1);
facecolor = repmat([1 1 1], length(faces), 1);
set(p,’FaceVertexCData’,facecolor);

daspect([1 1 1])
view(3); axis tight
view([50 -40 100])
camlight
lighting gouraud

Step 3. Overlay a functional image
The strategy here is that you first get the coordinates of the activated voxels and the corresponding colors you want to use for each voxel (presumablly dependent on the intensity of each voxel). Then find the vertices and faces that are “close” to the coordinates, and change the face color.

a. get coordinates

v = spm_vol(imagefile); % functional image file
m = spm_read_vols(v);
pos = find(m>=threshold);

[xyzcor(:,1) xyzcor(:,2) xyzcor(:,3)] = ind2sub(size(m), pos);
xyz = cor2mni(xyzcor, v.mat);
intensity = m(pos);

b. convert intensity to color

tmp = hot; % using ‘hot’ color scheme
mx = max(intensity);
mn = min(intensity);
intensity = round((intensity – mn)/(mx – mn) * 63 + 1);
colors = tmp(intensity,:);

c. plot

distanceThreshold = 2;
p=patch(‘faces’,faces,’vertices’,vertices, ‘facecolor’, ‘flat’,  ‘edgecolor’, ‘none’, ‘facealpha’, 1);
facecolor = repmat([1 1 1], length(faces), 1);
pos = [];
for ii=1:size(xyz, 1)
tmp = find(abs(vertices(:,1) – xyz(ii, 1)) <= distanceThreshold & abs(vertices(:,2) – xyz(ii, 2)) <= distanceThreshold & abs(vertices(:,3) – xyz(ii, 3)) <= distanceThreshold  );
pos = [tmp];
posf = find(sum(ismember(faces, pos),2)>0);
facecolor(posf,:) = repmat(colors(ii,:), length(posf), 1);
end

set(p,’FaceVertexCData’,facecolor);

daspect([1 1 1])
view(3); axis tight
view([50 -40 100])
camlight
lighting gouraud




写作助手,把中式英语变成专业英文


AI writing papers with real references


Want to receive new post notification? 有新文章通知我

第七十六期fNIRS Journal Club通知2026/11/14, 10am 周思远博士

文化经验会影响个体如何理解和解释世界,但短暂跨文化交流能否改变思维?这种变化又体现在哪些认知加工层面?来自四川师范大学的周思远博士将分享一项结合fNIRS超扫描、眼动追踪与自然语言处理的研究,其通过比
Wanling Zhu
10 sec read

第七十五期fNIRS Journal Club视频 张浩云团队

Youtube: https://youtu.be/MB3nIDg4fMo 优酷:https://v.youku.com/v_show/id_XNjU3Nzk4MDA0OA==.html 语言学习本质
Wanling Zhu
19 sec read

第七十五期fNIRS Journal Club通知2026/10/10, 10am 张浩云团队

语言学习本质上是社会性、交互性的过程,但现有对其神经机制的研究大多仅从学习者个体层面开展。来自澳门大学的张浩云团队将分享一项fNIRS超扫描研究,探讨语言学习中师生互动的神经机制,包括师生神经同步如何
Wanling Zhu
14 sec read

12 Replies to “Brain surface plot with MatLab”

  1. thanks for your information. very usefule. But, what’s the function of cor2mni? Is it a spm function or your private one??

  2. Dear Prof. Cui,
    Thanks for your information. When I use SPM to save extract surface, there is only a file named *.surf.gii,
    not the surf_???.mat file. Could you tell me why
    I can’t get the .mat file? Is there any mistakes with me?

    thanks

    shuixia

  3. Dear xu cui
    thank for usefull informations,i have a 144 jpg brain slices and i managed to reconstruct them into 3d VOLUME using isosurface and patch commands of matlab.now i want display only the 3d surface of this volume using only matlab.wish to hear from u.

  4. Hello Mr Chu, I am new in matlab and SVM coding. Please I want to know how I can obtain the frequency, Scale, Phase etc parameters from Matching Pursuit and Gammatonne Frequency Cepstral Coefficient algorithms in order to detect and recognize environmental sound. Thank you very much as I await your response

  5. Dear Mr Cui, I am new in matlab and SVM coding. Please I want to know how I can obtain the frequency, Scale, Phase etc parameters from Matching Pursuit and Gammatonne Frequency Cepstral Coefficient algorithms in order to feed them into the SVM classifier to detect and recognize environmental sound. Thank you very much as I await your response

  6. @Rosemary
    Rosemary, while I want to help, I am not in your field and have no idea what “Matching Pursuit and Gammatonne Frequency Cepstral Coefficient” are.

Leave a Reply

Your email address will not be published. Required fields are marked *