Эффективный способ присвоения значений случайным блокам массива изображений? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть 3d-массив. Это массив двухмерных квадратных изображений одинакового размера. Моя задача состоит в том, чтобы заблокировать случайный квадратный патч изображений (установите все значения пикселей в 0). Я могу понять, как это сделать в случае, если у меня есть только 1 изображение, как показано ниже

x = np.random.randint(image_width - size)
y = np.random.randint(image_width - size)
image[x:x + size, y:y + size] = 0

где размер - размер заблокированной области. Я не уверен, как эффективно применить эту технику к массиву 2d изображений, где заблокированный патч генерируется случайным образом для каждого (не обязательно один и тот же патч блокируется в каждом изображении в массиве). Я чувствую себя немного растерянным во всех новых инструментах индексирования, с которыми мне приходится иметь дело (вещание, необычная индексация и т. Д.), И мне было интересно, есть ли быстрый и простой способ сделать это, спасибо. В настоящее время мой подход заключается в том, чтобы просто перебирать каждое изображение, используя цикл for, выполняя по одному изображению за раз, но мне было интересно, достаточно ли numpy, чтобы каким-то образом сделать их все одним махом. Я понимаю, что мне нужно использовать

x_array = np.random.randint(image_width - size, size=len(image_array))
y_array = np.random.randint(image_width - size, size=len(image_array))

в какой-то момент, но я не знаю где.

1 Ответ

0 голосов
/ 16 сентября 2018

Мы можем использовать np.lib.stride_tricks.as_strided на основе scikit-image's view_as_windows, чтобы получить раздвижные окна. Дополнительная информация по использованию as_strided на основе view_as_windows.

from skimage.util.shape import view_as_windows

# Get sliding windows as views
w = view_as_windows(image_array,(1,size,size))[...,0,:,:]

# Index with advanced-indexing into windows array and
# assign into it, thus reassigning into input array directly being views
w[np.arange(len(x_array)),x_array,y_array] = 0

Пробный прогон

Настройка входов -

In [60]: image_array # input array
Out[60]: 
array([[[54, 57, 74, 77, 77],
        [19, 93, 31, 46, 97],
        [80, 98, 98, 22, 68],
        [75, 49, 97, 56, 98]],

       [[91, 47, 35, 87, 82],
        [19, 30, 90, 79, 89],
        [57, 74, 92, 98, 59],
        [39, 29, 29, 24, 49]],

       [[42, 75, 19, 67, 42],
        [41, 84, 33, 45, 85],
        [65, 38, 44, 10, 10],
        [46, 63, 15, 48, 27]]])

In [68]: size
Out[68]: 2

# x and y starting indices for 0s assignments 
In [65]: x_array
Out[65]: array([1, 0, 1])

In [66]: y_array
Out[66]: array([2, 2, 0])

Используйте предложенное решение -

In [62]: w = view_as_windows(a,(1,size,size))[...,0,:,:]

In [63]: w[np.arange(len(x_array)),x_array,y_array] = 0

In [64]: image_array # verify
Out[64]: 
array([[[54, 57, 74, 77, 77], # start at (1,2)
        [19, 93,  0,  0, 97],
        [80, 98,  0,  0, 68],
        [75, 49, 97, 56, 98]],

       [[91, 47,  0,  0, 82], # start at (0,2)
        [19, 30,  0,  0, 89],
        [57, 74, 92, 98, 59],
        [39, 29, 29, 24, 49]],

       [[42, 75, 19, 67, 42], # start at (1,0)
        [ 0,  0, 33, 45, 85],
        [ 0,  0, 44, 10, 10],
        [46, 63, 15, 48, 27]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...