Как удалить вложенные массивы в Numpy IF точно соответствует 0,0,0 - PullRequest
0 голосов
/ 27 января 2019

Я анализирую цвет изображения, но избавляюсь от любого пикселя цвета RGB, который равен 0,0,0 (черный). (используя этот верхний ответ в качестве ссылки)

У меня есть массив пикселей

pixels = np.float32(img.reshape(-1, 3))

[[ 126.   94.   51.]
 [ 171.  115.   65.]
 [ 188.  119.   64.]
 ..., 
 [   0.    0.    0.]
 [   0.    0.    0.]
 [   0.    0.    0.]]

Затем я пытаюсь пройтись и удалить любые черные массивы.

pixelstoignore = np.delete(pixels, np.where(pixels == [0,0,0]), axis=0)

Это работает: enter image description here

Однако разница между средним и доминирующим цветом говорит об обратном.Средний цвет работает правильно.Вот моя картинка:

enter image description here

Похоже, что мой код удаляет любой подмассив, содержащий 0. Например, красный цвет выше имеетЗначение RGB как 255,0,0.Мой код удаляет это.Но я хочу удалить его, только если все 3 значения равны 0!

Я получил среднее значение для работы с использованием np.all, но не могу заставить это работать с функцией удаления.Справка!

РЕДАКТИРОВАТЬ: Решение, кажется, это:

pixelstoignore = np.delete(pixels, np.where((pixels == [0,0,0]).all(axis=1)), axis=0)

1 Ответ

0 голосов
/ 27 января 2019

Вы хотите удалить пиксели, где любое значение равно 0, или только те, где все находятся?

In [212]: arr = np.array([[ 126.,   94.,   51.],
     ...:  [ 171.,  0.,   65.],
     ...:  [ 188.,  119.,   64.],
     ...:  [   1. ,   0.,    0.],
     ...:  [   0. ,   0.,    0.],
     ...:  [   0. ,   1.,    0.]])
     ...:  
     ...:  
In [213]: arr
Out[213]: 
array([[126.,  94.,  51.],
       [171.,   0.,  65.],
       [188., 119.,  64.],
       [  1.,   0.,   0.],
       [  0.,   0.,   0.],
       [  0.,   1.,   0.]])
In [214]: arr == [0,0,0]
Out[214]: 
array([[False, False, False],
       [False,  True, False],
       [False, False, False],
       [False,  True,  True],
       [ True,  True,  True],
       [ True, False,  True]])
In [215]: np.where(arr == [0,0,0])
Out[215]: (array([1, 3, 3, 4, 4, 4, 5, 5]), array([1, 1, 2, 0, 1, 2, 0, 2]))

Чтобы проверить все в строке:

In [216]: (arr == [0,0,0]).all(axis=1)
Out[216]: array([False, False, False, False,  True, False])
In [217]: np.where((arr == [0,0,0]).all(axis=1))
Out[217]: (array([4]),)

In [218]: np.where((arr == [0,0,0]).any(axis=1))
Out[218]: (array([1, 3, 4, 5]),)

Ваши delete и where настолько же хороши, насколько и условные внутри where.

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