如何在python中将黑白图像转换为3维数组?

时间:2017-05-08 17:12:19

标签: python image numpy image-processing computer-vision

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

我知道通常黑白图像都是以这种格式存储的,但我特别需要numpy.zeros(shape=[400, 400, 1]) 图像形状,你会得到的形状,让我们说:

* {
	box-sizing: border-box;
}

.container {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	max-width: 400px;
	margin: 0 auto;
	padding: 25px;
	border: 2px solid black;
}

.box {
	display: block;
	height: 160px;
	width: 100px;
	margin-bottom: 25px;
	border: 2px solid black;
}

3 个答案:

答案 0 :(得分:5)

您可以随时添加"空"尺寸使用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)

答案 1 :(得分:3)

内置np.atleast_3d完全符合此目的 -

np.atleast_3d(img)

此内置功能通过将一个新轴附加为3D数组的最后一个轴来保持输出形状为2D,并且对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)

答案 2 :(得分:0)

只需添加另一个可能的解决方案,就可以使用以下方法(请参见np.reshape):

import numpy as np

img = np.random.randint(0,255,(800,600))  # grayscale img
print(img.shape)  # prints (800, 600)

img = np.reshape(img.shape[0], img.shape[1], 1)
print(img.shape)  # prints (800, 600, 1)

如上所述,这只是另一种可能的解决方案。我不确定与其他建议的答案相比效果如何,其他答案看起来更优雅,更干净。