【问题标题】:Create a montage of 15000 images创建 15000 张图像的蒙太奇
【发布时间】:2022-01-27 22:26:02
【问题描述】:

我正在尝试使用 imagemagick montage 命令创建 15000 张图像的拼贴/蒙太奇。该工具非常适用于一小部分图像,但是当尝试使用 15K 图像创建蒙太奇时,程序会崩溃,因为它不能只是将 15K 图像加载到主内存中。 我认为以流的形式打开文件,然后以 100 个为一组进行堆叠是可行的,但如果有人有一个好的解决方案,那将会很有帮助。

【问题讨论】:

  • 此站点不是代码编写服务,也不是您可以获得一般编码建议的站点。您需要阅读tourHow to Ask 页面和help center 以了解对您的期望。您几乎总是需要您自己的代码的minimal reproducible example,并提供足够的信息来证明您已经用尽所有可能的研究途径,并清楚地解释您遇到的问题或错误,以便用户可以使用代码发布答案,解决了该特定问题。这是一个非常广泛的问题。如果您在实施过程中遇到具体问题,请具体询问。
  • 请问您使用的是什么操作系统?
  • 我使用的是 Linux、Ubuntu 和 Elementary OS
  • 您希望这 15,000 张图像被蒙太奇成什么样的形状? 100 幅图像宽 150 幅图像高?
  • 是的,或者我也可以做 150*100

标签: python image-processing imagemagick imagemagick-montage


【解决方案1】:

现在写和测试任何东西都有点晚了,但我可能会做这样的事情:

  • 生成一个包含所有文件名的文本文件以进行蒙太奇
  • 使用split 命令将其分成100 组
  • 遍历所有组,从每个组中生成一行图像
  • 堆叠行

第一部分是这样的:

find . -name "*.jpg" -print > filelist.txt

下一部分是这样的:

split -l 100 filelist.txt ROWS

下一部分是这样的:

n=0
for f in ROWS* ; do
    magick @"$f" +append row${n}.jpg
    ((n=n+1))
done

最后一部分是这样的:

magick row*.jpg -append result.jpg

【讨论】:

  • 我会尝试并告诉你!
  • 您可能需要使用vips。如果您的图像大小不同,我的代码将无法正常工作。我也有点希望这里有风。
  • 图片都是一样的大小。我没看懂你上次评论的以下部分
【解决方案2】:

libvips 可以制作巨大的图像蒙太奇而不需要大量内存。例如:

$ vips arrayjoin "a.png b.png c.png d.png" output.png --across 2

这将读取四个 PNG 图像,将它们排列成 2 x 2 网格的行,然后写入 out.png。您可以使用$() 查找大量图像并按文件名排序,也许:

$ vips arrayjoin "$(ls *.jpeg | sort -t_ -k2g -k1g)" x.tif --across 20

这将加载文件名格式为x_y.jpeg 的所有 JPEG 图像,按行然后按列对它们进行数字排序,然后将它们组合成一个 20 x N 的网格。

15,000 张图片对于 linux 上的命令行来说太多了(你会从 bash 中得到一个 Argument list too long 错误),但你可以使用 pyvips 从 python 中做到这一点。也许:

#!/usr/bin/python3

import sys
import glob
import pyvips

images = [pyvips.Image.new_from_file(filename, access="sequential")
          for filename in glob.glob(sys.argv[1] + "/*.jpg")]

joined = pyvips.Image.arrayjoin(images, across=100)

joined.write_to_file(sys.argv[2])

然后:

$ vips crop ~/pics/k2.jpg x.jpg 0 0 1000 1000
$ for i in {1..15000}; do cp x.jpg $i.jpg; done
$ VIPS_CONCURRENCY=1 /usr/bin/time -f %M:%e \
    ./arrayjoin.py . x.tif[compression=jpeg,tile]
4689264:78.38
$ vipsheader x.tif
x.tif: 100000x150000 uchar, 3 bands, srgb, tiffload

这就是将 15,000 张 1,000 x 1,000 像素的 JPG 图像组合成一个 100,000 x 150,000 像素的 JPEG 压缩 TIFF。耗时80s,峰值需要4.7gb内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    相关资源
    最近更新 更多