【问题标题】:What is the efficient Algorithm for Solving Jigsaw Puzzle?解决拼图的有效算法是什么?
【发布时间】:2023-04-07 14:58:02
【问题描述】:

昨天我只是在玩拼图游戏,不知何故想知道解决它的算法是什么。

作为人类,我遵循的步骤:

  1. 将所有部分分成 3 个部分,单平边、双平边和完全无边。
  2. 将平面边缘部分分开,因为它们将是图像的角落
  3. 分离单个边缘片段,因为它们会形成图像的 4 个末端边缘
  4. 最后,没有边缘的部分会形成图像内部。
  5. 匹配颜色和图像片段以将片段组合在一起。

我想知道什么是有效解决这个难题的有效算法以及什么数据结构可以提供最佳有效解决方案。

谢谢。

【问题讨论】:

  • 我真正想到的是创建一个大小等于拼图的零矩阵。然后取第一个元素并将其放在零矩阵上的任意一个位置。取下一个元素并检查它是否适合矩阵中现有部分的任何一侧

标签: algorithm


【解决方案1】:

解决此类问题可能看似复杂,尤其是在对拼图的大小和复杂性没有限制的情况下。

这是我对编写程序来解决此类难题的想法。

您可以单独或一起使用四个关键信息作为解决拼图游戏的线索:

  1. 每个碎片的形状信息(它们的边缘如何显示)
  2. 每个碎片的颜色信息(相邻的碎片通常会有平滑的过渡)
  3. 每件的方向信息(平边和角边可能位于的位置)
  4. 总尺寸和块数提供了拼图的一般尺寸

那么程序将提供什么样的信息 - 让我们假设每个拼图块都是一个小的矩形图像,其透明度信息用于识别拼图块中表示非矩形边缘的部分。

由此,识别四个角块相对容易(在典型的拼图中)。这些将恰好有两条具有平坦轮廓的边缘(请参见下面的轮廓图)。

接下来,我将构建有关拼图四个边的形状的信息。此信息可用于构建adjacency matrix,指示哪些部分可以组合在一起。

现在我们可以修剪这个邻接矩阵来识别那些在其相邻配置中具有平滑颜色过渡的部分。这有点棘手,因为它需要一定程度的模糊匹配 - 因为并非每个像素到像素的边界都必然具有平滑的颜色过渡。

使用最初确定的四个角块,我们现在应该能够重建拼图中所有块的尺寸和位置。

用于表示边缘形状的一种方便的数据结构可能是等高线图 - 本质上是一组整数,表示从图像的相对侧到图像的四个侧面中的每一个中的最后一个不透明像素的距离增量增量一块拼图。匹配的部分应具有镜像轮廓图。

【讨论】:

  • 您可以使用模糊哈希快速识别可能的匹配项,然后带出更高级的比较来确认匹配项,并在尽可能解决后找到丢失的匹配项。
  • 作为注释,我在查看拼图求解时间的复杂性时发现了这一点:erikdemaine.org/papers/Jigsaw_GC/paper.pdf 作者表明这个问题是 NP 完全的。
【解决方案2】:

确保扫描作品的男性/女性部分 - 这会将搜索量减少一半。

【讨论】:

  • 但拼图只是普通的旧方块是什么?
【解决方案3】:

假设您不打算涉足任何计算机视觉方面的内容,那么搜索整个问题空间的变化会非常小,即尝试每一部分直到合适,然后重复。如果您知道它不适合,则主要的优化不会在同一个地方尝试相同的部分。边角部分占的部分相对较少,可能无法在任何主要优化中考虑。

数据结构可能类似于哈希矩阵,您可以在其中快速检查您是否已经尝试过某个位置的一块。

包括计算机视觉在内的一个简单优化是在按平均颜色与相邻位置的接近程度对碎片进行排序后,在每个位置尝试碎片。

当然,这只是我的想法。

【讨论】:

    【解决方案4】:

    我认为人为的方式对实现没有太大帮助 - 计算机可以在一秒钟内多次查看所有部分,但通过将部分分类为角落、边缘和内部,我认为没有(大)胜利件,尤其是因为只有三个类别,而且它们的大小非常不同。

    给定一组所有片段的图像,我会尝试为每个片段或边缘派生一个简单的描述符。描述符必须分别包含关于四个边缘的粗糙形状和颜色的信息。给定一个有 1000 块的拼图,有 4000 条边,而且总是两条边必须相等(忽略拼图的边界)。因此,描述符必须能够区分至少需要 11 位的 2000 条边。

    将一块分割成一个 3 x 3 的棋盘图案,有九个区域,每个边会产生三种颜色 - 每个通道有 8 位,我们已经有 72 位。我最初倾向于建议降低颜色分辨率,但这似乎不是一个好主意——例如,蓝天可能真的受益于高颜色分辨率。请注意,计算颜色可能需要将块与背景分离并尝试将边缘与水平轴和垂直轴对齐。

    在像蓝天这样非常均匀的区域中,颜色信息可能不足以找到合适的匹配项,并且需要额外的几何信息。我会尝试通过其curvature 或派生度量来描述边缘的形状。可能在每条边缘十到二十个点进行采样。这可能再次依赖于背景分离和边缘对齐。

    最后,计算机可以完成简单的部分 - 比较所有边缘描述符对并找到最佳匹配。这个过程可能应该被控制为更加本地化,​​而不是首先进行简单的最佳匹配,因为当你找到一个角时(正确的英文单词?我的意思是 L 形的三个部分。)你有两个边缘限制要找到的部分和如果找不到合适的匹配项(表明之前犯了一个错误或一个难题),可以尽早追溯。

    【讨论】:

      【解决方案5】:

      忽略了这一点,我想到了一个有趣的解决方案,它通过一系列步骤以增加成本来解决它。

      1. 将所有拼图分成两组。测试它们是否适合在一起。如果没有,请尝试以前从未见过的其他作品。如果是这样,请将这组放入正确的堆中。重复直到所有两组都找到匹配项。

      2. 从正确的堆中组合二的集合以形成一个具有二集合的集合,即 {{1,2},{5,6}}。查看一组两个中的至少一个拼图是否与另一组两个中的至少另一个拼图相匹配。如果没有,请尝试以前从未见过的不同的两组。如果是这样,请将两组以正确的方向组合成一组四组,并与您找到的适合组合在一起的部分组合在一起,然后将组合组放入正确的堆中。重复直到找到所有四组。

      3. 重复这些步骤,直到最后一个问题集合 n/2 与集合 n/2 结合。

      不确定计算时间是多少。

      【讨论】:

      • 我认为第 1 步不能保证所有部分都会配对。让我们得到一个简单的 1*4 拼图,比如 A-B-C-D。如果您使用 {B,C} 和 {A,D} 创建集合,第一个集合将匹配,但第二个不匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      相关资源
      最近更新 更多