Python 创建图像的Numpy数组
我有一些(950)150x150x3.jpg图像文件,我想读入Numpy数组 以下是我的代码:Python 创建图像的Numpy数组,python,image,opencv,numpy,image-processing,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) 输出为(950150)。请告诉我为什么列表未正确转换为np.arra
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)
输出为(950150)
。请告诉我为什么列表未正确转换为np.array
,以及是否有更好的方法创建图像数组
在我读到的内容中,通过python列表将其附加到numpy数组,然后将其转换为数组,这样做更容易
编辑:更多信息(如果有帮助),
image.shape
正确返回(150150,3)
。我测试了你的代码。它对我的输出效果很好
('X_数据形状:',(46171021,3))
然而,所有的图像都是完全相同的维度
当我添加另一个具有不同范围的图像时,我有以下输出:
('X_数据形状:',(5,))
因此,我建议检查大小和相同数量的通道(如所有图像都是彩色图像)?此外,您还应该检查是否所有图像(或没有)都有alpha通道(请参阅@Gughan Ravikumar的评论)
如果只有通道的数量不同(即,某些图像为灰色),则使用以下命令强制将所有图像加载到颜色格式中:
image = cv2.imread (myFile, cv2.IMREAD_COLOR)
编辑:
我使用了问题中的代码,只替换为我的目录(和“*.PNG”):
将放入相同大小矩阵中的.JPG帧的定义应为x、y、R、G、B、a。不使用“a”,但它在每个像素的末尾占用8位 在列表中附加图像,然后将其转换为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
我正在寻找能够兼顾空间和时间的更好的实现。如果有人有更好的想法,请发表评论。这里有一个解决方案,用于具有特定Unicode字符的图像,或者如果我们正在使用带有透明层的PNG,这两种情况我必须处理我的数据集。此外,如果有任何图像的分辨率不符合要求,则不会将其添加到Numpy阵列中。这使用的是cv2,而不是cv2
分辨率=150
导入glob
将numpy作为np导入
从PIL导入图像
X_数据=[]
files=glob.glob(r“D:\Pictures\*.png”)
对于文件中的my_文件:
打印(我的文件)
image=image.open(我的文件).convert('RGB')
image=np.数组(image)
如果image为None或image.shape!=(决议,决议,3):
打印(f'此图像不正确:{myFile}{image.shape,如果图像不是None,则为None}')
其他:
X_data.append(图像)
打印('X_数据形状:',np.array(X_数据).shape)
#如果您有950个150x150图像,这将打印“X_数据形状:(950、150、150、3)”
如果您不使用Python 3.6+,则可以用常规字符串替换r字符串(如果您使用Windows,则用
\\
代替\
),并用常规字符串插值替换f字符串。您的目标是什么?4D 950x150x150x3阵列?或者150x150x3或其他“正确”数组的列表?@DomTomCat一个4D 950x150x150x3数组。是否X_数据。追加(np.array(image))
help?@gughanavikumar它没有帮助,因为cv2.imread已经返回一个numpy数组。@AbhishekBansal然后尝试np.vstack(X_数据)
而不是np.array(X_数据)
所有图像均为3通道,尺寸为150x150x3。是否还有其他错误?您可以强制执行相同的数据类型进行测试:image=cv2.imread(myFile,1).astype(np.uint8)
,但是我不太相信这一点。如果任何图像具有不同的形状,您可以在循环中添加一个assert语句,该语句将引发AssertionError:assert image.shape==(150150,3),“img%s具有形状%r”%(myFile,image.shape)
谢谢,我的一张图像大小(150149,3),显然没有引起注意。抱歉,再次感谢。
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