2016-11-16 359 views
2

我已经使用枕头将图像加载为numpy数组,并且生成的numpy数组的维数为(184,184,4),即它是一个184x184像素的图像,每个像素具有RGBA尺寸。将RGBA numpy数组转换为二进制2d numpy数组

对于所有的实际用途,我的应用程序只需要知道一个像素是否黑色,因此我只需要一个带有0,1的184x184 np数组。

我是新来的numpy,特别是图像处理,想知道是否有更快的方法来做到这一点。

我试着在循环中检查每个像素的天真实现,这看起来太昂贵了。

回答

2

如果我理解正确,你有一个形状的数组(184,184,4),你想得到一个带形状的布尔数组(184,184),这取决于最终维数是否等于[0,0,0,0 ]

image = np.random.randint(0, 255, size=(184, 184, 4)) #Generate random image 
isBlack = np.int64(np.all(image[:, :, :3] == 0, axis=2)) 

完成!

但它是如何工作的?这看起来很神奇! Numpy有点神奇。这就是我们喜欢它的原因。在这种情况下:

  • == 0转换为根据每个数是否一(184,184,4)布尔阵列的图像是在这种情况下,我们使用图像[等于0
  • :,:,:3 ]排除等式中的第4个数
  • np.all询问所有元素是否等于0.
  • axis参数更改它所查看的轴,记住python从0开始计数,所以第三轴是数字2.
+0

如果我想要0或1而不是True或假的。 –

+0

isBlack = np.int16((np.all(image == 0,axis = 2))) –

+0

另外我想要最终维度等于[0,0,0,<我不关心这个地方>] –