创建由 9 个元素组成的合成图像的所有可能组合
Create all possible combinations of a composite image made up of 9 elements
来自由 9 个较小的图像组成的图像,这些图像排列成 3x3 网格状
AAA
BBB
CCC
我想自动生成所有可能的变体作为 .png,其中较小图像的位置很重要,任何位置都不能为空,并且每个小图像必须出现三次。我设法用 python:
得到了这些排列的列表
from sympy.utilities.iterables import multiset_permutations
from pprint import pprint
pprint(list(multiset_permutations(['A','A','A','B','B','B','C','C','C'])))
产生 1680 个变化:
[['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'B', 'C', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'C', 'B', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'B'],
['A', 'A', 'A', 'B', 'C', 'B', 'B', 'C', 'C'],
['A', 'A', 'A', 'B', 'C', 'B', 'C', 'B', 'C'],
...
['C', 'C', 'C', 'B', 'B', 'B', 'A', 'A', 'A']]
我如何用各自的小图像 A.png、B.png 和 C.png 替换每一行的每个字母,它们都是 1000 x 1000 像素的正方形,前三个相隔 1000 像素,下面还有两行?
感谢您的帮助!
如果您有三个独立的图像(每个都在自己的文件中),那么只需要 generating the unique permutations 和使用
montage -geometry +0+0 A.png B.png C.png B.png C.png A.png C.png A.png B.png ABCBCACAB.png
(实际上,如果输出文件以排列命名,您甚至不需要生成 1680 个唯一的,但这样做会节省 I/O...)
因为你似乎很乐意使用 Python 来生成排列,我通过 subprocesses
模块添加了 ImageMagick 东西,但那是顺序所以我添加了多处理。
它仍然非常低效,因为您产生了 1680 个子进程,每个子进程加载 ImageMagick 并且每个子进程读取 9 个图像。我认为您可能只想将 3 张图像加载到 Python 一次,然后在 Python 中生成蒙太奇……但这不是您要的! Whosebug 上的问题和答案都是免费的,所以你当然也可以提出这个问题。
import subprocess
from multiprocessing import Pool
from sympy.utilities.iterables import multiset_permutations
def GenerateOne(f):
cmd = ['montage', '-geometry', '+0+0']
for z in f:
cmd.append(f'{z}.png')
filename = ''.join(f) + '.png'
cmd.append(filename)
# DEBUG print(' '.join(cmd))
subprocess.run(cmd)
if __name__ == '__main__':
# Create a pool of processes
p = Pool()
# Create a list of montages to create
perms = multiset_permutations(['A','A','A','B','B','B','C','C','C'])
Map the list onto the Pool
p.map(GenerateOne, perms)
实际上会生成这样的命令,您可以通过取消注释 DEBUG 行来查看:
montage -geometry +0+0 C.png C.png C.png B.png B.png A.png A.png B.png A.png CCCBBAABA.png
montage -geometry +0+0 C.png C.png C.png B.png B.png A.png B.png A.png A.png CCCBBABAA.png
montage -geometry +0+0 C.png C.png C.png B.png B.png B.png A.png A.png A.png CCCBBBAAA.png
来自由 9 个较小的图像组成的图像,这些图像排列成 3x3 网格状
AAA
BBB
CCC
我想自动生成所有可能的变体作为 .png,其中较小图像的位置很重要,任何位置都不能为空,并且每个小图像必须出现三次。我设法用 python:
得到了这些排列的列表from sympy.utilities.iterables import multiset_permutations
from pprint import pprint
pprint(list(multiset_permutations(['A','A','A','B','B','B','C','C','C'])))
产生 1680 个变化:
[['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'B', 'C', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'C', 'B', 'C'],
['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C', 'B'],
['A', 'A', 'A', 'B', 'C', 'B', 'B', 'C', 'C'],
['A', 'A', 'A', 'B', 'C', 'B', 'C', 'B', 'C'],
...
['C', 'C', 'C', 'B', 'B', 'B', 'A', 'A', 'A']]
我如何用各自的小图像 A.png、B.png 和 C.png 替换每一行的每个字母,它们都是 1000 x 1000 像素的正方形,前三个相隔 1000 像素,下面还有两行? 感谢您的帮助!
如果您有三个独立的图像(每个都在自己的文件中),那么只需要 generating the unique permutations 和使用
montage -geometry +0+0 A.png B.png C.png B.png C.png A.png C.png A.png B.png ABCBCACAB.png
(实际上,如果输出文件以排列命名,您甚至不需要生成 1680 个唯一的,但这样做会节省 I/O...)
因为你似乎很乐意使用 Python 来生成排列,我通过 subprocesses
模块添加了 ImageMagick 东西,但那是顺序所以我添加了多处理。
它仍然非常低效,因为您产生了 1680 个子进程,每个子进程加载 ImageMagick 并且每个子进程读取 9 个图像。我认为您可能只想将 3 张图像加载到 Python 一次,然后在 Python 中生成蒙太奇……但这不是您要的! Whosebug 上的问题和答案都是免费的,所以你当然也可以提出这个问题。
import subprocess
from multiprocessing import Pool
from sympy.utilities.iterables import multiset_permutations
def GenerateOne(f):
cmd = ['montage', '-geometry', '+0+0']
for z in f:
cmd.append(f'{z}.png')
filename = ''.join(f) + '.png'
cmd.append(filename)
# DEBUG print(' '.join(cmd))
subprocess.run(cmd)
if __name__ == '__main__':
# Create a pool of processes
p = Pool()
# Create a list of montages to create
perms = multiset_permutations(['A','A','A','B','B','B','C','C','C'])
Map the list onto the Pool
p.map(GenerateOne, perms)
实际上会生成这样的命令,您可以通过取消注释 DEBUG 行来查看:
montage -geometry +0+0 C.png C.png C.png B.png B.png A.png A.png B.png A.png CCCBBAABA.png
montage -geometry +0+0 C.png C.png C.png B.png B.png A.png B.png A.png A.png CCCBBABAA.png
montage -geometry +0+0 C.png C.png C.png B.png B.png B.png A.png A.png A.png CCCBBBAAA.png