2017-05-08 20 views
2

我有RGB格式或灰度格式的图像(我通过Gimp转换它,现在我们说),现在每次我加载图像的灰度,或者只是将其转换为灰度格式,形状总是说[高度,宽度]没有第三维(颜色通道的数量)。如何将黑白图像转换为python中的三维数组?

我知道,一般的B/W图像存储在这样的格式,但我特别需要的[height, width, 1]图像形状,一个你会用得到的,比方说:

numpy.zeros(shape=[400, 400, 1]) 
+0

无论有没有张贴的解决方案为你工作的? – Divakar

+1

是的,这两个解决方案工作,我忘记标记其中之一被指责,谢谢提醒! – danchy

回答

2

您可以随时添加“空“尺寸使用np.expand_dims

>>> a2d = np.ones((100, 200)) 
>>> a3d = np.expand_dims(a, axis=2) 
>>> a3d.shape 
(100, 200, 1) 

或通过用Nonenp.newaxis切片:

>>> a2d[..., None].shape # instead of "..." (Ellipsis) you could also use `[:, :, None]` 
(100, 200, 1) 

我更喜欢np.expand_dims,因为它比切片更清晰。


如果你需要有条件,检查arr.ndim第一:

if arr.ndim == 2: 
    arr = np.expand_dims(arr, axis=2) 
2

有一个内置的np.atleast_3d正是为了这个目的 -

np.atleast_3d(img) 

这个内置的采用的护理通过在2D数组中添加一个新轴作为最后一个,保持输出形状为3D,并且不会更改3D投入,所有照顾下的引擎盖。

采样运行 -

In [42]: img = np.random.randint(0,255,(800,600)) # grayscale img 

In [43]: np.atleast_3d(img).shape 
Out[43]: (800, 600, 1) 

In [44]: img = np.random.randint(0,255,(800,600,3)) # RGB img 

In [45]: np.atleast_3d(img).shape 
Out[45]: (800, 600, 3) 
+0

我只尝试过'np.array(img,ndmin = 3,copy = False)',但这只是预先设定尺寸。很高兴知道他们有另外一个附加维度的功能。 :) – MSeifert

+0

另一件“关心它在引擎盖下”听起来不对。你的意思是“照顾它......”吗? – MSeifert

+1

@ MSeifert在那里没有任何单词。编辑更有意义。 – Divakar

相关问题