|
1 | 1 | function haralick_mean = haralick(I, Imask, haralick_feature, numLevels) |
2 | 2 | %HARALICK Summary of this function goes here |
3 | 3 | % Detailed explanation goes here |
4 | | - |
| 4 | + global intermediate_results; |
5 | 5 | if (nargin < 4) |
6 | 6 | numLevels = 8; |
7 | 7 | 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; |
20 | 8 |
|
21 | 9 | haralick_features = {'Energy','Contrast','Correlation','Variance','Homogeneity','SumAverage','SumVariance','SumEntropy','Entropy','DiffVariance','DiffEntropy','InfoMeasCorr1','InfoMeasCorr2','MaxCorrCoef'}; |
22 | 10 | if ~any(strcmp(haralick_features, haralick_feature)) |
23 | 11 | error('haralick:unknownFeature', ['Unknown Haralick feature name. Please use one of the following:\n' strjoin(haralick_features,'; ')]) |
24 | 12 | end |
25 | | - |
26 | 13 | if ~any(strcmp(haralick_feature, haralick_features([7, 9, 10, 13, 14]))) |
27 | 14 | % TODO: Add warning, when using one of the non-checked features |
28 | 15 | end |
29 | 16 |
|
| 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 | + |
30 | 33 | % Temporarily turn off warnings, as graycomatrix will give warning for |
31 | 34 | % NaN values, which will most likely always be present. |
32 | 35 | warnStruct = warning(); |
33 | 36 | 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 |
38 | 61 | warning(warnStruct); % Reset warnings to previous state. |
39 | 62 |
|
40 | 63 | % Use Matlab implementation if available |
|
0 commit comments