-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPCA_diff_P.m
More file actions
100 lines (75 loc) · 2.57 KB
/
Copy pathPCA_diff_P.m
File metadata and controls
100 lines (75 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
clc;
clear;
close all;
%% ================= USER SETTINGS =================
folder = 'PATH'; % <<< CHANGE
p_list = [20]; % <<< YOUR FREQUENCY LABELS
numPC_static = 3; % Static PCs to remove
mainSaveFolder = 'PCA_Freq_Output';
if ~exist(mainSaveFolder,'dir')
mkdir(mainSaveFolder);
end
%% ================= FILE SORTING =================
filesStruct = dir(fullfile(folder,'*.tif'));
fileNames = {filesStruct.name};
fileNumbers = zeros(length(fileNames),1);
for i = 1:length(fileNames)
numStr = regexp(fileNames{i}, '\d+', 'match');
fileNumbers(i) = str2double(numStr{end});
end
[~, idx] = sort(fileNumbers);
files = fileNames(idx);
totalFrames = length(files);
disp(['Total frames available: ', num2str(totalFrames)]);
%% ================= LOOP OVER p =================
for p = p_list
fprintf('\n========== Processing p = %d ==========\n', p);
%% ===== Select frames with gap p =====
indices = 1:p:totalFrames;
files_selected = files(indices);
N = length(files_selected);
fprintf('Frames used: %d\n', N);
% Safety check
if N < 10
warning('Too few frames for PCA. Skipping p = %d', p);
continue;
end
%% ===== Read first image =====
img0 = double(imread(fullfile(folder, files_selected{1})));
[rows, cols] = size(img0);
M = rows * cols;
%% ===== Build data matrix =====
disp('Building data matrix...');
X = zeros(M, N, 'double');
for i = 1:N
img = double(imread(fullfile(folder, files_selected{i})));
X(:,i) = img(:);
end
%% ===== Center data =====
meanFrame = mean(X,2);
X_centered = X - meanFrame;
%% ===== PCA using SVD =====
disp('Performing PCA...');
[U,S,V] = svd(X_centered,'econ');
%% ===== Static reconstruction =====
U_static = U(:,1:numPC_static);
S_static = S(1:numPC_static,1:numPC_static);
V_static = V(:,1:numPC_static);
X_static = U_static * S_static * V_static';
%% ===== Dynamic component =====
X_dynamic = X_centered - X_static;
%% ===== Save results =====
saveFolder = fullfile(mainSaveFolder, sprintf('p_%d', p));
if ~exist(saveFolder,'dir')
mkdir(saveFolder);
end
disp('Saving dynamic frames...');
for i = 1:N
dynFrame = reshape(X_dynamic(:,i), rows, cols);
dynFrame = mat2gray(dynFrame);
imwrite(dynFrame, fullfile(saveFolder, ...
sprintf('dyn_%04d.tif', i)));
end
fprintf('DONE for p = %d\n', p);
end
disp('ALL DONE!');