Создайте массив из 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 или более, кроме тех, которые мы изменили, но мы не можем сказать, к какому именно пикселю принадлежать.