-
Notifications
You must be signed in to change notification settings - Fork 0
/
texture.py
65 lines (53 loc) · 1.69 KB
/
texture.py
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
import numpy as np
import mahotas
from skimage import measure
HARALICK_FEATURES = [
"angular_second_moment",
"contrast",
"correlation",
"variance",
"inverse_difference_moment",
"sum_average",
"sum_variance",
"sum_entropy",
"entropy",
"difference_variance",
"difference_entropy",
"information_measure_1",
"information_measure_2",
]
def haralick(image: np.ndarray, mask: np.ndarray, distance=5, mode: str = "max"):
"""
Takes a n-d image and mask and returns the 4-directional (2D images) or 13-directional (3D images) average of each of the 13 Haralick features.
Parameters
----------
image: ndarray
n-dimensional ndarray
mask: ndarray
n-dimensional ndarray
Returns
-------
feature_averages:
A dictionary containing the directional averages of each Haralick feature.
"""
# image[~mask] = 0
if mode == "max":
image = np.max(image, axis=0)
if mode == "avg":
image = np.mean(image, axis=0)
image[~mask] = 0
props = measure.regionprops(mask, image)
# sanity check to make sure there is only one prop to deal with
assert len(props) <= 1, "Number of region properties exceeds 1."
# get haralick features using mahotas
features = mahotas.features.haralick(
props[0]["intensity_image"], distance=distance, ignore_zeros=True
)
# loop through the 2D array of 4 directions * 13 features
# get averages for each feature
feature_averages = {}
for index in range(len(HARALICK_FEATURES)):
feature_averages[HARALICK_FEATURES[index]] = np.mean(
[features[i][index] for i in range(4)]
)
return feature_averages