-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathretinaLayersSegmentation.m
More file actions
executable file
·104 lines (77 loc) · 3.82 KB
/
retinaLayersSegmentation.m
File metadata and controls
executable file
·104 lines (77 loc) · 3.82 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
101
102
103
% Copyright (C) 2017, Javier Mazzaferri, Luke Beaton, Santiago Costantino
% Hopital Maisonneuve-Rosemont,
% Centre de Recherche
% www.biophotonics.ca
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
function retinaLayersSegmentation(dirlist)
% This function segments the retina interface, RPE, Bruchs membrane and the
% coroid-sclera interface, in each frame in the array bscanstore in the
% file RegisteredImages.mat for each directory in varargin{1}.
% if ispc, workersAvailable = Inf; %Uses parallel computing
% elseif ismac, workersAvailable = 0; %Uses 1 worker computing
% else workersAvailable = Inf; %Uses 1 worker computing
% end
%Close parallel pool when the process exits the scope of this function
% if workersAvailable > 0
% finishup = onCleanup(@() delete(gcp('nocreate')));
% end
% Iterate over subjects
nDirs = numel(dirlist);
for k = 1:nDirs
try
folder = dirlist{k};
savedir = fullfile(folder,'Results');
if ~exist(savedir,'dir'), mkdir(savedir), end
disp(logit(folder,['Starting retinaLayersSegmentation: ' num2str(k) ' of ' num2str(nDirs) ' - ' folder]))
if ~exist(fullfile(savedir,'flattenedBscans.mat'),'file')
preProcessFrames(folder);
end
varStruct = load(fullfile(savedir,'flattenedBscans.mat'),'avgScans','indToProcess','RPEheight');
avgScans = varStruct.avgScans;
indToProcess = varStruct.indToProcess;
RPEheight = varStruct.RPEheight;
if exist(fullfile(savedir,'segmentationResults.mat'),'file')
varStruct = load(fullfile(savedir,'segmentationResults.mat'),'traces','other','EndHeights');
traces = varStruct.traces;
other = varStruct.other;
EndHeights = varStruct.EndHeights;
end
dispInline('init',logit(folder,'Starting retinaLayersSegmentation.'))
% parfor (frame = indToProcess, workersAvailable)
for frame = indToProcess
try
bscan = avgScans{frame};
yCSI = segmentCSI(bscan,RPEheight(frame));
if isempty(yCSI), continue, end
EndHeights(frame,:) = [NaN NaN];
traces(frame).RPEheight = RPEheight(frame);
traces(frame).CSI = yCSI;
dispInline('update',logit(folder,['retinaLayersSegmentation. Frame done: ' num2str(frame)]));
catch localExc
errString = ['Error frame:' num2str(frame) ' ' localExc.message];
errString = [errString buildCallStack(localExc)];
dispInline('end',logit(folder,errString));
end
end
save(fullfile(savedir,'segmentationResults.mat'),'traces','other','EndHeights');
dispInline('end',logit(folder,['Done retinaLayersSegmentation: ' folder]));
catch exception
errString = ['Error in retinaLayersSegmentation. Message: ' exception.message];
errString = [errString buildCallStack(exception)];
dispInline('end',logit(folder,errString));
continue
end
end
end