summaryrefslogtreecommitdiff
path: root/cli/app/search/image.py
blob: f800a3309eb151a55a3317f85e55a82ebe4e5479 (plain)
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
import cv2 as cv
import numpy as np

def image_to_uint8(x):
  """Converts [-1, 1] float array to [0, 255] uint8."""
  x = np.asarray(x)
  x = (256. / 2.) * (x + 1.)
  x = np.clip(x, 0, 255)
  x = x.astype(np.uint8)
  return x

def imconvert_uint8(im):
  im = np.clip(((im + 1) / 2.0) * 256, 0, 255)
  im = np.uint8(im)
  return im

def imconvert_float32(im):
  im = np.float32(im)
  im = (im / 256) * 2.0 - 1
  return im

def imread(filename):
  img = cv.imread(filename, cv.IMREAD_UNCHANGED)
  if img is not None:
    if len(img.shape) > 2:
      img = img[...,::-1]
  return img
  
def imwrite(filename, img):
  if img is not None:
    if len(img.shape) > 2:
      img = img[...,::-1]
  return cv.imwrite(filename, img)

def imgrid(imarray, cols=5, pad=1):
  if imarray.dtype != np.uint8:
    raise ValueError('imgrid input imarray must be uint8')
  pad = int(pad)
  assert pad >= 0
  cols = int(cols)
  assert cols >= 1
  N, H, W, C = imarray.shape
  rows = int(np.ceil(N / float(cols)))
  batch_pad = rows * cols - N
  assert batch_pad >= 0
  post_pad = [batch_pad, pad, pad, 0]
  pad_arg = [[0, p] for p in post_pad]
  imarray = np.pad(imarray, pad_arg, 'constant', constant_values=255)
  H += pad
  W += pad
  grid = (imarray
          .reshape(rows, cols, H, W, C)
          .transpose(0, 2, 1, 3, 4)
          .reshape(rows*H, cols*W, C))
  if pad:
    grid = grid[:-pad, :-pad]
  return grid

def resize_and_crop_image(target_im, opt_dims):
  w = target_im.shape[1]
  h = target_im.shape[0]
  if w <= h:
    scale = opt_dims / w
  else:
    scale = opt_dims / h
  #print("{} {}".format(w, h))
  target_im = cv.resize(target_im,(0,0), fx=scale, fy=scale)

  w = target_im.shape[1]
  h = target_im.shape[0]

  x0 = 0
  x1 = opt_dims
  y0 = 0
  y1 = opt_dims
  if w > opt_dims:
    x0 += int((w - opt_dims) / 2)
    x1 += x0
  if h > opt_dims:
    y0 += int((h - opt_dims) / 2)
    y1 += y0

  phi_target = imconvert_float32(target_im)
  phi_target = phi_target[y0:y1,x0:x1]
  if phi_target.shape[2] == 4:
    phi_target = phi_target[:,:,1:4]
  return phi_target