|

点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
+ s- }* G) f) o- }7 H6 e2 `: |9 v0 j
ohs0ktgvdtd64018948345.jpg
3 M; S. p w3 @9 y6 H/ {% [
好玩的matlab
: L. _ I+ ?# x0 c7 L带你解锁不一样的matlab新玩法9 |( L' d$ V$ ]. |% I. w% G
# d. w# T* K. W, }% C, W好久没有写推文了,今天整理 以 slice切片的形式展现mri脑核磁共振数据喜欢此推文的小伙伴们记得点赞+关注+分享!% {6 c3 h6 N8 P' _9 t& s1 X+ _
效果图
8 r/ }. R* C* _4 _2 X1 {7 x6 Q
3w5i1aqcl4x64018948445.png
4 Q0 ^% ]; z6 f' }0 K4 P( A
) g8 z; U L" B9 K5 f! N/ `
hzq1wivy5iy64018948545.png
* D+ a l- T: u0 S: ~
& R! D; ~ U1 n3 |4 C
v4jctbwj0te64018948645.png
' T8 J i) }) p! P' f* Q# h2 U i6 ~. D' C( U
xe32nfa3sv464018948745.png
6 y) ~' d6 R- j* G7 h i A" O/ r, b h0 g. }2 \. W
3kkoficecrw64018948846.png
a( ~7 ~/ n8 u, U$ e+ W# E
8 c2 H# C: y' M; e8 @; J' _$ a: {9 C/ m% U8 J) e6 d( F; ~ R6 ^- R
将多个图像帧以矩阵形式显示9 {$ r( z) ^8 q& y. b' D5 r/ x* j
% 加载数据clc;clear;close all;load('mri.mat')figuremontage(D,map)
# ]* D' J% ^1 S/ L5 y( X$ b0 b
dpsjpyb1ces64018948946.png
2 g, O4 A. U0 K ^
$ U. ^ F6 C* q D6 c0 u横截面视图
# C8 x6 B. c' X5 N |%% 切片(横截面视图)% 改变数据格式D = double(squeeze(D));D(D==0)=nan;%% 为了探索,从这组中绘制几个MRI图像(水平切片)% 布局图形;指导使用随数据集提供的颜色图figurem=colormap('turbo');colormap(m);% 查看水平切片whichSlices = 3:4:27;slice(1:128,1:128,1:27,D,[],[],whichSlices);shading interp;
! p8 G W7 O8 b6 J, ]' r+ O4 W% e, j% |% 设置视图zoom(1.2);campos([-706 -778 111]);zlim([1 25]);ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.ZMinorTick='on'; % 打开z轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小1 j) V- T" o5 p: c2 O2 F+ A
bxk1faznaon64018949046.png
; f. q2 b6 U- v& y* \3 U8 W4 a6 G+ x; z' G6 E! U' |5 e$ D
创建具有不同方向的切片组合
( g. ~; `) z4 W# g* p* C; ^3 J$ p%% 创建具有不同方向的切片组合figure;% 选择一种颜色图,反转它使得低值是浅色的m=colormap('jet');m = m(end:-1:1,:);colormap(m);% 制作切片h=slice(1:128,1:128,1:27,double(D),63,40,[1:5:25]);shading interp; axis tight;% 设置透明度,使得低值不可见set(h(1),'alphadata',squeeze(double(D(90,:,:))),'facealpha','interp'); alim([0 2])set(h(2),'alphadata',squeeze(double(D(:,50,:))),'facealpha','interp'); alim([0 2])set(h(3),'alphadata',squeeze(double(D(:,:,1))),'facealpha','interp'); alim([0 2])set(h(4),'alphadata',squeeze(double(D(:,:,15))),'facealpha','interp'); alim([0 2])% 设置视图daspect([128 128 27]);campos([-637 366 177]);ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.ZMinorTick='on'; % 打开z轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小* D$ V. C6 J. V% E, k
myp2kxr3b5i64018949146.png
8 @ l _+ o0 r6 S
( N" D+ P, l+ ^6 g探究其他横截面
0 Y6 ~# [* s# s2 ]%% 探究其他横截面figure;hold on;view(3);m=colormap('turbo');colormap(m);% 定义想要旋转的切片hslice = slice(1:128,1:128,1:27,double(D),[],[],15); shading interp; axis tight;% 旋转切片rotate(hslice,[-1,0,0],-35);% 从旋转的切片中提取x,y和z数据xd1 = get(hslice,'XData');yd1 = get(hslice,'YData');zd1 = get(hslice,'ZData');% 删除旋转的切片delete(hslice);% 使用提取的数据调用切片函数h=slice(1:128,1:128,1:27,D,xd1,yd1,zd1); shading interp; axis tight;% 设置其透明度也对应数据值set(h,'alphadata',squeeze(D(:,:,15)),'facealpha','interp'); alim([0 2])% 声明两个其他水平切片h=slice(1:128,1:128,1:27,D,[],[],[1 18]); shading interp; axis tight;% 设置额外切片的透明度set(h(1),'alphadata',squeeze(D(:,:,1)),'facealpha','interp'); alim([0 2])set(h(2),'alphadata',squeeze(D(:,:,18)),'facealpha','interp'); alim([0 2])% 设置视图zlim([1 27]);box oncampos([-710.945 617.6196 126.5833]);ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.ZMinorTick='on'; % 打开z轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小% q# H3 u0 ?) a3 k% [" w4 ?# H7 z
izpdjzrcncw64018949246.png
+ R$ j5 y7 Q8 n' S4 S) k! D; s( Z3 }8 W
非平面切片# T" k' z# L) @1 B* Z% z
%% 非平面切片 % 添加一个边界切片figure;m=colormap('turbo');colormap(m);h=slice(1:128,1:128,1:27,double(D),[],[],[1 13 18]); shading interp; axis tight; hold on;set(h(1),'alphadata',squeeze(double(D(:,:,1))),'facealpha','interp'); alim([0 2])set(h(2),'alphadata',squeeze(double(D(:,:,13))),'facealpha','interp'); alim([0 2])set(h(3),'alphadata',squeeze(double(D(:,:,18))),'facealpha','interp'); alim([0 2])% 创建你想要投影的表面[xsp,ysp,zsp] = sphere;% 缩放并转移你的表面% 使其覆盖数据区域hsp = surface(30*xsp+60,30*ysp+60,10*zsp+13);% 获取数据xd = get(hsp,'XData');yd = get(hsp,'YData');zd = get(hsp,'ZData');% 删除临时表面delete(hsp)% 作为切片命令的一部分绘制表面hslicer = slice(1:128,1:128,1:27,squeeze(D),xd,yd,zd);shading interp;% set(hslicer,'alphadata',squeeze(double(D(:,:,18))),'facealpha','interp'); alim([0 2])% 设置视图axis tight view(-103.5,28);1 S5 Q% C, |5 I% b( y9 F4 C5 u
ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.ZMinorTick='on'; % 打开z轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小
" J+ |' p" {/ `" q
whclrerxutf64018949347.png
7 I3 \4 s; B, v! K, a& T' K3 F
6 S" \( |5 _5 x0 p" V. _$ H! z7 M
滑块交互式切片% {/ h! V, x9 m
%% 滑块交互式切片figure('units','normalized','position',[.35 .36 .29 .54]);set(gcf,'color',[1 1 1],'paperpositionmode','auto');s = volumeVisualization(1:128,1:128,1:27,double(D));ax = gca; % 获取当前坐标轴句柄grid on; % 打开网格线box on; % 显示坐标轴边框ax.LineWidth = 1; % 设置坐标轴线宽ax.XMinorTick = 'on'; % 打开x轴次要刻度线ax.YMinorTick = 'on'; % 打开y轴次要刻度线ax.ZMinorTick='on'; % 打开z轴次要刻度线ax.TickDir = 'out'; % 设置刻度线方向向外ax.GridLineStyle = '--'; % 设置网格线样式为虚线ax.FontSize = 14; % 设置坐标轴字体大小) V5 |8 e0 ?; |9 V I2 l+ ]
% 添加uicontrol用于xannotation('textbox',[.75,.1388,.06,.05],'String','X','fontweight','bold','linestyle','none');hSliderx = uicontrol(... 'Units','normalized', ... 'Position',[.79 .13 .2 .05], ... 'Style','slider', ... 'Min',s.xMin, ... 'Max',s.xMax, ... 'Value',s.xMin, ... 'tag','x',... 'userdata',s,... 'Callback',@volVisSlicesUpdateSliderPosition);
2 m3 j# B* M! t8 _# D0 s7 @% 添加uicontrol用于yannotation('textbox',[.75,.0788,.06,.05],'String','Y','fontweight','bold','linestyle','none');hSlidery = uicontrol(... 'Units','normalized', ... 'Position',[.79 .07 .2 .05], ... 'Style','slider', ... 'Min',s.yMin, ... 'Max',s.yMax, ... 'Value',s.yMin, ... 'tag','y',... 'userdata',s,... 'Callback',@volVisSlicesUpdateSliderPosition);8 K" N# m2 z; K# E$ K
% 添加uicontrol用于zannotation('textbox',[.75,.0088,.06,.05],'String','Z','fontweight','bold','linestyle','none');hSliderz = uicontrol(... 'Units','normalized', ... 'Position',[.79 .01 .2 .05], ... 'Style','slider', ... 'Min',s.zMin, ... 'Max',s.zMax, ... 'Value',s.zMin, ... 'tag','z',... 'userdata',s,... 'Callback',@volVisSlicesUpdateSliderPosition);
& r. j5 }8 N) {; l6 e+ w5 x. E: E y
pmpmmmk2kej64018949447.png
$ v2 N2 j9 r' h- -THE END- -4 `0 ]: ^6 { v' t( ?' R
源码下载:gitee下载:https://gitee.com/iDMatlab/slice-demo-mri: C; H7 k M+ t, a+ J
扫一扫
: ^9 o3 V/ a2 z: [5 X- @
2zm3nb03hyn64018949547.png
' O, x# c$ T) n7 x7 F
参考资料:
* u' D3 V; ]! X! u% n" V【1】https://www.mathworks.com/help/releases/R2021b/images/ref/montage.html【2】https://www.mathworks.com/help/releases/R2021b/matlab/ref/slice.html |
|