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:
然后,您可以制作最终图像并放入单个像素。
即使扫描100万个PNG文件也可能需要数小时...
您没有说明图像的大小,但如果它们每个大小大约为1MB,并且您有10亿个图像,则需要进行1PB的I/O才能读取它们,因此即使使用500MB/秒的超快速SSD,您也需要23天时间。
montage -tile *.png tiled.png
如果出于任何原因你不想使用外部帮助程序,你仍然可以使用源代码。随机算法,例如随机采样,可能是可行的。
考虑到合成图像非常大,任何线性算法可能会失败,更不用说更高复杂度的方法。
通过计算,我们可以推断出每个缩略图像素依赖于1000张图像。因此,单个采样残差不会对结果产生太大影响。
算法描述如下:
对于每个缩略图像素坐标,随机选择N张在相应位置上的图像,并对每个图像采样M个像素,然后计算它们的平均值。对其他缩略图像素执行同样的操作。
然而,如果您的图像是随机组合的,则结果往往是一个灰度值为0.5的图像。因为根据中心极限定理,缩略图像素的方差往往趋近于零。所以你必须确保合成的缩略图本身是有结构的。
备注:使用OpenCV将是一个不错的选择。