【问题标题】:matching jigsaw puzzle pieces匹配的拼图
【发布时间】:2011-03-08 16:24:34
【问题描述】:

我无事可做,正在玩这样的拼图游戏:

alt text http://manual.gimp.org/nl/images/filters/examples/render-taj-jigsaw.jpg

我想知道是否有可能制作一个程序来帮助我将它们组合在一起。

想象一下,我有一个小拼图,比如 4x3 块,但是小标签和空白是不均匀的 - 不同的块有不同高度、不同形状、不同大小的标签。我要做的是给所有这些片段拍照,让程序分析它们并将它们的属性存储在某个地方。然后,当我拿起一块拼图时,我可以让程序告诉我哪些拼图应该是它的“邻居”——或者如果我必须填写一个空白,它会告诉我想要的拼图如何看。

不幸的是,我从未对图像处理和模式识别做过任何事情,所以我想请你指点一下 - 我如何识别拼图(基本上是一个带有标签和标签的正方形孔)在图片中

然后我可能需要旋转它,使其处于正确的位置,缩放到某个比例,然后测量每一侧的制表符/空白,以及每一侧的斜率(如果存在)。

我知道扫描/拍摄 1000 个拼图并使用它会太费时间,这只是一个我可以学习新东西的宠物项目。

【问题讨论】:

标签: image pattern-recognition


【解决方案1】:

数据采集

(这称为色度键、蓝屏或背景色方法)

  1. 找一个光线充足的房间,整个房间的光线变化最小。
  2. 找到整个拼图/图片中很少使用的颜色(色调)。
  3. 获取颜色完全相同的彩色纸。
  4. 在彩纸上放置尽可能多的拼图。
    • 您可以将谜题分类成批次,稍后将其用作计算机提示。
    • 确保各部分不重叠或相互接触。
    • 暂时不用担心方向问题。
  5. 拍照并下载到电脑。
    • 可能需要进行颜色校准,因为色度键背景可能会破坏数码相机的内置颜色平衡。

采集数据处理

  1. 获取一些计算机视觉软件
    • OpenCV、MATLAB、C++、Java、Python 图像库等
  2. 在图像的色度键颜色上执行连接分量。
    • 求连通组件的的轮廓,即拼图。
  3. 修复检测到的列表中的错误。
  4. 选择indexing vocabulary(参见 Ira Baxter 的帖子)并测量碎片。
    • 如果碎片是矩形,请先找到角。
    • 如果碎片是略微偏四边形的,边长(测量角到角)也是一个有价值的特征。
    • 在 SO 或 Googlehere 上搜索“形状上下文”。
    • 最后得到棋子的颜色直方图,方便以后按颜色查询棋子。
  5. 要使它们可搜索,请将它们放入数据库中,以便您可以使用任何索引词汇组合查询片段。

【讨论】:

  • 这只是开始的想法。祝你的项目好运。
【解决方案2】:

回到问题本身。拼图的问题可能很容易(P)或很难(NP),这取决于拼图是只适合一个邻居还是多个邻居。如果每个边缘只有一个适合,那么您只需为每个部分/边找到它的邻居,您就完成了(O(#pieces*#sides))。如果某些棋子允许多个匹配到不同的邻居,那么,为了完成整个拼图,您可能需要回溯(因为您做出了错误的选择并且卡住了)。

但是,首先要解决的问题是如何表示片段。如果您想表示任意形状,则可以使用透明度或蒙版来表示图块的哪些区域实际上是该部分的一部分。如果您使用方形,那么问题可能会更容易。在后一种情况下,您可以考虑正方形每一侧的最后一行像素,并将其与您在所有其他部分中找到的最相似的像素行进行匹配。

您可以使用第二种方法来实际帮助您解决真正的难题,尽管您使用方形瓷砖。真正的谜题通常建立在 NxM 网格上。从盒子中扫描图像时,您将其拆分为相同的 NxM 方形图块网格,并让系统解决该问题。然后问题是用系统内部的瓷砖直观地映射您手中的实际波浪形块(当它们很小且颜色均匀时)。但是,如果您在内部表示任意形状,则会遇到同样的问题。

【讨论】:

  • 不要因 P 或 NP 问题而气馁。在人类意义上,有许多很好的解谜方法。许多人类启发式实际上是可计算的,并且有一天可以在软件中实现,如果你花足够的时间研究人类使用的每一个启发式。研究它们很容易——只要问问自己,你将如何一步一步解决这个难题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2021-06-24
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多