创建Numpy图像数组

Abh*_*sal 11 python opencv numpy image image-processing

我有一些(950)150x150x3 .jpg图像文件,我想读入Numpy数组.

以下是我的代码:

X_data = []
files = glob.glob ("*.jpg")
for myFile in files:
    image = cv2.imread (myFile)
    X_data.append (image)

print('X_data shape:', np.array(X_data).shape)
Run Code Online (Sandbox Code Playgroud)

输出是(950, 150).请让我知道为什么列表没有np.array正确转换,以及是否有更好的方法来创建图像数组.

在我读过的内容中,通过python列表更容易完成追加numpy数组,然后将它们转换为数组.

编辑:一些更多信息(如果它有帮助),正确image.shape返回(150,150,3).

Dom*_*Cat 14

我测试了你的代码.输出对我来说很好

('X_data形状:',(4,617,1021,3))

但是,所有图像都是完全相同的尺寸.

当我添加另一个具有不同范围的图像时,我有这个输出:

('X_data形状:',(5,))

所以我建议检查尺寸和相同数量的通道(就像所有图像的彩色图像一样)?你也应该检查所有图像(或没有图像)是否都有alpha通道(参见@Gughan Ravikumar的评论)

如果只有通道数变化(即某些图像为灰色),则强制将所有颜色加载到颜色格式中:

image = cv2.imread (myFile, cv2.IMREAD_COLOR)
Run Code Online (Sandbox Code Playgroud)

编辑:我使用了问题中的代码,只替换为我的目录(和"*.PNG"):

import cv2
import glob
import numpy as np

X_data = []
files = glob.glob ("C:/Users/xxx/Desktop/asdf/*.PNG")
for myFile in files:
    print(myFile)
    image = cv2.imread (myFile)
    X_data.append (image)

print('X_data shape:', np.array(X_data).shape)
Run Code Online (Sandbox Code Playgroud)

  • 如果任何图像具有不同的形状,你可以在循环中添加一个会引发AssertionError的断言语句:`assert image.shape ==(150,150,3),"img%s的形状%r"%(myFile,image .shape)` (2认同)
  • 谢谢我的一张图片大小为 (150,149,3),显然没有引起注意。抱歉,再次感谢。 (2认同)

Mri*_*dey 5

将图像附加到列表中,然后将其转换为 numpy 数组,这对我不起作用。我有一个大型数据集,每次尝试时 RAM 都会崩溃。相反,我附加了 numpy 数组,但这有其自身的缺点。附加到列表然后转换为 np 数组是空间复杂的,但附加 numpy 数组是时间复杂的。如果您足够耐心,这将解决 RAM 崩溃问题。

def imagetensor(imagedir):
  for i, im in tqdm(enumerate(os.listdir(imagedir))):
    image= Image.open(im)
    image= image.convert('HSV')
    if i == 0:
      images= np.expand_dims(np.array(image, dtype= float)/255, axis= 0)
    else:
      image= np.expand_dims(np.array(image, dtype= float)/255, axis= 0)
      images= np.append(images, image, axis= 0)
  return images
Run Code Online (Sandbox Code Playgroud)

我正在寻找可以兼顾空间和时间的更好的实现。如果有人有更好的主意,请发表评论。