Newer
Older
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
from PIL import Image, ImageDraw, ImageFont
def draw_boxes_on_2d_image(img, boxes, **kwargs):
pilimg = Image.fromarray(np.copy(img)) # drawing modifies array in-place
draw = ImageDraw.Draw(pilimg)
font_size = kwargs.get('font_size', 18)
linewidth = kwargs.get('linewidth', 4)
draw.font = ImageFont.truetype(font="arial.ttf", size=font_size)
for box in boxes:
y0 = box['info'].y0
y1 = box['info'].y1
x0 = box['info'].x0
x1 = box['info'].x1
xm = round((x0 + x1) / 2)
la = box['info'].label
zi = box['info'].zi
draw.rectangle([(x0, y0), (x1, y1)], outline='white', width=linewidth)
if kwargs.get('add_label') is True:
draw.text((xm, y0), f'Z{zi:04d}-L{la:04d}', fill='white', anchor='mb')
return pilimg
def generate_patches(
desc, stack, boxes, rescale_clip=0.0,
pad_to=256,
proj=lambda x: x.max(axis=0),
prefix='patch',
**kwargs
):
patch_dir = root / 'output' / 'patches' / desc
patch_dir.mkdir(parents=True, exist_ok=True)
for box in boxes:
obj = box['info']
sl = box['slice']
rbb = box['relative_bounding_box']
patch = proj(stack[sl])
patch_fname = f'{prefix}-la{obj.label:04d}-zi{obj.zi:04d}'
if rescale_clip is not None:
patch = rescale(patch, rescale_clip)
if kwargs.get('draw_bounding_box') is True:
x0 = rbb['x0']
y0 = rbb['y0']
x1 = rbb['x1']
y1 = rbb['y1']
pilimg = Image.fromarray(patch) # drawing modifies array in-place
draw = ImageDraw.Draw(pilimg)
draw.rectangle([(x0, y0), (x1, y1)], outline='white', width=kwargs.get('linewidth', 1))
patch = np.array(pilimg)
if pad_to:
patch = pad(patch, pad_to)
imsave(
patch_dir / (patch_fname + '.png'),
resample(patch),
check_contrast=False,
)
print(f'Successfully wrote {len(boxes)} patches to:\n{patch_dir}')
def generate_3d_patches( # in extensions.chaeo.products
desc, stack, boxes, rescale_clip=0.0,
pad_to=256,
prefix='patch',
proj=lambda x: x,
):
patch_dir = root / 'output' / '3d_patches' / desc
patch_dir.mkdir(parents=True, exist_ok=True)
for box in boxes:
obj = box['info']
sl = box['slice']
patch = proj(stack[sl])
patch_fname = f'{prefix}-la{obj.label:04d}-zi{obj.zi:04d}'
if rescale_clip is not None:
patch = rescale(patch, rescale_clip)
if pad_to:
patch = pad_3d(patch, pad_to)
imwrite(
patch_dir / (patch_fname + '.tif'),
patch,
imagej=True
)
print(f'Successfully wrote {len(boxes)} patches to:\n{patch_dir}')