创建由 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