【Python】如何获取Numpy三维数组中目标值的位置

前言

  这其实算得上是一个图像处理中遇到的问题。当我们读入一张彩色图像后,希望知道图像中所有RGB值等于对应值的位置。例如,读入一张图片后,希望获取到所有像素值为(100,100,100)的像素点的坐标。首先,做一个实验。

代码

import numpy as np

img = np.random.randint(0, 255, [3, 3, 3])  # 随机生成一个3*3*3的矩阵,模拟RGB图
color = [100, 100, 100]                     # 目标颜色三通道值
img[1, 1, :] = [100, 100, 100]              # 使(1,1)处的值为所需值

location = (img == color)
print(location)

输出

[[[False False False]
  [False False False]
  [False False False]]

 [[False False False]
  [ True  True  True]
  [False False False]]

 [[False False False]
  [False False False]
  [False False False]]]

  这样的一个实验得到的location是三维的Bool类型数组,而我们需要的其实是二维的数组。所以此时一般的思路就是,三个通道取与。

代码

import numpy as np

img = np.random.randint(0, 255, [3, 3, 3])  # 随机生成一个3*3*3的矩阵,模拟RGB图
color = [100, 100, 100]                     # 目标颜色三通道值
img[1, 1, :] = [100, 100, 100]              # 使(1,1)处的值为所需值

location = (img == color)
# location = location[:, :, 0] * location[:, :, 1] * location[:, :, 2]
location = location[:, :, 0] & location[:, :, 1] & location[:, :, 2]
print(location)

输出

[[False False False]
 [False  True False]
 [False False False]]

  但是再仔细一想,Numpy中有一个取与的函数 np.all() ,所以我们上面的代码可以直接简化。

代码

import numpy as np

img = np.random.randint(0, 255, [3, 3, 3])  # 随机生成一个3*3*3的矩阵,模拟RGB图
color = [100, 100, 100]                     # 目标颜色三通道值
img[1, 1, :] = [100, 100, 100]              # 使(1,1)处的值为所需值

location = np.all((img == color), axis=2)	# 在第二个维度上取与
print(location)

  这样一行简单的代码就可以简单地得到三个通道值等于指定值位置。同样的道理,更高维度的数组也能进行这样的操作。

已完

你可能感兴趣的:(python,python,numpy)