将几张图片拼成一张大图片

时间:2020-03-06 14:38:41  来源:igfitidea点击:

我正在尝试将几张图像放到一个大图像中,并且正在寻找一种算法,该算法可以最佳地确定放置位置。图像无法旋转或者调整大小,但是结果图像中的位置并不重要。

编辑:未添加任何大小调整约束

解决方案

我们可能正在寻找这样的东西:自动杂志版面。

我们可能正在寻找SIFT

http://www.cs.ubc.ca/~lowe/keypoints/

http://user.cs.tu-http://www.cs.ubc.ca/~lowe/keypoints/.de/~nowozin/autopano-sift/technicaldetails.html

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

我们可以尝试找到一些有关它的文章并尝试优化算法,但是最后,它仍然是一种蛮力尝试各种可能性并尽量减小所产生的垃圾箱大小的方法。

如果我们不需要最佳解决方案,而仅是一个解决方案,则可以避免强行强制使用所有组合。我创建了一个程序,该程序也执行了一次。

描述:

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

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

现在,我将描述"算法"的真实循环。

  • 如果可以找到合适的位置,请适当增加FinalImage的大小(因此请查看需要最少额外空间的边缘),并将其与ResultMap同步
  • 转到1 :)

它不是最佳的,但是可以以合理的最佳方式解决问题(尤其是如果有一些较小的图像来最终填充缺口)。

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

打包光照贴图,
矩形包装和
矩形放置

我们可以通过非编程方式使用MS Paint功能"粘贴自",即将(JPEG)文件粘贴到mspaint图像区域中。使用此功能,我们可以排列单个图像,并创建最终的大图像,并将其另存为JPEG / GIF / Raw-BMP格式。

-广告。

最佳包装很难,但是根据我们问题域的详细信息,可能会有简化的方法。一些想法:

  • 如果我们可以将位图分割成大小相等的图块,那么打包就很简单了。然后,按需从图块重新组合位图。
  • 将图片从大到小排序,然后为每个图片使用贪心分配器选择适合该图片的第一个可用子矩形。
  • 使用遗传算法。从几种随机选择的布局开始。根据包装的紧密程度给它们打分。将得分最高的解决方案进行混合,并进行迭代,直到获得可接受的分数。