/
computeCandidatePoints.m
124 lines (110 loc) · 4.04 KB
/
computeCandidatePoints.m
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
function [candidatePoints, candieshandles] = computeCandidatePoints(angleMatrix, ...
thisBoundy, mainthresh, offsetVar, statsfname)
% COMPUTE CANDIDATE POINTS from the anglegram matrix (angleMatrix).
%
switch nargin
case {0, 1, 4}
fprintf('%s: ERROR. Not enough input arguments.', mfilename);
candidatePoints = [] ;
candieshandles = [];
return;
case 2
mainthresh = 150;
offsetVar = 7;
statsfname = 'max';
case 3
angleopts = mainthresh;
[mainthresh, offsetVar, statsfname] = getoptions(angleopts);
end
aMthresh = angleMatrix;
aMthresh(aMthresh < mainthresh) = NaN;
f = ones(5)/25;
aMthresh = imfilter(aMthresh,f, 'replicate');
str1 = strcat('[computeCandidatePoints].Calculating: ',...
upper(statsfname));
disp(str1);
minpeakdist = 25;
switch lower(statsfname)
case {'mean', 'median'}
angleSummaryVector = feval(statsfname,aMthresh(:,offsetVar:end),...
2,'omitnan');
meanAM = mean(angleSummaryVector, 'omitnan');
stdAM = std(angleSummaryVector, 'omitnan');
minpeakheight = meanAM + 0.75*stdAM;
case {'max'}
angleSummaryVector = max(aMthresh(:,offsetVar:end),[],2);
meanAM = mean(angleSummaryVector, 'omitnan');
stdAM = std(angleSummaryVector, 'omitnan');
minpeakheight = meanAM + 0.75*stdAM;
case {'integral', 'trapz'}
aMthresh(isnan(aMthresh)) = 0;
angleSummaryVector = trapz(aMthresh(:,offsetVar:end),2);
%angleSummaryVector = sqrt(angleSummaryVector);
angleSummaryVector(angleSummaryVector==0) = nan;
meanAM = mean(angleSummaryVector, 'omitnan');
stdAM = std(angleSummaryVector, 'omitnan');
minpeakheight = meanAM+0.1*stdAM;
minpeakdist = 50;
otherwise
str1 = strcat('[computeCandidatePoints]',...
'ERROR. Not a valid function to evaluate angleMatrix.');
disp(str1);
candidatePoints = [] ;
candieshandles = [];
return;
end
[intensityPeaks, intensityLocations] = findpeaks(angleSummaryVector,...
'MinPeakDistance',minpeakdist,'MinPeakHeight',minpeakheight,...
'SortStr','descend');
if isempty(intensityLocations)
str1 = strcat('[computeCandidatePoints]',...
'Search for candidates over "optimised threshold" not succesful.');
str2 = strcat('[computeCandidatePoints]',...
'Starting search for candidates using baseline threshold of 180.');
disp(str1);
disp(str2);
[intensityPeaks, intensityLocations] = findpeaks(angleSummaryVector,...
'MinPeakDistance',25,'MinPeakHeight',meanAM,'SortStr','descend');
end
candidatePoints = thisBoundy(intensityLocations,:);
candieshandles.meanAM = meanAM;
candieshandles.stdAM = stdAM;
candieshandles.aMtresh = aMthresh;
candieshandles.angleSummaryVector = angleSummaryVector;
candieshandles.intensityLocations = intensityLocations;
candieshandles.intensityPeaks = intensityPeaks;
% to compute corners
maxOffset = max(sum(aMthresh>0,2));
aMfiltered = imfilter(angleMatrix,ones(3)./9);
aMsection = aMfiltered(:,offsetVar:maxOffset);
angleCornerVector = mean(aMsection,2);
[envHigh, envLow] = envelope(angleCornerVector,8,'peaks');
envMean = (envHigh+envLow)./2;
[~ ,corners] = findpeaks(-angleCornerVector, 'MinPeakHeight',...
mean(-angleCornerVector));
candieshandles.angleCornerVector = angleCornerVector;
candieshandles.envMean = envMean;
candieshandles.corners = corners;
candieshandles.cornerCandidates = thisBoundy(corners, :);
end
function [mainthresh, offsetVar, statsfname] = getoptions(s)
% Get the options for calculating the candidate points.
mainthresh = 150;
offsetVar = 7;
statsfname = 'max';
fnames = fieldnames(s);
for ix=1:length(fnames)
name = fnames{ix};
switch name
case 'mainthresh'
mainthresh = s.(name);
case 'offsetVar'
offsetVar = s.(name);
case 'statsfname'
statsfname = s.(name);
otherwise
fprintf('%s: ERROR. Incorrect option [%s] is NOT defined.\n',...
mfilename, upper(name));
end
end
end