Calculations/Data-Analyzer/+Scripts/BECToDropletsToStripes/featureDetection.m

121 lines
5.2 KiB
Matlab

%% ===== BEC-Droplets-Stripes Settings =====
% Specify data location to run analysis on
dataSources = {
struct('sequence', 'TwoDGas', ...
'date', '2025/06/23', ...
'runs', [300]) % specify run numbers as a string in "" or just as a numeric value
};
options = struct();
% File paths
options.baseDataFolder = '//DyLabNAS/Data';
options.FullODImagesFolder = 'E:/Data - Experiment/FullODImages/202506';
options.measurementName = 'DropletsToStripes';
scriptFullPath = mfilename('fullpath');
options.saveDirectory = fileparts(scriptFullPath);
% Camera / imaging settings
options.cam = 4; % 1 - ODT_1_Axis_Camera; 2 - ODT_2_Axis_Camera; 3 - Horizontal_Axis_Camera;, 4 - Vertical_Axis_Camera;
options.angle = 0; % angle by which image will be rotated
options.center = [1410, 2030];
options.span = [200, 200];
options.fraction = [0.1, 0.1];
options.pixel_size = 5.86e-6; % in meters
options.magnification = 24.6;
options.ImagingMode = 'HighIntensity';
options.PulseDuration = 5e-6; % in s
% Fourier analysis settings
options.theta_min = deg2rad(0);
options.theta_max = deg2rad(180);
options.N_radial_bins = 500;
options.Radial_Sigma = 2;
options.Radial_WindowSize = 5; % odd number
options.k_min = 1.2771; % μm⁻¹
options.k_max = 2.5541; % μm⁻¹
options.N_angular_bins = 180;
options.Angular_Threshold = 75;
options.Angular_Sigma = 2;
options.Angular_WindowSize = 5;
options.zoom_size = 50;
% Flags
options.skipUnshuffling = false;
options.skipNormalization = false;
options.skipFringeRemoval = true;
options.skipPreprocessing = true;
options.skipMasking = true;
options.skipIntensityThresholding = true;
options.skipBinarization = true;
options.skipFullODImagesFolderUse = false;
options.skipSaveData = false;
options.skipSaveFigures = true;
options.skipSaveProcessedOD = true;
options.skipLivePlot = true;
options.showProgressBar = true;
% Extras
options.font = 'Bahnschrift';
switch options.measurementName
case 'BECToDroplets'
options.scan_parameter = 'rot_mag_field';
options.flipSortOrder = true;
options.scanParameterUnits = 'gauss';
options.titleString = 'BEC to Droplets';
case 'BECToStripes'
options.scan_parameter = 'rot_mag_field';
options.flipSortOrder = true;
options.scanParameterUnits = 'gauss';
options.titleString = 'BEC to Stripes';
case 'DropletsToStripes'
options.scan_parameter = 'ps_rot_mag_fin_pol_angle';
options.flipSortOrder = false;
options.scanParameterUnits = 'degrees';
options.titleString = 'Droplets to Stripes';
case 'StripesToDroplets'
options.scan_parameter = 'ps_rot_mag_fin_pol_angle';
options.flipSortOrder = false;
options.scanParameterUnits = 'degrees';
options.titleString = 'Stripes to Droplets';
end
%% ===== Collect Images and Launch Viewer =====
[options.selectedPath, options.folderPath] = Helper.selectDataSourcePath(dataSources, options);
[od_imgs, scan_parameter_values, scan_reference_values, file_list] = Helper.collectODImages(options);
%% Minimal pipeline: preprocess + detect patches + extract shapes
% ---------- user-tunable parameters ----------
params.backgroundDiskFraction = 1/8; % Fraction of image size used for morphological opening
params.boundingBoxPadding = 12; % Padding around detected cloud
params.dogGaussianSmallSigma = 1.2; % Sigma for small Gaussian in Difference-of-Gaussians
params.dogGaussianLargeSigma = 3.8; % Sigma for large Gaussian in Difference-of-Gaussians
params.minPeakProminence = 0.02; % Threshold for DoG response
params.minPeakFraction = 0.80; % Fraction of max DoG response to reject weak patches
params.minimumPatchArea = 100; % Minimum area (pixels) for detected patches to be kept
params.shapeMinArea = 20; % Minimum shape area
params.shapeCloseRadius = 3; % Morphological closing radius (fills holes)
params.shapeFillHoles = false; % Ensures shapes are solid regions
params.intensityThreshFraction = 0.45; % Fraction of max intensity to keep
params.edgeSigma = 1.0; % Gaussian smoothing for Canny
params.edgeThresholdLow = 0.25; % Low Canny threshold fraction
params.edgeThresholdHigh = 0.55; % High Canny threshold fraction
params.pixelSize = 5.86e-6; % Physical pixel size (meters/pixel)
params.magnification = 23.94; % Magnification factor of imaging system
% --------------------------------------------
Analyzer.runInteractiveFeatureDetectorGUI(od_imgs, scan_parameter_values, file_list, options, params)