(医学三维重建)MATLAB体绘制算法:多层面重建(MPR)

(医学三维重建)MATLAB体绘制算法:多层面重建(MPR)


by HPC_ZY


算法原理

体绘制中比较特殊的一种,因为它的输出是各种切面。
就好比用刀切开一个物体,再用相机拍下切面的样子;
在这里插入图片描述

因此我们只需要定义一个平面网格,再把网格点所在位置的体像素值提取出来即可。
在这里插入图片描述


代码实现

  1. 数据准备
    关于model怎么生成,请查看三维体数据的生成
% 不得不说的事:
% 这个model是从医院拿的DICOM数据,然后事先读取进来的。
% 也不一定非得医学图像,你可以用任意你自己准备好的三维数据。
% 再简单一点讲,model就是一个M*M*D的数组,里面很很多数值,就能用来重建。
model = im2double(model); % 模型
[mRows,mCols,mDims] = size(model); % 模型尺寸
  1. 参数设定
    为了保证整个物体都能显示,所以切面尺寸设置为三维中最大的。也可以设置的很小,显示局部信息。
% 切面尺寸(推荐使用默认设置,当然你可以自行设置)
M = max([mRows,mCols,mDims]);
N = max([mRows,mCols,mDims]);
% 切面分辨率(推荐使用默认设置,当然你可以自行设置)
ms = 512;
ns = 512;
% 采样精度
precison = ([M,N]-1)./([ms,ns]-1);
% 切面中心(推荐使用默认设置,当然你可以自行设置)
mCenter = ([mRows,mCols,mDims]+1)/2;
% 切面旋转角(这个请随意改,就能从不同角度观察目标)
alpha = 0;
beta = 0;
gamma = 0;
  1. 网格生成
% 转为弧度
alpha = alpha/180*pi;
beta = beta/180*pi;
gamma = gamma/180*pi;
% 初始化网格
mesh.x = zeros(M,N);
mesh.y = zeros(M,N);
mesh.z = zeros(M,N);
% 计算网格
for r = 1:ms
    for c = 1:ns
        % 赋初值
        x = 1+(r-1)*precison(1);
        y = 1+(c-1)*precison(2);
        z = 0;
        % {中心旋转}
        % 移至原点
        x = x-mCenter(1);
        y = y-mCenter(2);
        % x轴逆时针旋转
        tmp = [x,y,z]; % 避免旋转中覆盖原值
        y = tmp(2)*cos(alpha)-tmp(3)*sin(alpha);
        z = tmp(2)*sin(alpha)+tmp(3)*cos(alpha);
        % y轴逆时针旋转
        tmp = [x,y,z]; % 避免旋转中覆盖原值
        x = tmp(1)*cos(beta)+tmp(3)*sin(beta);
        z = -tmp(1)*sin(beta)+tmp(3)*cos(beta);
        % z轴逆时针旋转
        tmp = [x,y,z]; % 避免旋转中覆盖原值
        x = tmp(1)*cos(gamma)-tmp(2)*sin(gamma);
        y = tmp(1)*sin(gamma)+tmp(2)*cos(gamma);
        % 移回中心
        mesh.x(r,c) = x+mCenter(1);
        mesh.y(r,c) = y+mCenter(2);
        mesh.z(r,c) = z+mCenter(3);
    end
end
  1. 数据采样
im = zeros(ms,ns);
% 注:为演示原理没有使用interp3()函数
for r = 1:ms
    for c = 1:ns
        % 此处使用最近邻插值
        x = round(mesh.x(r,c));
        y = round(mesh.y(r,c));
        z = round(mesh.z(r,c));
        if x>=1&&x<=mRows && y>=1&&y<=mCols && z>=1&&z<=mDims
            im(r,c) = model(x,y,z);
        end
    end
end
  1. 显示
imshow(im)

测试结果

模型尺寸为512x512x400
左上(alpha = 0,beta = 0,gamma = 0)
右上(alpha = 90,beta = 90,gamma = 0)
左下(alpha = 0,beta = 90,gamma = 0)

在这里插入图片描述


其他

  1. 三个基本平面为:水平面,矢状面,冠状面。如下图,
    在这里插入图片描述

  2. 关于我文中的model,是利用手里的dicom数据生成的,具体方法可参考文献一文献二。如果你还没有dicom数据,可以用MATLAB自带的核磁图像进行测试,调用方法如下:

% 注意注意注意: 
% MATLAB有个自带的影像数据,名为 mri.mat。
% 里面存有一个变量,名为 D 。 是一个四维数据(含时间轴,但实际上只有一帧)
load mri;
model = squeeze(D); % 所以这里使用squeeze,把时间轴去掉,变为三维矩阵。 就可以使用啦

% 然后接 1.数据准备里面的代码
  1. 如果你只是想显示(看看三维数据),对算法过程不关心。那么推荐下载三方可视化库,详情点击链接

  2. 有任何问题欢迎讨论,最后还是把测试代码上传
    (包含上述完整代码,以及基于MATLAB优化的代码,不含测试数据)
    https://download.csdn.net/download/xsz591541060/11372959
    如果你买了年VIP,请果断下载。

  • 19
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 40
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值