|
import numpy as np |
|
|
|
|
|
def random_crop(img, w, h): |
|
height, width = img.shape[:2] |
|
|
|
h_rnd = height - h |
|
w_rnd = width - w |
|
|
|
y = np.random.randint(0, h_rnd) if h_rnd > 0 else 0 |
|
x = np.random.randint(0, w_rnd) if w_rnd > 0 else 0 |
|
|
|
return img[y:y + height, x:x + width] |
|
|
|
|
|
def normalize_channels(img, target_channels): |
|
img_shape_len = len(img.shape) |
|
if img_shape_len == 2: |
|
h, w = img.shape |
|
c = 0 |
|
elif img_shape_len == 3: |
|
h, w, c = img.shape |
|
else: |
|
raise ValueError("normalize: incorrect image dimensions.") |
|
|
|
if c == 0 and target_channels > 0: |
|
img = img[..., np.newaxis] |
|
c = 1 |
|
|
|
if c == 1 and target_channels > 1: |
|
img = np.repeat(img, target_channels, -1) |
|
c = target_channels |
|
|
|
if c > target_channels: |
|
img = img[..., 0:target_channels] |
|
c = target_channels |
|
|
|
return img |
|
|
|
|
|
def cut_odd_image(img): |
|
h, w, c = img.shape |
|
wm, hm = w % 2, h % 2 |
|
if wm + hm != 0: |
|
img = img[0:h - hm, 0:w - wm, :] |
|
return img |
|
|
|
|
|
def overlay_alpha_image(img_target, img_source, xy_offset=(0, 0)): |
|
(h, w, c) = img_source.shape |
|
if c != 4: |
|
raise ValueError("overlay_alpha_image, img_source must have 4 channels") |
|
|
|
x1, x2 = xy_offset[0], xy_offset[0] + w |
|
y1, y2 = xy_offset[1], xy_offset[1] + h |
|
|
|
alpha_s = img_source[:, :, 3] / 255.0 |
|
alpha_l = 1.0 - alpha_s |
|
|
|
for c in range(0, 3): |
|
img_target[y1:y2, x1:x2, c] = (alpha_s * img_source[:, :, c] + |
|
alpha_l * img_target[y1:y2, x1:x2, c]) |
|
|