Разрезание разных областей двух изображений за один раз - PullRequest
1 голос
/ 19 мая 2019

Разрезание разных областей двух изображений за один раз

У меня есть два изображения размера [2, высота, ширина, канал] и одинакового размера.Я хочу нарезать два изображения одним ядром (скажем, 5 x 5) в разных местах за один раз.Например, для первого изображения площадь среза составляет от [125px, 125px] до [130px, 130px];для второго изображения срезы составляют от [140px, 140px] до [145px, 145px].

Я использовал следующий код imgs [:, yst: yend, xst: xend], в котором yst - это двавходной массив начальных координат (т.е. [125, 140]) для двух изображений соответственно.yend для конечных координат аналогично.Так что делайте xst и xend для координат оси ширины.

Вместо получения двух областей среза, код привел к четырем областям.То есть два среза были применены к каждому изображению.

Я ожидаю, что первый срез будет применен к первому изображению, а второй срез будет применен ко второму изображению соответственно.Я пробовал различные размерные комбинации, и ни одна из них не работала так, как мне хотелось.Я заканчивал тем, что зацикливал их один за другим в данный момент.Но мое внутреннее чувство говорит мне, что это можно сделать за один раз.Кто-нибудь может помочь?

Заранее спасибо

1 Ответ

0 голосов
/ 19 мая 2019

Я вижу два варианта для достижения того, что вы хотите.

  1. перейти к причудливой индексации
  2. использовать трюки с шагами

Последний быстрее, нонемного опасно (опечатка в магии настройки размеров может привести к краху вашего скрипта):

Вот пример:

import numpy as np
from numpy.lib.stride_tricks import as_strided
from scipy.misc import face
from timeit import timeit

def fancy_idx():
    ino, y, x = np.ogrid[:nim,:yw,:xw]
    ywo, xwo = ywoff.reshape(-1,1,1), xwoff.reshape(-1,1,1)
    return im[ino, ywo+y, xwo+x]

def stride_trx():
    nim, y, x = im.shape
    st = im.strides
    wins = as_strided(im, (nim, y-yw+1, x-xw+1, yw, xw), (*st, *st[1:]))
    return wins[np.arange(nim), ywoff, xwoff]

# set up example
# use the scipy example image
# use the color channels (RGB) as individual images
im = np.ascontiguousarray(np.moveaxis(face(), 2, 0))
nim = len(im)
# set the window height and width
yw, xw = 150, 200
# set the top left corners for window in each image
ywoff, xwoff = np.array([[510,530,520],[700,720,750]])

# test
assert (fancy_idx()==stride_trx()).all()

print(timeit(fancy_idx, number=1000))
print(timeit(stride_trx, number=1000))

Пример выполнения:

0.4873827249975875    # fancy indexing
0.028213004930876195  # stride tricks

Некоторыеобъяснение:

  1. необычное индексирование: этот метод обращается к каждому пикселю индивидуально, это гибкий и безопасный, но медленный
  2. трюк шага: этот метод быстрее, потому что только верхний левый уголкаждого окна адресуется причудливо, сами окна создаются путем нарезки

    как это работает?по сути, мы создаем 5D массив путем дублирования (в админке, а не в данных) осей y и x.Таким образом, мы можем использовать первую копию y и x, чтобы выбрать смещения, и вторую копию y и x, чтобы нарезать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...