将子文件夹的名称分配给数组中的相应图像

时间:2017-11-07 10:30:20

标签: python image-processing directory subdirectory

我有一个包含许多子文件夹的根目录,每个子文件夹都包含图像。我想将它们全部加载到一个数组中,并为每个图像分配其子文件夹名称。现在我知道如何将所有图像加载到一个形状的数组中,例如(10 000, 512, 512, 3),表示10 000尺寸为512x5123个频道的图像。在分配子文件夹名称之后,我想要一个类似的数组,但我可以说一下10 000个子文件夹中的每一个。

我正在尝试使用os.walk。我知道如何访问所有子文件夹名称和图像名称,但我无法弄清楚如何将它们放在一个数组中。

import os
from scipy.misc import imread

images = []
for root, dirs, files in os.walk('.'):  
    for name in dirs:
        print(name)

    for file in files:
        img = imread(os.path.join(root, file), mode='RGB')
        if img is not None:
            images.append(img)

(如果数组不包含完整的子文件夹名称字符串,但只包含数字(类/子文件夹),那就太棒了。我不确定这是否可以在此加载过程中完成或者它' d在加载所有图像后完成。)

1 个答案:

答案 0 :(得分:0)

这样的事情怎么样?

import glob
import os
from scipy.misc import imread

images = {}

for file in glob.glob("./**/*.png", recursive=True):
    cwd = os.path.basename(os.path.dirname(file))
    img = imread(os.path.abspath(file), mode='RGB')
    if img is not None:
        if cwd not in images.keys():
            images[cwd] = {}
            images[cwd][file] = img
        else:
            images[cwd][file] = img

for key in images.keys():
    print("{:10s}{}".format(key, list(images[key].keys())))

这是一个示例目录结构:

.
├── f_one
│   └── one.png
├── f_two
│   ├── f_nested
│   │   └── nest.png
│   ├── three.png
│   └── two.png
├── out.txt
└── test.py

3 directories, 6 files

以及输出:(由于数组非常大,我没有包含图像数据)

f_two     ['./f_two/three.png', './f_two/two.png']
f_nested  ['./f_two/f_nested/nest.png']
f_one     ['./f_one/one.png']

如果您只使用print(images)代替最后一个循环,那么您将获得以下内容:

{'f_two': {'./f_two/three.png': array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,   

有关此解决方案的一些注意事项:
使用词典意味着键必须是唯一的。如果您有任何具有相同名称的文件夹,则最后一个要读取的文件夹将是dict中唯一存在的文件夹。同一目录中的重复文件名也是如此。如果您具有非唯一的目录或文件名,请尝试使用其他数据结构,或使用绝对路径确保键是唯一的。