|
@@ -2,51 +2,47 @@ import cv2
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
-def crop_or_pad(image, crop_size, crop_center=None, pad_val=None):
|
|
|
+def crop_or_pad(image, x_min, y_min, x_max, y_max, pad_val=None):
|
|
|
"""
|
|
|
References:
|
|
|
tf.image.resize_image_with_crop_or_pad
|
|
|
"""
|
|
|
assert image.ndim in [2, 3]
|
|
|
+ assert isinstance(x_min, int) and isinstance(y_min, int)
|
|
|
+ assert isinstance(x_max, int) and isinstance(y_max, int)
|
|
|
+ assert (x_min <= x_max) and (y_min <= y_max)
|
|
|
|
|
|
src_height, src_width = image.shape[:2]
|
|
|
+ dst_height, dst_width = y_max - y_min + 1, x_max - x_min + 1
|
|
|
channels = 1 if image.ndim == 2 else image.shape[2]
|
|
|
- dst_height, dst_width = crop_size[1], crop_size[0]
|
|
|
- if crop_center is None:
|
|
|
- crop_center = [src_width // 2, src_height // 2]
|
|
|
+
|
|
|
if pad_val is not None:
|
|
|
if isinstance(pad_val, (int, float)):
|
|
|
pad_val = [pad_val for _ in range(channels)]
|
|
|
assert len(pad_val) == channels
|
|
|
|
|
|
- crop_begin_x = int(round(crop_center[0] - dst_width / 2.0))
|
|
|
- crop_begin_y = int(round(crop_center[1] - dst_height / 2.0))
|
|
|
-
|
|
|
- src_begin_x = max(0, crop_begin_x)
|
|
|
- src_begin_y = max(0, crop_begin_y)
|
|
|
- src_end_x = min(src_width, crop_begin_x + dst_width)
|
|
|
- src_end_y = min(src_height, crop_begin_y + dst_height)
|
|
|
- dst_begin_x = max(0, -crop_begin_x)
|
|
|
- dst_begin_y = max(0, -crop_begin_y)
|
|
|
- dst_end_x = dst_begin_x + src_end_x - src_begin_x
|
|
|
- dst_end_y = dst_begin_y + src_end_y - src_begin_y
|
|
|
+ src_x_begin = max(x_min, 0)
|
|
|
+ src_y_begin = max(y_min, 0, )
|
|
|
+ src_x_end = min(x_max + 1, src_width)
|
|
|
+ src_y_end = min(y_max + 1, src_height)
|
|
|
+ dst_x_begin = src_x_begin - x_min
|
|
|
+ dst_y_begin = src_y_begin - y_min
|
|
|
+ dst_x_end = src_x_end - x_min
|
|
|
+ dst_y_end = src_y_end - y_min
|
|
|
|
|
|
if image.ndim == 2:
|
|
|
- cropped_image_shape = (dst_height, dst_width)
|
|
|
+ dst_image_shape = (dst_height, dst_width)
|
|
|
else:
|
|
|
- cropped_image_shape = (dst_height, dst_width, channels)
|
|
|
+ dst_image_shape = (dst_height, dst_width, channels)
|
|
|
if pad_val is None:
|
|
|
- cropped = np.zeros(cropped_image_shape, image.dtype)
|
|
|
+ dst_image = np.zeros(dst_image_shape, image.dtype)
|
|
|
else:
|
|
|
- cropped = np.full(cropped_image_shape, pad_val, dtype=image.dtype)
|
|
|
- if (src_end_x - src_begin_x <= 0) or (src_end_y - src_begin_y <= 0):
|
|
|
- return cropped
|
|
|
- else:
|
|
|
- cropped[dst_begin_y: dst_end_y, dst_begin_x: dst_end_x, ...] = \
|
|
|
- image[src_begin_y: src_end_y, src_begin_x: src_end_x, ...]
|
|
|
- return cropped
|
|
|
-
|
|
|
-
|
|
|
+ dst_image = np.full(dst_image_shape, pad_val, dtype=image.dtype)
|
|
|
+ dst_image[dst_y_begin: dst_y_end, dst_x_begin: dst_x_end, ...] = \
|
|
|
+ image[src_y_begin: src_y_end, src_x_begin: src_x_end, ...]
|
|
|
+ return dst_image
|
|
|
+
|
|
|
+
|
|
|
def crop_or_pad_coords(boxes, image_width, image_height):
|
|
|
"""
|
|
|
References:
|
|
@@ -73,5 +69,4 @@ def crop_or_pad_coords(boxes, image_width, image_height):
|
|
|
dst_x_begin, dst_y_begin, dst_x_end, dst_y_end], axis=1)
|
|
|
return coords
|
|
|
|
|
|
-
|
|
|
|