图像数据的 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 是的,我认为不需要squeeze
和copy
操作。您使用 img.get_data()
加载的数据本身就是一个 numpy 数组以上是关于图像数据的 numpy 形状的维度顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章