在应用程序中,大约有10亿个png图像(大小为1024 * 1024,每个大约1MB),它需要将10亿个图像组合成一个巨大的图像,然后生成一个1024 * 1024 单一的缩略图。或许我们不需要真正将图像组合成一个巨大的图像,但只是做一些神奇的算法来在计算机内存中生成单一的缩略图?同时,这个过程需要尽可能快地完成,在几秒钟内或者至少在几分钟内完成。有没有人有想法?
答案 0 :(得分:9)
将十亿个图像加载到单个montage
过程中的想法是荒谬的。您的问题尚不清楚,但您的方法应该是确定每张原始图像在最终图像中的比例,然后平行从每张图像中提取必要数量的像素。然后将这些像素组合成最终图像。
因此,如果每个图像都在最终图像中由一个像素表示,则需要获得每个图像的平均值,您可以这样做:
convert image1.png image2.png ... -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info:
示例输出
0.423529,0.996078,0:image1.png
0.0262457,0,0:image2.png
您可以使用 GNU Parallel 并行快速地执行此操作,使用类似
的内容find . -name \*.png -print0 | parallel -0 convert {} -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]:%f\n" info:
然后,您可以制作最终图像并将各个像素放入。
扫描甚至1,000,000个PNG文件可能需要数小时......
你没有说你的图像有多大,但是如果你的图像大小为1MB,而你有1,000,000,000,那么你需要做一个PB级的I / O来阅读它们,所以即使是500MB /超高速SSD,你将在那里工作23天。
答案 1 :(得分:3)
ImageMagick可以做到这一点:
montage -tile *.png tiled.png
如果您因任何原因不想使用外部帮助,您仍然可以使用这些来源。
答案 2 :(得分:3)
随机抽样等随机抽样算法可行。
考虑到组合图像太大,任何线性算法都可能失败,更不用说更复杂的方法了。
通过计算,我们可以推断每个缩略图像素取决于1000图像。因此,单个采样残差不会对结果产生太大影响。
算法描述如下:
对于每个缩略图像素坐标,随机选择对应位置上的N个图像,并且每个图像采样M个像素,然后计算它们的平均值。对其他缩略图像素做同样的事情。
但是,如果您的图像是随机组合的,则结果往往是0.5值的灰度图像。因为通过中心极限定理,缩略图像素的方差倾向于为零。因此,您必须确保组合缩略图本身是结构化的。
PS:使用OpenCV将是一个不错的选择