2013-04-07 76 views
1

我需要访问文件夹中的所有图像并将其存储在矩阵中。我能够使用MATLAB来做到这一点,这里是代码:使用python映射到矩阵

input_dir = 'C:\Users\Karim\Downloads\att_faces\New Folder'; 
image_dims = [112, 92]; 

filenames = dir(fullfile(input_dir, '*.pgm')); 
num_images = numel(filenames); 

images = []; 
for n = 1:num_images 
    filename = fullfile(input_dir, filenames(n).name); 
    img = imread(filename); 
    img = imresize(img,image_dims); 
end 

但我需要使用Python做到这一点,这是我的Python代码:

import Image 
import os 
from PIL import Image 
from numpy import * 
import numpy as np 


#import images 
dirname = "C:\\Users\\Karim\\Downloads\\att_faces\\New folder" 


#get number of images and dimentions 
path, dirs, files = os.walk(dirname).next() 
num_images = len(files) 
image_file = "C:\\Users\\Karim\\Downloads\\att_faces\\New folder\\2.pgm" 
im = Image.open(image_file) 
width, height = im.size 



images = [] 

for x in xrange(1, num_images): 
    filename = os.listdir(dirname)[x] 
    img = Image.open(filename) 
    img = im.convert('L') 
    images[:, x] = img[:] 

但我得到这个错误: IOError:[Errno 2]没有这样的文件或目录:'10 .pgm' 虽然文件存在。

+3

您需要将文件的绝对路径传递给Image.open,除非您的cwd与图像位于同一位置。 'os.path.join(路径,文件名)'应该工作。 – GP89 2013-04-07 12:09:46

+0

@ GP89:你的意思是我应该用'filename = os.path.join(dirname,x)'替换'filename = os.listdir(dirname)[x]'? – user2229953 2013-04-07 12:22:18

+0

不,从'os.listdir'行返回的'filename'就是例如“10.pgm”。如果你只是通过它,它会在脚本运行的当前目录中查找它。创建一个新的变量'filepath = os.path.join(路径,文件名)',并将'filepath'传递给'Image.open'。那么你不应该得到'IOError'。这将工作,因为'filepath'值将是一个绝对路径,'“C:\\ Users \\ Karim \\ Downloads \\ att_faces \\ New folder \\ 10.pgm”' – GP89 2013-04-07 12:28:19

回答

6

我不是很确定你的最终目标是什么,但尝试更多的东西是这样的:

import numpy as np 
import Image 
import glob 

filenames = glob.glob('/path/to/your/files/*.pgm') 
images = [Image.open(fn).convert('L') for fn in filenames] 
data = np.dstack([np.array(im) for im in images]) 

这将产生一个宽×高×NUM_IMAGES numpy的阵列,假设你所有的图片都具有相同的尺寸。

但是,您的图像将被排序,所以你可能想要做filenames.sort()。另外,你可能会也可能不想把事物当作一个3D numpy数组,但这完全取决于你实际做了什么。如果你只是想对每个“框架”单独进行操作,那么不要将它们堆叠成一个巨大的阵列。

+0

我得到了另一个错误'ValueError:至少需要一个数组连接' – user2229953 2013-04-07 23:35:24

+1

查看'filenames'(即'print filenames')。这听起来像没有任何文件符合你指定的模式。 – 2013-04-07 23:37:38