我有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;
}
答案 0 :(得分:5)
您可以随时添加"空"尺寸使用np.expand_dims
:
>>> a2d = np.ones((100, 200))
>>> a3d = np.expand_dims(a, axis=2)
>>> a3d.shape
(100, 200, 1)
或使用None
或np.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)
如上所述,这只是另一种可能的解决方案。我不确定与其他建议的答案相比效果如何,其他答案看起来更优雅,更干净。