Есть ли функция numpy для замены одного массива такой же частью другого массива - PullRequest
0 голосов
/ 09 июля 2020

У меня есть два изображения, хранящиеся в виде массивов numpy. Я ищу функцию, которая может заменить части array2 с черными пикселями ([0, 0, 0]) с такими же индексами array1. Мой код пока не- numpy:

for y in range(array2.shape[0]):
            for x in range(array2.shape[1]):
                if np.all(array2[y, x]) == False:
                    array2[y, x] = array1[y, x]

Код проходит по каждому пикселю в array2, чтобы увидеть, все ли каналы равны 0 (черный), и, если да, копирует цвет array1 с этим индексом на array2.

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

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Это что-то вроде того, что вы хотите? (Я предполагаю, что нет отрицательных значений.) (Изменить: но см. Комментарий Adam.Er8, чтобы снять это ограничение)

>>> arr1                                                                                                                                             
array([[[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]],

       [[4, 4, 4],
        [5, 5, 5],
        [6, 6, 6]],

       [[7, 7, 7],
        [8, 8, 8],
        [9, 9, 9]]])
>>> arr2
array([[[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]],

       [[1, 0, 0],
        [0, 1, 0],
        [0, 0, 0]],

       [[1, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])
>>> idx = arr2.sum(axis=2) == 0
>>> idx
array([[False, False, False],
       [False, False,  True],
       [False,  True,  True]])
>>> arr2[idx] = arr1[idx]
>>> arr2
array([[[1, 0, 0],
        [0, 1, 0],
        [0, 0, 1]],

       [[1, 0, 0],
        [0, 1, 0],
        [6, 6, 6]],

       [[1, 0, 0],
        [8, 8, 8],
        [9, 9, 9]]])
1 голос
/ 09 июля 2020

Вы можете использовать np.copyto:

from scipy.misc import face
from PIL import Image
 
img = face()
out = np.random.randint(-1000,256,img.shape).clip(0,255).astype(np.uint8)

Image.fromarray(out).show()

np.copyto(out,img,where=(out==0).all(axis=-1,keepdims=True))

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