Diff of /inpainting/util/utils.py [000000] .. [92cc18]

Switch to unified view

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]]