有时画图的时候,需要画三维的小球分布图,但是如果用MATLAB自带的scatter3函数,没有投影透视关系等,不够真实。考虑到再成像系统中,用微球测定的PSF都是高斯分布的,故而需要画高斯截面的小球。这个程序可以生成小球位于任意位置、任意数量的三维小球矩阵。
画一个高斯截面的小球的函数(其实就是3d高斯函数):
%画三维小球的程序。用gauss函数。
%xv是输入的一个空白图像,就是一个 Nx * Ny * Nz 的矩阵,在这个矩阵里画小球。
%mu是小球的位置中心,是一个具有3个元素的向量。
%sigma代表小球的半径。也是一个具有3个元素的向量。就是可以画一个椭球。
%yv是这个函数画完小球的输出的矩阵。它的大小与xv一样。
function [yv] = Gaussian3(xv,mu,sigma)
[X,Y,Z]=meshgrid(1:size(xv,1),1:size(xv,2),1:size(xv,3));
X=permute(X,[2,1,3]);
Y=permute(Y,[2,1,3]);
Z=permute(Z,[2,1,3]);
yv=exp(-((X-mu(1)).^2/(2*sigma(1)^2)+(Y-mu(2)).^2/(2*sigma(2)^2)+(Z-mu(3)).^2/(2*sigma(3)^2)));
end
如果要画多个小球,这个函数应当这样使用:
例程:
pos3=[25,26,27;45,65,45;15,85,99];%pos3是小球的位置坐标(单位为像素),一个小球一行
imout=zeros(Nx,Ny,Nz);%声明一个三维矩阵用于画小球,注意矩阵三个维度的大小都一定要比小球最大的位置坐标更大。
for i=1:size(pos3,1)
yv = peakIntensity(i)*Gaussian3(imout,pos3(i,:),[r r r]);
imout(yv>imout)=yv(yv>imout);
end
%最终画好的多小球的图就是imout
画好的小球可以用imagej的3D project展示:
可以看出,小球具有明显的高斯分布截面,能模拟真实情况