Calculations/Data-Analyzer/+Calculator/compute2DAutocorrelation.m

50 lines
1.6 KiB
Matlab

function [g2, dx_phys, dy_phys] = compute2DAutocorrelation(img, max_shift, pixel_size, magnification)
%% compute2DAutocorrelation
% Author: Karthik
% Date: 2025-09-14
% Version: 1.0
%
% Description:
% Computes 2D autocorrelation g2(Δx,Δy) with shifts in physical units [µm]
%
% Inputs:
% img : 2D image (OD)
% max_shift_um : maximum shift in micrometers
% pixel_size : camera pixel size in meters
% magnification: imaging magnification
%
% Outputs:
% g2 : normalized 2D autocorrelation
% dx_phys : x-axis shifts in µm
% dy_phys : y-axis shifts in µm
%
% Notes:
% Optional notes, references.
[M, N] = size(img);
img_mean_sub = img - mean(img(:));
I2_mean = mean(img_mean_sub(:).^2);
% Convert max_shift from µm to pixels
dx_max_px = round(max_shift / (pixel_size/magnification * 1e6));
g2 = zeros(2*dx_max_px+1, 2*dx_max_px+1);
for dx = -dx_max_px:dx_max_px
for dy = -dx_max_px:dx_max_px
% overlapping region in pixels
x1 = max(1,1+dx); x2 = min(M,M+dx);
y1 = max(1,1+dy); y2 = min(N,N+dy);
x1s = max(1,1-dx); x2s = min(M,M-dx);
y1s = max(1,1-dy); y2s = min(N,N-dy);
overlap = img_mean_sub(x1:x2, y1:y2) .* img_mean_sub(x1s:x2s, y1s:y2s);
g2(dx+dx_max_px+1, dy+dx_max_px+1) = mean(overlap(:)) / I2_mean;
end
end
% Return physical shift axes in µm
dx_phys = (-dx_max_px:dx_max_px) * (pixel_size/magnification * 1e6);
dy_phys = dx_phys;
end