-
Notifications
You must be signed in to change notification settings - Fork 0
/
p2ch10_explore_data.py
110 lines (82 loc) · 3.33 KB
/
p2ch10_explore_data.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
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
# ---
# jupyter:
# jupytext:
# text_representation:
# extension: .py
# format_name: light
# format_version: '1.5'
# jupytext_version: 1.16.3
# kernelspec:
# display_name: Python 3
# language: python
# name: python3
# ---
# %matplotlib inline
import numpy as np
from p2ch10.dsets import getCandidateInfoList, getCt, LunaDataset
candidateInfo_list = getCandidateInfoList(requireOnDisk_bool=False)
positiveInfo_list = [x for x in candidateInfo_list if x[0]]
diameter_list = [x[1] for x in positiveInfo_list]
print(len(positiveInfo_list))
print(positiveInfo_list[0])
for i in range(0, len(diameter_list), 100):
print('{:4} {:4.1f} mm'.format(i, diameter_list[i]))
# +
for candidateInfo_tup in positiveInfo_list[:10]:
print(candidateInfo_tup)
for candidateInfo_tup in positiveInfo_list[-10:]:
print(candidateInfo_tup)
for candidateInfo_tup in positiveInfo_list:
if candidateInfo_tup.series_uid.endswith('565'):
print(candidateInfo_tup)
# -
np.histogram(diameter_list)
from p2ch10.vis import findPositiveSamples, showCandidate
positiveSample_list = findPositiveSamples()
series_uid = positiveSample_list[11][2]
showCandidate(series_uid)
series_uid = '1.3.6.1.4.1.14519.5.2.1.6279.6001.124154461048929153767743874565'
showCandidate(series_uid)
series_uid = '1.3.6.1.4.1.14519.5.2.1.6279.6001.126264578931778258890371755354'
showCandidate(series_uid)
LunaDataset()[0]
import numpy as np
import ipyvolume as ipv
V = np.zeros((128,128,128)) # our 3d array
# outer box
V[30:-30,30:-30,30:-30] = 0.75
V[35:-35,35:-35,35:-35] = 0.0
# inner box
V[50:-50,50:-50,50:-50] = 0.25
V[55:-55,55:-55,55:-55] = 0.0
ipv.quickvolshow(V, level=[0.25, 0.75], opacity=0.03, level_width=0.1, data_min=0, data_max=1)
ct = getCt(series_uid)
ipv.quickvolshow(ct.hu_a, level=[0.25, 0.5, 0.9], opacity=0.1, level_width=0.1, data_min=-1000, data_max=1000)
# # Note: the following visualization doesn't look very good.
# It's only included here for completeness.
# +
import scipy.ndimage.morphology
def build2dLungMask(ct, mask_ndx, threshold_gcc = 0.7):
dense_mask = ct.hu_a[mask_ndx] > threshold_gcc
denoise_mask = scipy.ndimage.morphology.binary_closing(dense_mask, iterations=2)
tissue_mask = scipy.ndimage.morphology.binary_opening(denoise_mask, iterations=10)
body_mask = scipy.ndimage.morphology.binary_fill_holes(tissue_mask)
air_mask = scipy.ndimage.morphology.binary_fill_holes(body_mask & ~tissue_mask)
lung_mask = scipy.ndimage.morphology.binary_dilation(air_mask, iterations=2)
return air_mask, lung_mask, dense_mask, denoise_mask, tissue_mask, body_mask
def build3dLungMask(ct):
air_mask, lung_mask, dense_mask, denoise_mask, tissue_mask, body_mask = mask_list = \
[np.zeros_like(ct.hu_a, dtype=np.bool) for _ in range(6)]
for mask_ndx in range(ct.hu_a.shape[0]):
for i, mask_ary in enumerate(build2dLungMask(ct, mask_ndx)):
mask_list[i][mask_ndx] = mask_ary
return air_mask, lung_mask, dense_mask, denoise_mask, tissue_mask, body_mask
# -
from p2ch10.dsets import getCt
ct = getCt(series_uid)
air_mask, lung_mask, dense_mask, denoise_mask, tissue_mask, body_mask = build3dLungMask(ct)
bones = ct.hu_a * (ct.hu_a > 1.5)
lungs = ct.hu_a * air_mask
ipv.figure()
ipv.pylab.volshow(bones + lungs, level=[0.17, 0.17, 0.23], data_min=100, data_max=900)
ipv.show()