点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!7 _" P/ P t( E
2 a0 T3 _5 B3 z
ohs0ktgvdtd64018948345.jpg
8 E4 q! @' V8 A! _
好玩的matlab
; W# ~: w: m! }" f R带你解锁不一样的matlab新玩法
4 K4 [5 o. V% E. \2 ?; L8 A, i) w$ |: P, f6 s9 Z. e
好久没有写推文了,今天整理 以 slice切片的形式展现mri脑核磁共振数据喜欢此推文的小伙伴们记得点赞+关注+分享!+ U( d# B/ p4 [' K
效果图; F# e1 O, |! W: M$ |
3w5i1aqcl4x64018948445.png
3 Q: m& A6 O& n, g; K, l0 j, z$ \" C9 t' c* {
hzq1wivy5iy64018948545.png
1 J. ]: v, Z% M/ z
9 o0 H9 L( Y& P# |$ J( N
v4jctbwj0te64018948645.png
( r) a2 g' K( }2 G4 c6 q- n. M( g3 X5 |* x, s3 P' q* U
xe32nfa3sv464018948745.png
* Q3 t1 D9 w; Q* C% O
1 T) u1 H8 T, q O1 b
3kkoficecrw64018948846.png
1 A8 n7 X/ B: C# I9 j6 t
. L& n" j$ V @
" j" j6 O- ?: M: f9 ^/ U: k
将多个图像帧以矩阵形式显示
1 d m( ?% U0 i" n, O" {7 }% 加载数据clc;clear;close all;load('mri.mat')figuremontage(D,map)
! Z( e% L& s- n7 t) f2 N) v9 u
dpsjpyb1ces64018948946.png
" _- v8 O E0 }! z9 g+ j! X$ _
* i, W( W9 s* | F7 M F, v横截面视图% o/ i$ [- A" O. P
%% 切片(横截面视图)% 改变数据格式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;
6 P F3 p4 W+ ~% 设置视图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; % 设置坐标轴字体大小2 S( G r3 N E) `# b7 i
bxk1faznaon64018949046.png
8 k- s5 W6 N6 z, \4 ]$ j0 t
' I2 ]6 V; I2 S) l: G
创建具有不同方向的切片组合* ^: x- e3 z) G4 [& h/ i3 N
%% 创建具有不同方向的切片组合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; % 设置坐标轴字体大小
6 z9 ^" H, V6 ` W8 d4 P
myp2kxr3b5i64018949146.png
2 E( S- ^1 ?$ N7 v6 F
1 u0 N: N3 g2 H) k+ }, p探究其他横截面* y9 v; m) n+ @' U7 R+ {
%% 探究其他横截面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; % 设置坐标轴字体大小
; I" a) I5 h- R% z" h
izpdjzrcncw64018949246.png
9 d! l- j: m* o, X
1 S# j$ \# F; D$ \/ }
非平面切片
, }$ h( i7 W9 S O! s4 S0 w%% 非平面切片 % 添加一个边界切片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);
# m; p7 J2 T. k5 g/ u1 U3 q# Q; Xax = 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; % 设置坐标轴字体大小
: P1 v ]+ _" x! o% y0 R2 w
whclrerxutf64018949347.png
$ H# K( w8 d. [% z: S
) ], K) B7 D3 a4 u# L滑块交互式切片
1 c. S- p! \/ N9 T. e%% 滑块交互式切片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; % 设置坐标轴字体大小0 T/ {! [& c( s) \0 \
% 添加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);
! @1 U0 a$ N8 c' @% |* k! K% 添加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);
5 O9 q6 Y O6 T% 添加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);
( a( L$ G0 b* M! O: o; s
pmpmmmk2kej64018949447.png
$ ^% a% f& L# o! }* } q7 k- -THE END- -( U0 ?+ C8 ~0 w! q* Q
源码下载:gitee下载:https://gitee.com/iDMatlab/slice-demo-mri
4 C4 j! c% H4 u" B$ w扫一扫/ ]) D0 {/ N x
2zm3nb03hyn64018949547.png
* G- u. U+ H$ G' ~参考资料:" P, W, h F1 s9 Q/ s/ X
【1】https://www.mathworks.com/help/releases/R2021b/images/ref/montage.html【2】https://www.mathworks.com/help/releases/R2021b/matlab/ref/slice.html |