前言
这其实算得上是一个图像处理中遇到的问题。当我们读入一张彩色图像后,希望知道图像中所有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)
这样一行简单的代码就可以简单地得到三个通道值等于指定值位置。同样的道理,更高维度的数组也能进行这样的操作。