Рассчитать 3D расстояние на основе изменения интенсивности - PullRequest
0 голосов
/ 01 июля 2019

У меня есть три раздела (верх, середина, бот) изображений в оттенках серого (3D).В каждом разделе у меня есть точка с координатами (x, y) и значениями интенсивности [0-255].Расстояние между каждым участком составляет 20 пикселей.Я создал иллюстрацию, чтобы показать, как эти изображения были получены с помощью микроскопа:

Иллюстрация
Illustration.

Иллюстрация (вид сбоку): красная линия - этообъект интереса.Синие звезды обозначают точки, которые видны в верхней, средней части бота.Координаты (x, y) этих точек известны.Длина объекта остается неизменной, но она может вращаться в пространстве - «не в фокусе» (на рисунке показана вращающаяся линия в момент времени 5).В момент времени 1 красная линия отдыхает (в 2D-изображении: 2 точки с расстоянием, равным длине объекта).

Я хочу оценить координаты x, y, z конечных точек (представленных в виде звезд), используя изменения интенсивности, знания о длине объекта и информацию в разделах, которые у меня есть,Любая помощь будет оценена.

Вот пример изображений:

Бот-секция
Bot section

Средняя секция
Mid section

Верхняя часть
Top section

PSF изображение

1 Ответ

1 голос
/ 01 июля 2019

Полагаю, правильным подходом было бы записать три изображения с немного разными 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');

enter image description here

Функция, которая связывает интенсивность 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       

Обратите внимание, что из-за случайный шум, я добавил, ваши результаты могут немного отличаться,

...