创建Numpy图像数组

时间:2016-06-10 11:23:26

标签: python image opencv numpy 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)

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

在我所读到的内容中,通过python列表更容易地将numpy数组附加到numpy数组,然后将它们转换为数组。

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

4 个答案:

答案 0 :(得分:11)

我测试了你的代码。它适用于我的输出

  

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

然而,所有图像都是完全相同的尺寸。

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

  

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

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

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

image = cv2.imread (myFile, 1)

编辑: 我使用了问题中的代码,只替换为我的目录(和#34; * .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)

答案 1 :(得分:3)

在列表中添加图像,然后将其转换为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

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

答案 2 :(得分:1)

这是具有某些特殊Unicode字符的图像的解决方案,或者如果我们正在使用具有透明层的PNG,这是我必须处理数据集的两种情况。此外,如果有任何图像分辨率不理想,则不会将它们添加到Numpy数组中。这将使用Pillow package而不是cv2。

resolution = 150

import glob
import numpy as np
from PIL import Image

X_data = []
files = glob.glob(r"D:\Pictures\*.png")
for my_file in files:
    print(my_file)
    
    image = Image.open(my_file).convert('RGB')
    image = np.array(image)
    if image is None or image.shape != (resolution, resolution, 3):
        print(f'This image is bad: {myFile} {image.shape if image is not None else "None"}')
    else:
        X_data.append(image)

print('X_data shape:', np.array(X_data).shape)
# If you have 950 150x150 images, this would print 'X_data shape: (950, 150, 150, 3)'

如果您未使用Python 3.6+,则可以将r字符串替换为常规字符串(如果使用Windows,则用\\代替\除外),并且具有常规字符串插值功能的f字符串。

答案 3 :(得分:0)

您对将放入相同大小的矩阵的.JPG帧的定义应该是x,y,R,G,B,A。不使用“A”,但它确实需要8位在每个像素的末尾。