我有三个部分(顶部,中间,底部)灰度图像(3D)。在每个部分中,我都有一个坐标为(x,y)和强度值为[0-255]的点。每个部分之间的距离为20像素。 我创建了一个插图来展示如何使用显微镜生成这些图像:
插图(侧视图):红线是感兴趣的对象。蓝星代表在顶部,中部和底部区域可见的点。这些点的(x,y)坐标是已知的。对象的长度保持不变,但是可以在空间中旋转-“焦点不清晰”(插图显示了在时间点5处的旋转线)。在时间点1,红线静止(在2D图像中:2个点,其距离等于对象的长度)。
我想通过使用强度的变化,关于物体长度的知识以及我所掌握的部分中的信息来估计端点(表示为星形)的x,y,z坐标。任何帮助将不胜感激。
以下是图像的示例:
答案 0 :(得分:1)
我猜正确的方法是为您的 bot 和 top 帧记录三个z
坐标略有不同的图像,然后执行3D -deconvolution(使用Richardson-Lucy或其他算法)。
但是,更简单的方法将是我在评论中概述的方法。如果您将数据用于出版物,则强烈建议您强调这只是一种估计,并包括完成该过程的步骤。
我建议执行以下步骤:
由于我没有您的PSF数据,因此我通过将PSF估算为3D-Gaussiamn来伪造一些数据。当然,这是一个很大的简化,但是您应该能够将其背后的想法理解。
首先,沿z
将高斯拟合到PSF:
[xg, yg, zg] = meshgrid(-32:32, -32:32, -32:32);
rg = sqrt(xg.^2+yg.^2);
psf = exp(-(rg/8).^2) .* exp(-(zg/16).^2);
% add some noise to make it a bit more realistic
psf = psf + randn(size(psf)) * 0.05;
% view psf:
%
subplot(1,3,1);
s = slice(xg,yg,zg, psf, 0,0,[]);
title('faked PSF');
for i=1:2
s(i).EdgeColor = 'none';
end
% data along z through PSF's center
z = reshape(psf(33,33,:),[65,1]);
subplot(1,3,2);
plot(-32:32, z);
title('PSF along z');
% Fit the data
% Generate a function for a gaussian distibution plus some background
gauss_d = @(x0, sigma, bg, x)exp(-1*((x-x0)/(sigma)).^2)+bg;
ft = fit ((-32:32)', z, gauss_d, ...
'Start', [0 16 0] ... % You may find proper start points by looking at your data
);
subplot(1,3,3);
plot(-32:32, z, '.');
hold on;
plot(-32:.1:32, feval(ft, -32:.1:32), 'r-');
title('fit to z-profile');
将强度I
与z
坐标相关联的函数是
gauss_d = @(x0, sigma, bg, x)exp(-1*((x-x0)/(sigma)).^2)+bg;
您可以为x
重新安排此公式。由于平方根,有两种可能性:
% now make a function that returns the z-coordinate from the intensity
% value:
zfromI = @(I)ft.sigma * sqrt(-1*log(I-ft.bg))+ft.x0;
zfromI2= @(I)ft.sigma * -sqrt(-1*log(I-ft.bg))+ft.x0;
请注意,我伪造的PSF被标准化为最大值。如果您的PSF数据未标准化,则可以将其除以最大值。
现在,您可以使用zfromI
或zfromI2
来获取强度的z
坐标。同样,I
应该归一化,即强度与参考点强度的比例:
zfromI(.7)
ans =
9.5469
>> zfromI2(.7)
ans =
-9.4644
请注意,由于我添加的随机噪声,您的结果可能看起来略有不同。