|
a |
|
b/inpainting/util/utils.py |
|
|
1 |
import numpy as np |
|
|
2 |
import scipy.stats as st |
|
|
3 |
import cv2 |
|
|
4 |
import time |
|
|
5 |
import os |
|
|
6 |
import glob |
|
|
7 |
|
|
|
8 |
def gauss_kernel(size=21, sigma=3, inchannels=3, outchannels=3): |
|
|
9 |
interval = (2 * sigma + 1.0) / size |
|
|
10 |
x = np.linspace(-sigma-interval/2,sigma+interval/2,size+1) |
|
|
11 |
ker1d = np.diff(st.norm.cdf(x)) |
|
|
12 |
kernel_raw = np.sqrt(np.outer(ker1d, ker1d)) |
|
|
13 |
kernel = kernel_raw / kernel_raw.sum() |
|
|
14 |
out_filter = np.array(kernel, dtype=np.float32) |
|
|
15 |
out_filter = out_filter.reshape((1, 1, size, size)) |
|
|
16 |
out_filter = np.tile(out_filter, [outchannels, inchannels, 1, 1]) |
|
|
17 |
return out_filter |
|
|
18 |
|
|
|
19 |
|
|
|
20 |
def np_free_form_mask(maxVertex, maxLength, maxBrushWidth, maxAngle, h, w): |
|
|
21 |
mask = np.zeros((h, w, 1), np.float32) |
|
|
22 |
numVertex = np.random.randint(maxVertex + 1) |
|
|
23 |
startY = np.random.randint(h) |
|
|
24 |
startX = np.random.randint(w) |
|
|
25 |
brushWidth = 0 |
|
|
26 |
for i in range(numVertex): |
|
|
27 |
angle = np.random.randint(maxAngle + 1) |
|
|
28 |
angle = angle / 360.0 * 2 * np.pi |
|
|
29 |
if i % 2 == 0: |
|
|
30 |
angle = 2 * np.pi - angle |
|
|
31 |
length = np.random.randint(maxLength + 1) |
|
|
32 |
brushWidth = np.random.randint(10, maxBrushWidth + 1) // 2 * 2 |
|
|
33 |
nextY = startY + length * np.cos(angle) |
|
|
34 |
nextX = startX + length * np.sin(angle) |
|
|
35 |
|
|
|
36 |
nextY = np.maximum(np.minimum(nextY, h - 1), 0).astype(np.int) |
|
|
37 |
nextX = np.maximum(np.minimum(nextX, w - 1), 0).astype(np.int) |
|
|
38 |
|
|
|
39 |
cv2.line(mask, (startY, startX), (nextY, nextX), 1, brushWidth) |
|
|
40 |
cv2.circle(mask, (startY, startX), brushWidth // 2, 2) |
|
|
41 |
|
|
|
42 |
startY, startX = nextY, nextX |
|
|
43 |
cv2.circle(mask, (startY, startX), brushWidth // 2, 2) |
|
|
44 |
return mask |
|
|
45 |
|
|
|
46 |
|
|
|
47 |
def generate_rect_mask(im_size, mask_size, margin=8, rand_mask=True): |
|
|
48 |
mask = np.zeros((im_size[0], im_size[1])).astype(np.float32) |
|
|
49 |
if rand_mask: |
|
|
50 |
sz0, sz1 = mask_size[0], mask_size[1] |
|
|
51 |
of0 = np.random.randint(margin, im_size[0] - sz0 - margin) |
|
|
52 |
of1 = np.random.randint(margin, im_size[1] - sz1 - margin) |
|
|
53 |
else: |
|
|
54 |
sz0, sz1 = mask_size[0], mask_size[1] |
|
|
55 |
of0 = (im_size[0] - sz0) // 2 |
|
|
56 |
of1 = (im_size[1] - sz1) // 2 |
|
|
57 |
mask[of0:of0+sz0, of1:of1+sz1] = 1 |
|
|
58 |
mask = np.expand_dims(mask, axis=0) |
|
|
59 |
mask = np.expand_dims(mask, axis=0) |
|
|
60 |
rect = np.array([[of0, sz0, of1, sz1]], dtype=int) |
|
|
61 |
return mask, rect |
|
|
62 |
|
|
|
63 |
|
|
|
64 |
def generate_stroke_mask(im_size, parts=10, maxVertex=20, maxLength=100, maxBrushWidth=24, maxAngle=360): |
|
|
65 |
mask = np.zeros((im_size[0], im_size[1], 1), dtype=np.float32) |
|
|
66 |
for i in range(parts): |
|
|
67 |
mask = mask + np_free_form_mask(maxVertex, maxLength, maxBrushWidth, maxAngle, im_size[0], im_size[1]) |
|
|
68 |
mask = np.minimum(mask, 1.0) |
|
|
69 |
mask = np.transpose(mask, [2, 0, 1]) |
|
|
70 |
mask = np.expand_dims(mask, 0) |
|
|
71 |
return mask |
|
|
72 |
|
|
|
73 |
|
|
|
74 |
def generate_mask(type, im_size, mask_size): |
|
|
75 |
if type == 'rect': |
|
|
76 |
return generate_rect_mask(im_size, mask_size) |
|
|
77 |
else: |
|
|
78 |
return generate_stroke_mask(im_size), None |
|
|
79 |
|
|
|
80 |
|
|
|
81 |
def getLatest(folder_path): |
|
|
82 |
files = glob.glob(folder_path) |
|
|
83 |
file_times = list(map(lambda x: time.ctime(os.path.getctime(x)), files)) |
|
|
84 |
return files[sorted(range(len(file_times)), key=lambda x: file_times[x])[-1]] |