Полагаю, правильным подходом было бы записать три изображения с немного разными z
-координатами для вашего бота и вашего верхнего кадра, а затем выполнить деконволюцию в 3D (используя Ричардсон-Люси или любой другой алгоритм).
Однако более простой подход был бы, как я обрисовал в своем комментарии.Если вы используете данные для публикации, я настоятельно рекомендую подчеркнуть, что это всего лишь приблизительная оценка, и указать, как вы это сделали.
Я бы предложил следующую процедуру:
Поскольку у меня нет ваших PSF-данных, я подделываю некоторые, оценивая PSF как 3D-гауссиамн.Конечно, это сильное упрощение, но вы должны быть в состоянии понять эту идею.
Сначала установите гауссиан в PSF вдоль z
:
[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
Обратите внимание, что из-за случайный шум, я добавил, ваши результаты могут немного отличаться,