5
5
import skimage .io , skimage .transform
6
6
import matplotlib .pyplot as plt
7
7
import matplotlib as mpl
8
-
8
+ import cupy as cp
9
9
10
10
def get_plane (img ):
11
11
img_loader_x = skimage .io .imread ('scanner/normalized_vectors_x_plus_half.tif' )
12
12
img_loader_y = skimage .io .imread ('scanner/normalized_vectors_y_plus_half.tif' )
13
- nv_x = skimage .img_as_float (img_loader_x ) - 0.5
14
- nv_y = skimage .img_as_float (img_loader_y ) - 0.5
13
+ nv_x = cp . asarray ( skimage .img_as_float (img_loader_x ) - 0.5 )
14
+ nv_y = cp . asarray ( skimage .img_as_float (img_loader_y ) - 0.5 )
15
15
16
- img_mean = np .mean (img [img != 0 ])
17
- mean_error_map = np .power ((img - img_mean ), 2 )
18
- mean_error_map = np .where (img > 0 , mean_error_map , np .infty )
16
+ img_mean = cp .mean (img [img != 0 ])
17
+ mean_error_map = cp .power ((img - img_mean ), 2 )
18
+ mean_error_map = cp .where (img > 0 , mean_error_map , cp .infty )
19
19
20
- mean_sorted = np .dstack (np .unravel_index (np .argsort (mean_error_map .ravel ()), img .shape ))[0 ]
21
- depth_sorted = np .dstack (np .unravel_index (np .argsort (img .ravel ()), img .shape ))[0 ]
20
+ mean_sorted = cp .dstack (cp .unravel_index (cp .argsort (mean_error_map .ravel ()), img .shape ))[0 ]
21
+ depth_sorted = cp .dstack (cp .unravel_index (cp .argsort (img .ravel ()), img .shape ))[0 ]
22
22
a = mean_sorted [:20000 ]
23
23
b = depth_sorted
24
24
acceptable_mean = mean_error_map [a [19999 , 0 ], a [19999 , 1 ]]
25
25
acceptable_depth = img [b [440000 , 0 ], b [440000 , 1 ]]
26
26
27
- img1 = np .where (img == 0 , 1.0 , img )
27
+ img1 = cp .where (img == 0 , 1.0 , img )
28
28
x = nv_x * img1
29
29
y = nv_y * img1 * (- 1.0 )
30
30
z = img1 .copy ()
31
31
32
- mesh_points = np .empty ((int (img .shape [0 ] / 20 ) * int (img .shape [1 ] / 20 ), 2 ))
32
+ mesh_points = cp .empty ((int (img .shape [0 ] / 20 ) * int (img .shape [1 ] / 20 ), 2 ))
33
33
for i in range (int (img .shape [0 ] / 20 )):
34
34
for j in range (int (img .shape [1 ] / 20 )):
35
35
mesh_points [int (i * img .shape [1 ] / 20 ) + j , 0 ] = i * 20
@@ -40,15 +40,15 @@ def get_plane(img):
40
40
for i in range (mesh_points .shape [0 ]):
41
41
if mean_error_map [int (mesh_points [i , 0 ]), int (mesh_points [i , 1 ])] < acceptable_mean :
42
42
if mean_points is None :
43
- mean_points = np .array ([mesh_points [i ]])
43
+ mean_points = cp .array ([mesh_points [i ]])
44
44
else :
45
- mean_points = np .vstack ([mean_points , mesh_points [i ]])
45
+ mean_points = cp .vstack ([mean_points , mesh_points [i ]])
46
46
47
47
if img [int (mesh_points [i , 0 ]), int (mesh_points [i , 1 ])] > acceptable_depth :
48
48
if depth_points is None :
49
- depth_points = np .array ([mesh_points [i ]])
49
+ depth_points = cp .array ([mesh_points [i ]])
50
50
else :
51
- depth_points = np .vstack ([depth_points , mesh_points [i ]])
51
+ depth_points = cp .vstack ([depth_points , mesh_points [i ]])
52
52
53
53
mean_points = mean_points [mean_points [:, 1 ].argsort ()]
54
54
depth_points = depth_points [depth_points [:, 1 ].argsort ()]
@@ -68,27 +68,27 @@ def get_plane(img):
68
68
plt.show()
69
69
'''
70
70
71
- mean_X = np .empty ((mean_points .shape [0 ]))
72
- mean_Y = np .empty ((mean_points .shape [0 ]))
73
- mean_Z = np .empty ((mean_points .shape [0 ]))
71
+ mean_X = cp .empty ((mean_points .shape [0 ]))
72
+ mean_Y = cp .empty ((mean_points .shape [0 ]))
73
+ mean_Z = cp .empty ((mean_points .shape [0 ]))
74
74
75
75
for i in range (mean_points .shape [0 ]):
76
76
mean_X [i ] = x [int (mean_points [i , 0 ]), int (mean_points [i , 1 ])]
77
77
mean_Y [i ] = y [int (mean_points [i , 0 ]), int (mean_points [i , 1 ])]
78
78
mean_Z [i ] = z [int (mean_points [i , 0 ]), int (mean_points [i , 1 ])]
79
79
80
- real_mean_points = np .c_ [mean_X , mean_Y , mean_Z ]
80
+ real_mean_points = cp .c_ [mean_X , mean_Y , mean_Z ]
81
81
82
- depth_X = np .empty ((depth_points .shape [0 ]))
83
- depth_Y = np .empty ((depth_points .shape [0 ]))
84
- depth_Z = np .empty ((depth_points .shape [0 ]))
82
+ depth_X = cp .empty ((depth_points .shape [0 ]))
83
+ depth_Y = cp .empty ((depth_points .shape [0 ]))
84
+ depth_Z = cp .empty ((depth_points .shape [0 ]))
85
85
86
86
for i in range (depth_points .shape [0 ]):
87
87
depth_X [i ] = x [int (depth_points [i , 0 ]), int (depth_points [i , 1 ])]
88
88
depth_Y [i ] = y [int (depth_points [i , 0 ]), int (depth_points [i , 1 ])]
89
89
depth_Z [i ] = z [int (depth_points [i , 0 ]), int (depth_points [i , 1 ])]
90
90
91
- real_depth_points = np .c_ [depth_X , depth_Y , depth_Z ]
91
+ real_depth_points = cp .c_ [depth_X , depth_Y , depth_Z ]
92
92
93
93
A = real_mean_points [0 ]
94
94
B = real_depth_points [0 ]
@@ -107,61 +107,56 @@ def get_plane(img):
107
107
plt.show()
108
108
'''
109
109
110
- normal = np .cross (v1 , v2 )
110
+ normal = cp .cross (v1 , v2 )
111
111
112
- d = - np .sum (normal * A )
112
+ d = - cp .sum (normal * A )
113
113
#plane = -(normal[0] * x + normal[1] * y + d) / normal[2]
114
114
full_plane = - d / (normal [0 ] * nv_x + normal [1 ] * nv_y * (- 1.0 ) + normal [2 ])
115
- img_dis = abs (normal [0 ] * x + + normal [1 ] * y + normal [2 ] * img + d ) / np .sqrt (normal [0 ]** 2 + normal [1 ]** 2 + normal [2 ]** 2 )
116
- img_dis = np .where (img == 0 , 0 , img_dis )
115
+ img_dis = abs (normal [0 ] * x + + normal [1 ] * y + normal [2 ] * img + d ) / cp .sqrt (normal [0 ]** 2 + normal [1 ]** 2 + normal [2 ]** 2 )
116
+ img_dis = cp .where (img == 0 , 0 , img_dis )
117
117
118
118
return full_plane , img_dis
119
119
120
120
121
121
def fill_depth_map (img , background_value ):
122
122
mask = np .where (img > 0 , 0 , 1 ).astype (np .uint8 )
123
- uint_mask = np .where (img > 0 , 0 , 255 ).astype (np .uint8 )
124
- rgb_mask = np .dstack ((uint_mask , uint_mask , uint_mask ))
125
123
126
124
labels , holes = measure .label (mask , background = 0 , return_num = True )
127
-
125
+ img = cp .asarray (img )
126
+ labels = cp .asarray (labels )
128
127
print ("Filling " + str (holes ) + " holes" )
129
128
with alive_bar (holes ) as bar :
130
129
for i in range (1 , holes + 1 ):
131
130
label = labels == i
132
- hole_border = segmentation .mark_boundaries (np .zeros (rgb_mask .shape ),
133
- label .astype (np .int32 ),
134
- (1 , 0 , 0 ),
135
- None ,
136
- 'outer' )[:, :, 0 ].astype (float )
137
-
138
- #hole_border1 = np.logical_or((np.cumsum(label.astype(np.int32), axis=0) == 1), (np.cumsum(label.astype(np.int32), axis=1) == 1))
139
- #hole_border2 = np.logical_or(np.flipud(np.flipud(label.astype(np.int32).cumsum(axis=1)) == 1), np.fliplr(np.fliplr(label.astype(np.int32).cumsum(axis=0)) == 1))
140
- #hole_border = np.logical_or(hole_border1, hole_border2).astype(float)
141
-
142
- border_values = img * hole_border
143
- label_img_border_pixels = np .sum (label .astype (np .int32 )[0 , :]) + \
144
- np .sum (label .astype (np .int32 )[label .shape [0 ] - 1 , :]) + \
145
- np .sum (label .astype (np .int32 )[1 :(label .shape [1 ] - 1 ), 0 ]) + \
146
- np .sum (label .astype (np .int32 )[1 :(label .shape [1 ] - 1 ), label .shape [1 ] - 1 ])
131
+
132
+ label_img_border_pixels = cp .sum (label .astype (cp .int32 )[0 , :]) + \
133
+ cp .sum (label .astype (cp .int32 )[label .shape [0 ] - 1 , :]) + \
134
+ cp .sum (label .astype (cp .int32 )[1 :(label .shape [1 ] - 1 ), 0 ]) + \
135
+ cp .sum (label .astype (cp .int32 )[1 :(label .shape [1 ] - 1 ), label .shape [1 ] - 1 ])
136
+
137
+ if label_img_border_pixels == 0 :
138
+ top = cp .roll (label , 1 , axis = 0 )
139
+ bottom = cp .roll (label , - 1 , axis = 0 )
140
+ right = cp .roll (label , 1 , axis = 1 )
141
+ left = cp .roll (label , - 1 , axis = 1 )
142
+ hole_border = cp .logical_or (cp .logical_or (top , bottom ), cp .logical_or (right , left ))
143
+ border_values = img * hole_border
147
144
148
145
background = label_img_border_pixels > 0
149
146
150
147
if not background :
151
- mx = np .ma .masked_array (border_values , mask = border_values == 0 )
152
- line_values = mx .max (1 )
153
- hole = (labels == i ).astype (float ) * line_values [:, np .newaxis ]
148
+ line_values = border_values .max (1 )
149
+ hole = (labels == i ).astype (float ) * line_values [:, cp .newaxis ]
154
150
else :
155
-
156
151
hole = (labels == i ).astype (float ) * 0
157
152
158
153
bar ()
159
154
160
- img = np .where (hole > 0 , hole , img )
155
+ img = cp .where (hole > 0 , hole , img )
161
156
162
157
plane , dis = get_plane (img )
163
- object_map = np .where (dis < 10 , 0 , 1.0 )
164
- img = np .where (img == 0 , background_value , img )
158
+ object_map = cp .where (dis < 10 , 0 , 1.0 )
159
+ img = cp .where (img == 0 , background_value , img )
165
160
166
161
'''
167
162
cmap = mpl.cm.get_cmap("winter").copy()
@@ -175,39 +170,39 @@ def fill_depth_map(img, background_value):
175
170
176
171
return img , object_map
177
172
178
- def fill_hr_texture (tex , def_map ):
173
+ def fill_texture (tex , def_map ):
179
174
mask = np .where (def_map > 0 , 0 , 1 ).astype (np .uint8 )
180
- uint_mask = np .where (def_map > 0 , 0 , 255 ).astype (np .uint8 )
181
- rgb_mask = np .dstack ((uint_mask , uint_mask , uint_mask ))
182
175
183
176
labels , holes = measure .label (mask , background = 0 , return_num = True )
184
-
177
+ tex = cp .asarray (tex )
178
+ labels = cp .asarray (labels )
185
179
print ("Filling " + str (holes ) + " holes" )
186
180
with alive_bar (holes ) as bar :
187
181
for i in range (1 , holes + 1 ):
188
182
label = labels == i
189
183
190
- hole_border = segmentation .mark_boundaries (np .zeros (rgb_mask .shape ),
191
- label .astype (np .int32 ),
192
- (1 , 0 , 0 ),
193
- None ,
194
- 'outer' )[:, :, 0 ].astype (float )
195
- border_values = tex * hole_border
196
- label_img_border_pixels = np .sum (label .astype (np .int32 )[0 , :]) + \
197
- np .sum (label .astype (np .int32 )[label .shape [0 ] - 1 , :]) + \
198
- np .sum (label .astype (np .int32 )[1 :(label .shape [1 ] - 1 ), 0 ]) + \
199
- np .sum (label .astype (np .int32 )[1 :(label .shape [1 ] - 1 ), label .shape [1 ] - 1 ])
184
+ label_img_border_pixels = cp .sum (label .astype (cp .int32 )[0 , :]) + \
185
+ cp .sum (label .astype (cp .int32 )[label .shape [0 ] - 1 , :]) + \
186
+ cp .sum (label .astype (cp .int32 )[1 :(label .shape [1 ] - 1 ), 0 ]) + \
187
+ cp .sum (label .astype (cp .int32 )[1 :(label .shape [1 ] - 1 ), label .shape [1 ] - 1 ])
188
+
189
+ if label_img_border_pixels == 0 :
190
+ top = cp .roll (label , 1 , axis = 0 )
191
+ bottom = cp .roll (label , - 1 , axis = 0 )
192
+ right = cp .roll (label , 1 , axis = 1 )
193
+ left = cp .roll (label , - 1 , axis = 1 )
194
+ hole_border = cp .logical_or (cp .logical_or (top , bottom ), cp .logical_or (right , left ))
195
+ border_values = tex * hole_border
200
196
201
- background = label_img_border_pixels > 0 or np . sum (( labels == i ). astype ( float )) > 1000
197
+ background = label_img_border_pixels > 0
202
198
203
199
if not background :
204
- mx = np .ma .masked_array (border_values , mask = border_values == 0 )
205
- line_values = mx .max (1 )
206
- hole = (labels == i ).astype (float ) * line_values [:, np .newaxis ]
200
+ line_values = border_values .max (1 )
201
+ hole = (labels == i ).astype (float ) * line_values [:, cp .newaxis ]
207
202
else :
208
- hole = (labels == i ).astype (float ) * 1
203
+ hole = (labels == i ).astype (float ) * 0
209
204
210
205
bar ()
211
206
212
- tex = np .where (hole > 0 , hole , tex )
207
+ tex = cp .where (hole > 0 , hole , tex )
213
208
return tex
0 commit comments