【问题标题】:Piece together several images into one big image将几张图片拼成一张大图
【发布时间】:2010-09-12 15:24:30
【问题描述】:

我正在尝试将多张图像组合成一张大图像,并且正在寻找一种算法来确定最佳位置。图像无法旋转或调整大小,但结果图像中的位置并不重要。

编辑:添加无调整大小约束

【问题讨论】:

  • 嘿林诺!所以你最后做了什么?这将有助于...

标签: algorithm packing


【解决方案1】:

优化打包很难,但根据您的问题域的详细信息,您可能会得到简化。一些想法:

  1. 如果您可以将位图分割成大小相同的图块,那么打包就很简单了。然后,您可以根据需要重新组合图块中的位图。

  2. 将图像从大到小排序,然后为每个图像使用贪心分配器来选择适合图像的第一个可用子矩形。

  3. 使用遗传算法。从几个随机选择的布局开始。根据包装的紧密程度对它们进行评分。混合得分最高的解决方案,并进行迭代,直到获得可接受的分数。

【讨论】:

    【解决方案2】:

    以非编程方式,您可以使用 MS Paint 功能“粘贴自”,即将 (JPEG) 文件粘贴到 mspaint 图像区域。使用它您可以排列单个图像,并创建最终的大图像并将其保存为 JPEG/GIF/Raw-BMP 格式。

    -AD。

    【讨论】:

      【解决方案3】:

      显然它被称为“打包问题”,这是游戏编程中经常使用的问题。对于那些感兴趣的人,这里有一些建议的实现:

      Packing Lightmaps, Rectangle packingRectangle Placement

      【讨论】:

        【解决方案4】:

        我为此创建了一个算法,它实际上是 NP-Hard Bin packing 问题的一个变体,但具有无限的 bin 大小。

        您可以尝试查找一些关于它的文章并尝试优化您的算法,但最终它仍将是尝试所有可能性并尝试最小化生成的 bin 大小的蛮力方法。

        如果您不需要最佳解决方案,而只需要一种解决方案,则可以避免暴力破解所有组合。我创建了一个程序,它也做过一次。

        说明:

        Images: array of the input images
        ResultMap: 2d array of Booleans
        FinalImage: large image
        
        1. 对图像数组进行排序,使最大的图像位于顶部。
        2. 计算图像的总大小并初始化 ResultMap,使其大小为图像总大小的 1.5 倍(您可以使这一步更智能,以提高内存使用率和性能)。使 ResultMap 的大小相同并用 False 值填充。
        3. 然后在 FinalImage 左侧添加第一个图像,并将 ResultMap 中的所有布尔值设置为 true,从 0,0 到 ImageHeight、ImageWidth。

        ResultMap 用于快速检查您是否可以在当前 FinalImage 上适合图像。您可以对其进行优化以使用 int32 并将每个位用于一个像素。这将减少内存并提高性能,因为您可以一次检查 32 位(使用掩码)。但这将变得更加困难,因为您必须考虑需要为图像边缘制作的蒙版。

        现在我将描述“算法”的真正循环。

        1. 对于数组中的每个图像,尝试找到一个合适的位置。您可以编写一个循环,该循环将通过 ResultMap 数组查找并查找错误值,然后开始查看它是否在两个方向上都为要放置的图像大小的错误。
          • 如果你找到一个地方,将图像复制到 FinalImage 并在 ResultMap 中更新正确的布尔值
          • 如果您能找到一个位置,请将 FinalImage 的大小增大到足够大(因此请查看需要最少额外空间的边缘)并将其与 ResultMap 同步
        2. 转到 1 :)

        这不是最佳的,但它可以以合理的最佳方式解决问题(特别是如果最后有一些较小的图像来填补空缺)。

        【讨论】:

          【解决方案5】:
          【解决方案6】:

          您可能正在寻找这样的东西:Automatic Magazine Layout

          【讨论】:

          • 这个解决方案的问题是它似乎只适用于少数图像,并调整图像大小以适应。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-24
          • 1970-01-01
          • 2012-11-09
          • 2011-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多