我有一些(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)
。
答案 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位在每个像素的末尾。