Допустим, вы смотрите на какой-то объект через микроскоп и хотите найти его положение во времени. Вы также хотите делать это много, поэтому вам нужно автоматизировать это.

Математическая формула для этого довольно проста (это для одной оси, но то же самое для другой)*;

но давайте попробуем расшифровать это, что это значит. Таким образом, вместо того, чтобы находить центр масс, мы хотим найти центр интенсивности, но здесь используется тот же принцип. У нас есть изображение I высотой i пикселей и шириной j пикселей. x – координата x пикселя. Знаменатель суммирует все значения в каждом пикселе изображения. Числитель немного сложнее. В таких уравнениях я всегда выбираю пример, а затем пытаюсь понять обобщение.

Итак, давайте выберем i = 3. xi в данном случае равно 3, позиции 3-го столбца пикселей. I3j — это значения в третьем столбце изображения, а остальные j — строки. По сути, мы умножаем каждый столбец пикселей на соответствующую координату x. Итак, первый столбец умножается на 1, второй на 2… и т. д. Теперь я начинаю понимать это в уме. Я вижу, что операция, которую мы должны сделать, это умножить каждую строку пикселей в изображении на массив, содержащий x координата каждого столбца. Итак, в моих нацарапанных заметках это выглядит так;

Суммирование означает, что мы затем складываем все строки вместе, а затем складываем все эти числа вместе.

Это взвешенное суммирование, деленное на общую интенсивность, дает нам координату x центра масс (интенсивности). Если мы повторим это, но для другой оси, или транспонируем исходное изображение и повторим тот же код, мы получим координату y.

Что это позволяет нам делать? Представьте, что у нас есть движущийся объект; теперь мы можем отслеживать центр его положения во времени.

В этой короткой анимации я перемещаю прямоугольник и использую алгоритм отслеживания центра масс, чтобы найти его положение, обозначенное красным кругом. Извлекая координаты x и y во времени, мы можем построить прекрасный график пути объекта во времени.

Если вы хотите запрограммировать такой код, ниже вставлена ​​функция MATLAB, которая это сделает.

function [x,y] = com(cr_dig) % настроить функцию с именем com, которая опирается на одну входную переменную cr_dig, в данном случае изображение, представленное двумерной матрицей 8-битных целых чисел

% Обратите внимание, что в MATLAB матрица называется двумерным массивом.

% для простоты мы предполагаем, что любое изображение будет квадратным

cr_dig_lin = изменить форму (cr_dig, [1, numel (cr_dig)]); % изменить форму массива из 2D в 1D, чтобы мы могли выполнять над ним некоторые другие операции

D_neg = (cr_dig(:,:)-медиана(cr_dig_lin)); % вычесть срединное значение изображения из изображения

порог = абс (D_отрицательный); % найти абсолютное значение каждого пикселя

testj = linspace(1,size(thresh,2),size(thresh,2));

newcoljx = bsxfun(@times,testj,thresh); % bsxfun — умная функция в MATLAB, которая выполняет операции между векторами и столбцами матрицы.

newrowix = сумма (newcoljx, 2);

%вычислить ком в х

х = сумма (newrowix)./сумма (сумма (thresh));

testi = linspace(1,size(thresh,1),size(thresh,1));

newrowiy = bsxfun(@times,testi.’,thresh);

newcoljy = сумма (newrowiy, 1);

%вычислить com в y

y = сумма (newcoljy)./сумма (сумма (thresh));

конец

*Biophys J. Октябрь 2001 г.; 81(4): 2378 – 2388 doi: 10.1016/S0006–3495(01)75884–5