Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建图像的Numpy数组_Python_Image_Opencv_Numpy_Image Processing - Fatal编程技术网

Python 创建图像的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

我有一些(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.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