Skip to content

Commit 9044d0d

Browse files
author
Anders
committed
Added global var for sharing data between feature calculations
1 parent f8816c4 commit 9044d0d

File tree

2 files changed

+47
-18
lines changed

2 files changed

+47
-18
lines changed

common/ROI/extractFeaturesFromROIs.m

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
if (nargin < 4)
77
edges = 0;
88
end
9+
10+
global intermediate_results;
911

1012
% Loop over ROIs
1113
progBar = ProgressBar(length(ROIs), 'Title','Extracting features from ROIs', 'UpdateRate', 1, 'UseUnicode', false);
@@ -19,14 +21,18 @@
1921
for e = 1:length(edges)
2022
edge = edges(e);
2123
ImaskEroded = imerode(Imask, strel('disk',round(edge/mapTransformationROI.CellExtentInWorldX)));
24+
intermediate_results = struct();
2225
for f = 1:length(featureHandles)
2326
featureHandle = featureHandles{f};
27+
% feature = featureHandle(Iroi, ImaskEroded, mapTransformationROI);
2428
feature = feval(featureHandle, Iroi, ImaskEroded, mapTransformationROI);
2529
if (isempty(feature))
2630
feature = NaN;
2731
end
2832
features(e, f) = feature;
2933
end;
34+
struct_field_names = fieldnames(intermediate_results);
35+
intermediate_results = rmfield(intermediate_results, struct_field_names);
3036
end;
3137

3238
% Calculate the actual size of the edges based on the ground

common/features/haralick.m

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,63 @@
11
function haralick_mean = haralick(I, Imask, haralick_feature, numLevels)
22
%HARALICK Summary of this function goes here
33
% Detailed explanation goes here
4-
4+
global intermediate_results;
55
if (nargin < 4)
66
numLevels = 8;
77
end
8-
9-
if (size(I,3) == 1)
10-
Igray = I;
11-
elseif (size(I,3) == 3)
12-
Igray = im2double(rgb2gray(I));
13-
elseif (size(I,3) == 4)
14-
Igray = im2double(rgb2gray(I(:,:,1:3)));
15-
else
16-
% Throw error
17-
error('haralick:unknownImageChannels',['Unknown number of image channels (' num2str(size(I,3)) '). Expected 1, 3 or 4.']);
18-
end
19-
Igray(~Imask) = NaN;
208

219
haralick_features = {'Energy','Contrast','Correlation','Variance','Homogeneity','SumAverage','SumVariance','SumEntropy','Entropy','DiffVariance','DiffEntropy','InfoMeasCorr1','InfoMeasCorr2','MaxCorrCoef'};
2210
if ~any(strcmp(haralick_features, haralick_feature))
2311
error('haralick:unknownFeature', ['Unknown Haralick feature name. Please use one of the following:\n' strjoin(haralick_features,'; ')])
2412
end
25-
2613
if ~any(strcmp(haralick_feature, haralick_features([7, 9, 10, 13, 14])))
2714
% TODO: Add warning, when using one of the non-checked features
2815
end
2916

17+
% Co-occurance matrices have not already been calculated, skip check on
18+
% and conversion of input image
19+
if (~isfield(intermediate_results, 'glcms_000') || ~isfield(intermediate_results, 'glcms_045') || ~isfield(intermediate_results, 'glcms_090') || ~isfield(intermediate_results, 'glcms_135'))
20+
if (size(I,3) == 1)
21+
Igray = I;
22+
elseif (size(I,3) == 3)
23+
Igray = im2double(rgb2gray(I));
24+
elseif (size(I,3) == 4)
25+
Igray = im2double(rgb2gray(I(:,:,1:3)));
26+
else
27+
% Throw error
28+
error('haralick:unknownImageChannels',['Unknown number of image channels (' num2str(size(I,3)) '). Expected 1, 3 or 4.']);
29+
end
30+
Igray(~Imask) = NaN;
31+
end
32+
3033
% Temporarily turn off warnings, as graycomatrix will give warning for
3134
% NaN values, which will most likely always be present.
3235
warnStruct = warning();
3336
warning off;
34-
glcms_000 = graycomatrix(Igray, 'Offset', [0 1], 'Symmetric',true, 'NumLevels', numLevels);
35-
glcms_045 = graycomatrix(Igray, 'Offset', [-1 1], 'Symmetric',true, 'NumLevels', numLevels);
36-
glcms_090 = graycomatrix(Igray, 'Offset', [-1 0], 'Symmetric',true, 'NumLevels', numLevels);
37-
glcms_135 = graycomatrix(Igray, 'Offset', [-1 -1], 'Symmetric',true, 'NumLevels', numLevels);
37+
if isfield(intermediate_results, 'glcms_000')
38+
glcms_000 = intermediate_results.glcms_000;
39+
else
40+
glcms_000 = graycomatrix(Igray, 'Offset', [0 1], 'Symmetric',true, 'NumLevels', numLevels);
41+
intermediate_results.glcms_000 = glcms_000;
42+
end
43+
if isfield(intermediate_results, 'glcms_045')
44+
glcms_045 = intermediate_results.glcms_045;
45+
else
46+
glcms_045 = graycomatrix(Igray, 'Offset', [-1 1], 'Symmetric',true, 'NumLevels', numLevels);
47+
intermediate_results.glcms_045 = glcms_045;
48+
end
49+
if isfield(intermediate_results, 'glcms_090')
50+
glcms_090 = intermediate_results.glcms_090;
51+
else
52+
glcms_090 = graycomatrix(Igray, 'Offset', [-1 0], 'Symmetric',true, 'NumLevels', numLevels);
53+
intermediate_results.glcms_090 = glcms_090;
54+
end
55+
if isfield(intermediate_results, 'glcms_135')
56+
glcms_135 = intermediate_results.glcms_135;
57+
else
58+
glcms_135 = graycomatrix(Igray, 'Offset', [-1 -1], 'Symmetric',true, 'NumLevels', numLevels);
59+
intermediate_results.glcms_135 = glcms_135;
60+
end
3861
warning(warnStruct); % Reset warnings to previous state.
3962

4063
% Use Matlab implementation if available

0 commit comments

Comments
 (0)