【问题标题】:Calculate 3D distance based on change in intensity根据强度变化计算 3D 距离
【发布时间】:2019-07-01 10:24:44
【问题描述】:

我有灰度图像 (​​3D) 的三个部分(顶部、中间、底部)。在每个部分中,我都有一个坐标 (x,y) 和强度值 [0-255] 的点。每个部分之间的距离为 20 像素。 我创建了一个插图来展示这些图像是如何使用显微镜生成的:

插图

插图(侧视图):红线是感兴趣的对象。蓝色星星代表在顶部、中间、机器人部分可见的点。这些点的 (x,y) 坐标是已知的。物体的长度保持不变,但它可以在空间中旋转 - “失焦”(插图显示时间点 5 处的旋转线)。在时间点 1,红线处于静止状态(在 2D 图像中:2 个点,距离等于对象的长度)。

我想通过强度的变化、关于物体长度的知识和我拥有的部分中的信息来估计端点的 x、y、z 坐标(表示为星星)。任何帮助将不胜感激。

以下是图片示例:

机器人部分

中段

顶部

我的 3D PSF 数据: https://drive.google.com/file/d/1qoyhWtLDD2fUy2zThYUgkYM3vMXxNh64/view?usp=sharing

目前的尝试: enter image description here

【问题讨论】:

  • 您知道点的(x,y)-坐标还是需要找到它们?
  • 我知道坐标。基本上,我想根据强度变化来估计“z”坐标。
  • 如果不知道z-坐标和强度之间的关系,这是不可能的。如果您告诉我们图像是如何生成的,可能会有所帮助。
  • 感谢您回来。我创作了一幅漫画来说明这个问题。我有延时图像,我认为它们可以用作参考(两个点都是可见的并且共享相同的强度分布)来估计 z 坐标。
  • 再一次,您没有提供图像是如何生成的信息。显微镜?

标签: image matlab 3d processing euclidean-distance


【解决方案1】:

我想正确的方法是为你的 bot 和你的 top 帧记录三个 z-坐标略有不同的图像,然后进行 3D 反卷积(使用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');

将强度Iz坐标相关联的函数是

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 已标准化为最大值为 1。如果您的 PSF 数据未标准化,您可以将数据除以其最大值。

现在,您可以使用zfromIzfromI2 来获取您的强度的z 坐标。同样,I 应该被归一化,即强度与参考点强度的比例:

zfromI(.7)

ans =

    9.5469

>> zfromI2(.7)

ans =

   -9.4644       

请注意,由于我添加了随机噪声,您的结果可能看起来略有不同。

【讨论】:

  • 首先,非常感谢您的帮助。我非常感谢您的玩具示例,我想我理解您建议的步骤。我将 otf 文件 (PSF) 转换为 Tiff,并将其附加到原始帖子中。我应该提到这些图像是从反卷积显微镜系统拍摄的。我想我不必使用额外的 3D 反卷积,对吧?由于 PSF(见图片)是对称的,我可以简单地使用任何一个。
  • 如果图像中的数据已经去卷积,我建议寻找一种方法来找出去卷积软件中的z坐标(可能是深度颜色编码的图像或类似的)。我会毫不犹豫地致电软件支持。您附加的 PSF 图像不是 3D(可能在上传期间已转换),因此我无法将其用于我的简单方法。
  • 感谢您的帮助。这非常有用。我正在与软件公司联系,并会在获得更多信息后立即为您更新。
  • 您好 Patrick,我必须获得一个新的 PSF 才能获得 3D 信息。我在最初的帖子中附上了文件。我按照您的示例进行操作,但经过目视检查,估计的坐标似乎不正确。我使用样条曲线来拟合 z 轮廓,因为我的 PSF 远离高斯。你能看看我更新的 PSF 数据吗?非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多