Как использовать `np.where ()` для сравнения массивов, а не отдельных значений - PullRequest
2 голосов
/ 05 апреля 2019

У меня есть изображение (2D массив) с 3 цветными каналами.Примерно так:

[[[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]

 [[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]

 [[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]

 ...

 [[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]

 [[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]

 [[128 197 254]
  [128 197 254]
  [128 197 254]
  ...
  [182 244 255]
  [182 244 255]
  [182 244 255]]]

Я хочу получить индексы цветов, например [255, 255, 255].Я пытался использовать np.where() или np.argwhere(), но сравнивал значения, а не массивы.Какой самый быстрый и эффективный способ сделать это?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2019

IIUC, вы можете использовать np.nonzero

np.nonzero((arr==255).all(axis=2))

, который вернет кортеж массивов, которые представляют индексы.Если вы выполните

arr[ind]

, где ind - возвращение из первого выражения, вы можете получить доступ / изменить все строки со всеми 255.

0 голосов
/ 05 апреля 2019

Простой способ сделать это с помощью np.where:

import numpy as np

# Generating an example array
width = 100 
height = 100
channels = 3
img = np.random.rand(width, height, channels) * 255

# Defining the three value channels
r=0 
g=1 
b=2

# Defining the query values for the channels, here [255, 255, 255]
r_query = 255
g_query = 255
b_query = 255

# Print a 2D array with the coordinates of the white pixels
print(np.where((img[:,:,r] == r_query) & (img[:,:,g] == g_query) & (img[:,:,b] == b_query)))

Это дает вам 2D-массив с координатами белых пикселей [255, 255, 255] в исходном массиве (изображение).

Примечание: Другим способом было бы использование OpenCV

mask = cv2.inRange(img, [255, 255, 255], [255, 255, 255])
output = cv2.bitwise_and(img, img, mask = mask)
...