两个源目录路径
source_directory1 source_directory2
随机选取图片
从指定的源目录 source_dir
中随机选择指定数量 num_images
的文件,并返回这些选中文件的完整路径列表。
具体步骤如下:
- 列出源目录中的所有文件(不包括子目录)。
- 从所有文件中随机选择指定数量的文件,使用
random.sample
函数实现。 - 返回选中文件的完整路径列表。
需要注意的是,该函数返回的是一个包含选中文件路径的列表,但是在给定的代码中,return
语句放在了 for
循环内,导致函数只返回了一个路径,而不是路径列表。
def select_and_copy_images(source_dir, num_images):
# 获取源目录中所有文件的列表
all_files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]
# 从列表中随机选择指定数量的文件
selected_files = random.sample(all_files, num_images)
# 复制选中的文件到目标目录
for file in selected_files:
# shutil.copy(os.path.join(source_dir, file), os.path.join(target_dir, file))
return os.path.join(source_dir, file)
打乱顺序
random.shuffle(image_paths)
粘贴图片
for i in range(3):
for j in range(3):
img_path = image_paths[i * 3 + j]
small_img = Image.open(img_path)
small_img.thumbnail(small_image_size, Image.LANCZOS)
collage.paste(small_img, (j * small_image_size[0], i * small_image_size[1]))
附完整代码
from PIL import Image
import os
import shutil
import random
from PIL import Image
import random
source_directory1 = r'rice/Rice_Image_Dataset/Karacadag' # 源目录路径
source_directory2 = r'rice/Rice_Image_Dataset/Jasmine' # 源目录路径
target_directory='1'
def select_and_copy_images(source_dir, num_images):
# 获取源目录中所有文件的列表
all_files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]
# 从列表中随机选择指定数量的文件
selected_files = random.sample(all_files, num_images)
# 复制选中的文件到目标目录
for file in selected_files:
# shutil.copy(os.path.join(source_dir, file), os.path.join(target_dir, file))
return os.path.join(source_dir, file)
def generate_collage(image_paths, output_path):
# Shuffle the image order
random.shuffle(image_paths)
# Create a new large image in a 3x3 grid
collage_size = (300, 300) # Adjust to your desired size
collage = Image.new('RGB', collage_size)
# Calculate the size of each small image
small_image_size = (collage_size[0] // 3, collage_size[1] // 3)
# Paste each small image onto the large image
for i in range(3):
for j in range(3):
img_path = image_paths[i * 3 + j]
small_img = Image.open(img_path)
small_img.thumbnail(small_image_size, Image.LANCZOS)
collage.paste(small_img, (j * small_image_size[0], i * small_image_size[1]))
# Save the generated collage
collage.save(output_path)
#collage.show()
number_of_images=1
# 九张图片的路径
image_paths = [
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory2, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images),
select_and_copy_images(source_directory1, number_of_images)
]
for i in range(1,20):
output_path =r"路径" + str(i) + ".jpg"
# 生成九宫格图
generate_collage(image_paths, output_path)