Numpy индексы: обрезать прямоугольник из матрицы с перекрытием / интересующей областью больше, чем изображение - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу выполнить произвольную обрезку фиксированного размера прямоугольника на изображениях различного размера. Это означает, что обрезка может перекрывать изображение со всех сторон. Я хочу сделать это с помощью нарезки, то есть я хочу предварительно вычислить диапазон индекса для изображения (матрица sr c) и кадрирования (матрица dst) для производительности.

crop = np.zeros((crop_size_x, crop_size_y, 3), dtype=np.uint8)
x_min_dst = ???
x_max_dst = ???
x_min_src = ???
x_max_src = ???
[...] # same for y
crop[x_min_dst:x_max_dst, y_min_dst:y_max_dst, :] = image[x_min_src:x_max_src,y_min_src:y_max_src, :]

Если кто-то знает решение для этого, пожалуйста, дайте мне знать, в противном случае я постараюсь найти решение самостоятельно и опубликовать его здесь. Может быть, в numpy или opencv уже есть функция, которая делает это?

Этот чертеж должен прояснить проблему (учитывается только перекрытие в измерении x, измерение y должно быть аналогичным):

enter image description here

1 Ответ

0 голосов
/ 09 апреля 2020

Вот мое текущее решение:

crop = np.zeros((crop_size_y, crop_size_x, 3), dtype=np.uint8)
image_width = image.shape[1]
image_height = image.shape[0]
xmin_crp, xmax_crp, xmin_img, xmax_img = get_roi_coordinates(offset_width, crop_size_x, image_width)
ymin_crp, ymax_crp, ymin_img, ymax_img = get_roi_coordinates(offset_height, crop_size_y, image_height)
crop[ymin_crp:ymax_crp, xmin_crp:xmax_crp, :] = image[ymin_img:ymax_img, xmin_img:xmax_img, :]


def get_roi_coordinates(rand_offset, crop_width, image_width):
    # No overlap:
    xmin_crp = 0
    xmax_crp = crop_width
    xmin_img = rand_offset
    xmax_img = rand_offset + crop_width

    overlapping_left = xmin_img < 0
    overlapping_right = xmax_img > image_width

    if overlapping_left:
        xmin_crp = np.abs(rand_offset)
        xmin_img = 0

    if overlapping_right:
        xmax_img = image_width
        overlap_right = rand_offset + crop_width - image_width
        xmax_crp = crop_width - overlap_right
    return xmin_crp, xmax_crp, xmin_img, xmax_img
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...