Как изменить массив Numpy после применения n.where? - PullRequest
0 голосов
/ 08 июля 2019

У меня output и imarray, обе имеют одинаковую форму.В следующем коде я хочу закрасить определенные пиксели до colors[0]:

colors = [[0,0,255],[0,255,0]]
output[np.where((imarray >= values[0])&(imarray <= values[1]))] = colors[0]

, но это дает ошибку, поскольку массив output сглаживается до формы (4413,).Ошибка:

ValueError: shape mismatch: value array of shape (3,) could not be broadcast to indexing result of shape (4413,)

1 Ответ

0 голосов
/ 08 июля 2019

Создайте массив из 3 цветных изображений:

In [453]: arr = np.random.randint(0,256,(10,10,3))                                                           
In [454]: arr1=arr.copy()

Теперь примените маску where, сравнивая значения с некоторым «цветом»:

In [455]: arr1[np.where(arr >= [100,100,100])].shape                                                         
Out[455]: (188,)
In [456]: 188/3                                                                                              
Out[456]: 62.666666666666664

В вашем примере маскавыбрал модуль 3 набора элементов, но здесь это не так.Он выбирает элементы массива из смеси пикселей.Я подозреваю, что вам / нам действительно нужны пиксели, которые удовлетворяют некоторой цветовой комбинации.Для этого нам нужно использовать all или any, чтобы уменьшить маску до 2d - до пикселей

In [457]: np.where(np.all(arr >= [100,100,100],2))                                                           
Out[457]: 
(array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9]),
 array([2, 4, 6, 9, 1, 3, 5, 6, 3, 8, 4, 8, 3, 1, 3, 5, 3, 4, 5, 4, 6]))

In [458]: arr1[_457] = [0,0,255]   

Это работает, потому что arr1[Out[457]] - это (21,3) - 21 пиксель.np.array([0,0,255]) - это (3,), который вещает на (21,3).


Сравните набор пикселей, выбранных с помощью маски all:

In [460]: arr1[_457]                                                                                         
Out[460]: 
array([[  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255],
       [  0,   0, 255]])

, снабор значений массива, выбранных с помощью 3d-маски:

In [461]: arr1[np.where(arr >= [100,100,100])]                                                               
Out[461]: 
array([145, 250, 198,   0,   0, 255,   0,   0, 255, 249, 208, 179, 184,
       100, 128, 219, 217, 128, 202, 200, 127, 118, 149, 236, 199, 136,
       110, 170, 199,   0,   0, 255, 128, 252, 193, 210,   0,   0, 255,
         0,   0, 255, 151, 163,   0,   0, 255, 212, 109, 187, 202, 129,
       110, 206, 137, 219, 227, 115, 130, 150, 201, 190, 231,   0,   0,
       255,   0,   0, 255, 236, 146, 113, 204, 221, 144, 128, 205, 181,
       114,   0,   0, 255, 219, 200, 197, 189, 141, 226, 248,   0,   0,
       255, 218, 245, 180, 251, 140, 253,   0,   0, 255, 143, 147, 143,
       245,   0,   0, 255, 235, 253, 165, 234, 205, 105, 122,   0,   0,
       255, 162, 149, 200, 202, 142, 208, 133, 254, 119, 205, 111,   0,
         0, 255,   0,   0, 255, 180, 158,   0,   0, 255, 170, 205, 103,
       122, 238, 104, 177, 172, 189, 192, 194,   0,   0, 255,   0,   0,
       255,   0,   0, 255, 143, 224, 213, 159, 182, 148, 168, 237, 127,
       233, 230, 244, 172, 216, 107,   0,   0, 255, 111, 254,   0,   0,
       255, 246, 148, 223, 174, 199])

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

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