python 如何读取图像和相应的文本文件从文件夹和保存图像在其他文件夹的基础上标签

cnjp1d6j  于 2023-04-10  发布在  Python
关注(0)|答案(2)|浏览(143)

我有一个数据集,其中一个文件夹包含图像,另一个文件夹包含相应的文本文件。每个文本文件包含相应类的标签。

Images folder 
          image_0000.jpeg 
          image_0001.jpeg

Label folder 
          image_0000.txt
          image_0001.txt

标签文本文件包含值0或1或2。
我想保存图像对应的标签0在另一个文件夹。类似的其余标签1,2
正如你在下面的图片中看到的。
Dataset Description

def read_image_list(image_list_file):
    f = open(image_list_file, 'r')
    filenames = []
  
    for line in f:
        filename, label = line[:-1].split(' ')
        filenames.append(filename)
        
    return filenames
bvn4nwqk

bvn4nwqk1#

1.导入必要的库,如os、shutil和PIL。
1.定义读取和保存图像的源目录和目标目录。
1.循环访问源目录中的每个文件,并使用PIL库检查它是否是图像文件。
1.如果文件是图像,则通过将扩展名从“.jpg”更改为“.txt”来读取其对应的文本文件。
1.从文本文件中提取标签,并在目标目录中使用该标签创建新文件夹。
1.使用shutil将图像文件复制到新创建的文件夹中。
1.对源目录中的每个图像文件重复上述步骤。
下面是实现上述步骤的代码:

import os
import shutil
from PIL import Image

# Define the source directory and destination directory
src_dir = "path/to/source/directory"
dst_dir = "path/to/destination/directory"

# Iterate through each file in the source directory
for filename in os.listdir(src_dir):
    filepath = os.path.join(src_dir, filename)
    
    # Check if the file is an image
    if filename.endswith(".jpg"):
        
        # Read the corresponding text file
        text_filename = os.path.splitext(filename)[0] + ".txt"
        text_filepath = os.path.join(src_dir, text_filename)
        with open(text_filepath, "r") as f:
            label = f.readline().strip()
        
        # Create a new folder with the label in the destination directory
        label_dir = os.path.join(dst_dir, label)
        if not os.path.exists(label_dir):
            os.makedirs(label_dir)
        
        # Copy the image file to the newly created folder
        dst_filepath = os.path.join(label_dir, filename)
        shutil.copyfile(filepath, dst_filepath)
5us2dqdw

5us2dqdw2#

只要改变前三个目录变量就会让代码像魔咒一样工作,Prem J给出的答案也很酷。

import os
import shutil

# assumung that the names of the images and the labels are same excepth the extension

image_dir = "f1/im"  # Images directory path
label_dir = "f1/la"  # Labels directory path

final_dir = "f1/dataset" # the dataset directory where you want to save the images as label folders

images = os.listdir(image_dir)  # list of all the images names
label = os.listdir(label_dir)  # list of all the label names

# Sorting it to make sure the images and the labels are on the same index

images = sorted(images)   # ['test 1.jpg', 'test 2.jpg', 'test 3.jpg', 'test 4.jpg', 'test 5.jpg'] 
label = sorted(label) # ['test 1.txt', 'test 2.txt', 'test 3.txt', 'test 4.txt', 'test 5.txt']

if not os.path.exists(final_dir):
    os.mkdir(final_dir)

for c, txt in enumerate(label):
    txt_path = os.path.join(label_dir, txt)
    img_path = os.path.join(image_dir, images[c])
    with open(txt_path, "r") as r:
        l = r.read()

    dst = f"{final_dir}/{l}"
    if not os.path.exists(dst):
        os.mkdir(dst)
    
    shutil.copy(img_path, dst)
    shutil.copy(txt_path, dst)

相关问题