(医学三维重建)MATLAB体绘制算法:多层面重建(MPR)
算法原理代码实现测试结果其他
by HPC_ZY
算法原理
体绘制中比较特殊的一种,因为它的输出是各种切面。 就好比用刀切开一个物体,再用相机拍下切面的样子; ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d6e6a231bf2534f6a821210a508c2331.jpeg)
因此我们只需要定义一个平面网格,再把网格点所在位置的体像素值提取出来即可。 ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/53fa51e177ef7ead8a3a8d3bedb35001.png)
代码实现
数据准备 关于model怎么生成,请查看三维体数据的生成
% 不得不说的事:
% 这个model是从医院拿的DICOM数据,然后事先读取进来的。
% 也不一定非得医学图像,你可以用任意你自己准备好的三维数据。
% 再简单一点讲,model就是一个M*M*D的数组,里面很很多数值,就能用来重建。
model = im2double(model); % 模型
[mRows,mCols,mDims] = size(model); % 模型尺寸
参数设定 为了保证整个物体都能显示,所以切面尺寸设置为三维中最大的。也可以设置的很小,显示局部信息。
% 切面尺寸(推荐使用默认设置,当然你可以自行设置)
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;
网格生成
% 转为弧度
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
数据采样
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=1&&y=1&&z |