如何从python中的图像数组中提取颜色通道

问题描述

我有一个张量为10的样本,每个样本包含10个时间序列20x20x3 RGB图像,我想提取绿色通道

图像存储在称为图像的数组中

例如:

images[0][0][:,:,1]

返回一个样本中一幅图像的绿色通道。

但是,当我尝试使用命令时:

images[0][:][:,1] 

我收到错误

IndexError: too many indices for array

如何概括我的第一行代码以从第一个样本中提取所有绿色通道图像?

数据形状:

images.shape
(10,)

images[0].shape
(10,)

images[0][0].shape
(20,20,3)

这里是数据样本。数据是从.mat文件提取的图像,因此将其存储为数组数组,示例如下所示:

images
array([[array([[[41,0],[43,[45,...,[18,[ 5,[ 0,0]],[[45,[50,[49,[ 3,[[49,[48,[[16,[ 1,[[ 3,[[ 0,0]]],dtype=uint8),array([[[87,[92,[86,[33,[51,[60,[[90,[88,[79,[11,[21,[41,[[89,[82,[62,[12,[ 4,[16,[[77,[77,[76,[44,[42,[[88,[85,[54,[53,[89,[55,

解决方法

像这样吗?

green_0 = [i[:,:,1] for i in images[0]]
all_greens = [[i[:,1] for i in ims] for ims in images]

但是如果images已经是一个numpy数组,则只需执行images[0,1]images[:,1]

,

假设images是具有以下尺寸的NumPy ndarray

images[sample_dim,time_dim,width,height,color]

您可以简单地采用单个切片操作,例如:

images[:,1]

在整个数据集中仅显示绿色。


您一直在做什么,即:

images[0][0][:,1]

可以更简洁有效地重写为:

images[0,1]

要了解为什么images[0][0][:,1]起作用而images[0][:][:,1]不能起作用的原因,建议您查看一下images[0][0]images[0][:]的形状,它们是您要处理的对象正在尝试使用[:,1]


如果images不是单个多维数组,则可以在嵌套列表上调用np.array()构造函数,并将其转换为适当的ndarray


相反,如果您输入的是object s的NumPy数组,其中每个对象也是NumPy数组,则the most efficient approach为:

np.array(images.tolist())