【发布时间】:2010-09-12 15:24:30
【问题描述】:
我正在尝试将多张图像组合成一张大图像,并且正在寻找一种算法来确定最佳位置。图像无法旋转或调整大小,但结果图像中的位置并不重要。
编辑:添加无调整大小约束
【问题讨论】:
-
嘿林诺!所以你最后做了什么?这将有助于...
我正在尝试将多张图像组合成一张大图像,并且正在寻找一种算法来确定最佳位置。图像无法旋转或调整大小,但结果图像中的位置并不重要。
编辑:添加无调整大小约束
【问题讨论】:
优化打包很难,但根据您的问题域的详细信息,您可能会得到简化。一些想法:
如果您可以将位图分割成大小相同的图块,那么打包就很简单了。然后,您可以根据需要重新组合图块中的位图。
将图像从大到小排序,然后为每个图像使用贪心分配器来选择适合图像的第一个可用子矩形。
使用遗传算法。从几个随机选择的布局开始。根据包装的紧密程度对它们进行评分。混合得分最高的解决方案,并进行迭代,直到获得可接受的分数。
【讨论】:
以非编程方式,您可以使用 MS Paint 功能“粘贴自”,即将 (JPEG) 文件粘贴到 mspaint 图像区域。使用它您可以排列单个图像,并创建最终的大图像并将其保存为 JPEG/GIF/Raw-BMP 格式。
-AD。
【讨论】:
显然它被称为“打包问题”,这是游戏编程中经常使用的问题。对于那些感兴趣的人,这里有一些建议的实现:
【讨论】:
我为此创建了一个算法,它实际上是 NP-Hard Bin packing 问题的一个变体,但具有无限的 bin 大小。
您可以尝试查找一些关于它的文章并尝试优化您的算法,但最终它仍将是尝试所有可能性并尝试最小化生成的 bin 大小的蛮力方法。
如果您不需要最佳解决方案,而只需要一种解决方案,则可以避免暴力破解所有组合。我创建了一个程序,它也做过一次。
说明:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
ResultMap 用于快速检查您是否可以在当前 FinalImage 上适合图像。您可以对其进行优化以使用 int32 并将每个位用于一个像素。这将减少内存并提高性能,因为您可以一次检查 32 位(使用掩码)。但这将变得更加困难,因为您必须考虑需要为图像边缘制作的蒙版。
现在我将描述“算法”的真正循环。
这不是最佳的,但它可以以合理的最佳方式解决问题(特别是如果最后有一些较小的图像来填补空缺)。
【讨论】:
您可能正在寻找这样的东西:Automatic Magazine Layout。
【讨论】: