Python - 图像层数组 - 枕头库
Python - array of image layers - Pillow library
我正在使用 Python 和 Pillow 库研究再生艺术。我有多个包含图像的目录,我的目标是使用 Pillow 库创建 'collages'.
我正在像这样将图像加载到数组中:
#load img files into an array
skin = [file for file in os.listdir('skin') if file.endswith('.png')]
hair = [file for file in os.listdir('hair') if file.endswith('.png')]
head = [file for file in os.listdir('head') if file.endswith('.png')]
mouth = [file for file in os.listdir('mouth') if file.endswith('.png')]
nose = [file for file in os.listdir('nose') if file.endswith('.png')]
eyes = [file for file in os.listdir('eyes') if file.endswith('.png')]
#select a random image from each array
skin_img = random.choices(skin)[0]
hair_img = random.choices(hair)[0]
head_img = random.choices(head)[0]
mouth_img = random.choices(mouth)[0]
nose_img = random.choices(nose)[0]
eyes_img = random.choices(eyes)[0]
我想 layer/merge 按特定顺序排列这些,我希望我可以使用数组来完成此操作,如下所示:
order = ['head','skin','mouth','eyes','nose','hair']
使用 Pillow 库,可以合并。两张这样的图片:
img1 = Image.open(head_img)
img2 = Image.open(skin_img)
comp1 = Image.alpha_composite(img1,img2)
我的问题:如何遍历顺序数组并合并我的所有图像,最终得到一个合成图像?
我想我知道你在做什么。但我不知道这是不是最好的方法。尽管如此,我还是会尽我所能回答这个问题。
注意:这可能不是最有效的方法。
我们的面部零件是:
parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']
现在让我们在字典中获取文件列表:
{
"head": ["f1", "f2", ...],
"skin": ["s1", "s2", ...],
"mouth": ["m1", "m2", ...],
"eyes": ["e1", "e2", ...],
"nose": ["n1", "n2", ...],
"hair": ["h1", "h2", ...]
}
我不会改变您的做法,但强烈建议您使用 glob
.
获取文件路径
files = {
part: [file for file in os.listdir(part) if file.endswith('.png')]
for part in parts
}
现在我们有文件 paths/names 需要处理。
接下来我们获取人脸图像并将其放入final_image
。我们将把其他图像与这幅图像结合起来。
final_image = Image.open(random.choice(files["head"]))
我看到你正在获取 random.choices
并且正在获取第一个元素:
random.choices(skin)[0]
但您可以获得 random.choice
个列表。它将 return 一个元素。
现在让我们在字典中循环并获取每个面部部分的随机元素并通过 final_image
将其组合。当然除了“脸”
for key, value in files.items():
if key != "head":
part_image = Image.open(random.choice(value))
final_image = Image.alpha_composite(final_image, part_image)
现在你有你要找的东西了。
最终代码为:
parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']
files = {
part: [file for file in os.listdir(part) if file.endswith('.png')]
for part in parts
}
final_image = Image.open(random.choice(files["head"]))
for key, value in files.items():
if key != "head":
part_image = Image.open(random.choice(value))
final_image = Image.alpha_composite(final_image, part_image)
我正在使用 Python 和 Pillow 库研究再生艺术。我有多个包含图像的目录,我的目标是使用 Pillow 库创建 'collages'.
我正在像这样将图像加载到数组中:
#load img files into an array
skin = [file for file in os.listdir('skin') if file.endswith('.png')]
hair = [file for file in os.listdir('hair') if file.endswith('.png')]
head = [file for file in os.listdir('head') if file.endswith('.png')]
mouth = [file for file in os.listdir('mouth') if file.endswith('.png')]
nose = [file for file in os.listdir('nose') if file.endswith('.png')]
eyes = [file for file in os.listdir('eyes') if file.endswith('.png')]
#select a random image from each array
skin_img = random.choices(skin)[0]
hair_img = random.choices(hair)[0]
head_img = random.choices(head)[0]
mouth_img = random.choices(mouth)[0]
nose_img = random.choices(nose)[0]
eyes_img = random.choices(eyes)[0]
我想 layer/merge 按特定顺序排列这些,我希望我可以使用数组来完成此操作,如下所示:
order = ['head','skin','mouth','eyes','nose','hair']
使用 Pillow 库,可以合并。两张这样的图片:
img1 = Image.open(head_img)
img2 = Image.open(skin_img)
comp1 = Image.alpha_composite(img1,img2)
我的问题:如何遍历顺序数组并合并我的所有图像,最终得到一个合成图像?
我想我知道你在做什么。但我不知道这是不是最好的方法。尽管如此,我还是会尽我所能回答这个问题。
注意:这可能不是最有效的方法。
我们的面部零件是:
parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']
现在让我们在字典中获取文件列表:
{
"head": ["f1", "f2", ...],
"skin": ["s1", "s2", ...],
"mouth": ["m1", "m2", ...],
"eyes": ["e1", "e2", ...],
"nose": ["n1", "n2", ...],
"hair": ["h1", "h2", ...]
}
我不会改变您的做法,但强烈建议您使用 glob
.
files = {
part: [file for file in os.listdir(part) if file.endswith('.png')]
for part in parts
}
现在我们有文件 paths/names 需要处理。
接下来我们获取人脸图像并将其放入final_image
。我们将把其他图像与这幅图像结合起来。
final_image = Image.open(random.choice(files["head"]))
我看到你正在获取 random.choices
并且正在获取第一个元素:
random.choices(skin)[0]
但您可以获得 random.choice
个列表。它将 return 一个元素。
现在让我们在字典中循环并获取每个面部部分的随机元素并通过 final_image
将其组合。当然除了“脸”
for key, value in files.items():
if key != "head":
part_image = Image.open(random.choice(value))
final_image = Image.alpha_composite(final_image, part_image)
现在你有你要找的东西了。
最终代码为:
parts = ['head', 'skin', 'mouth', 'eyes', 'nose', 'hair']
files = {
part: [file for file in os.listdir(part) if file.endswith('.png')]
for part in parts
}
final_image = Image.open(random.choice(files["head"]))
for key, value in files.items():
if key != "head":
part_image = Image.open(random.choice(value))
final_image = Image.alpha_composite(final_image, part_image)