图像数据的 numpy 形状的维度顺序是啥?

Posted

技术标签:

【中文标题】图像数据的 numpy 形状的维度顺序是啥?【英文标题】:What is dimension order of numpy shape for image data?图像数据的 numpy 形状的维度顺序是什么? 【发布时间】:2017-09-02 12:38:53 【问题描述】:

我正在使用nibabel lib 从 nii 文件加载数据。我在http://nipy.org/nibabel/gettingstarted.html阅读了lib的文档,发现

无需将任何主要图像数据加载到内存中即可获得此信息。当然也可以以 NumPy 数组的形式访问图像数据

这是我加载数据和形状的代码

import nibabel as nib
img = nib.load('example.nii')
data = img.get_data()
data = np.squeeze(data)
data = np.copy(data, order="C")
print data.shape

我得到了结果

128, 128, 64

什么是数据形状的顺序?是WidthxHeightxDepth吗?我的输入必须安排为depth, height, width。所以我将使用input=data.transpose(2,0,1)。这样对吗?谢谢大家

更新:我发现 Numpy 会按顺序读取图像 Height x Width x Depth 作为参考 http://www.python-course.eu/images/axis.jpeg

【问题讨论】:

Numpy 文档是怎么说的? 我发现,axis=0 是高度,axis=1 是宽度,axis=2 是深度。这样对吗?像这样python-course.eu/images/axis.jpeg 我是想去 Numpy 网站上找形状函数 回答您自己问题的最简单方法是在已知尺寸的示例图像上运行代码。 @user8264 你是对的,它总是 (H, W, D) 因为 NumPy 使用的术语 (axis=0, axis=1, axis=2) 或类似的 (Y, X, Z) 轴,如果你想以这种方式可视化它。跨度> 【参考方案1】:

好的,这是我的看法:

使用scipy.ndimage.imread('img.jpg', mode='RGB'),生成的数组将始终具有以下顺序:(H, W, D) 即(高度、宽度、深度),因为 numpy 用于 ndarrays 的术语(axis=0, axis=1, axis=2) 或类似的(Y, X, Z),如果愿意的话3 维可视化。

# read image
In [21]: img = scipy.ndimage.imread('suza.jpg', mode='RGB')

# image shape as (H, W, D)
In [22]: img.shape
Out[22]: (634, 1366, 3)

# transpose to shape as (D, H, W)
In [23]: tr_img = img.transpose((-1, 0, 1))    

In [23]: tr_img.shape
Out[23]: (3, 634, 1366)

如果您将 img_shape 视为一个元组,

#  index    (0,   1,    2)
img_shape = (634, 1366, 3)
# or index  (-3,  -2,  -1)

选择哪一种方便你记住。


注意scipy.ndimage.imread() API has been removed since Scipy 1.2.0。所以,现在推荐使用imageio.imread(),它读取图像并返回Array,一个numpy数组的子类,遵循上面讨论的相同约定。

# read image
$ img = imageio.imread('suza.jpg', format='jpg')

# convert the image to a numpy array
$ img_np = np.asarray(img)

PS:还应该注意的是,像 tensorflow 这样的库也(几乎)遵循与 numpy 相同的约定。

tf.image_decode_jpeg() 返回:

uint8 类型的张量。 3-D 形状[height, width, channels]

【讨论】:

感谢 kmario23 的回答。我想知道为什么是transpose((-1, 0, 1)) ,而不是transpose((2, 0, 1)) @user8264 你的也是对的。这只是编写(元组/列表的)索引的另一种方式。 谢谢。所以,我在代码中使用了data = np.copy(data, order="C")(有问题)。我需要删除线吗? @user8264 是的,我认为不需要squeezecopy 操作。您使用 img.get_data() 加载的数据本身就是一个 numpy 数组

以上是关于图像数据的 numpy 形状的维度顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

numpy基础四

Numpy改变数组的形状

Numpy改变数组的形状

从具有适当形状的现有迭代中创建3D numpy数组

Numpy总结第二节:Numpy 的属性与形状变换

交错形状不匹配的 NumPy 数组