题 我怎样才能找到带有Mathematica的Waldo?


这让我在周末烦恼:解决这些问题的好方法是什么 沃尔多在哪里?  [“沃利” 在北美之外]使用Mathematica(图像处理和其他功能)进行拼图?

这是我到目前为止的功能,通过调光可以降低视觉复杂度 一些非红色的颜色:

whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
    waldo = Import[url];
    waldo2 = Image[ImageData[
        waldo] /. {{r_, g_, b_} /;
          Not[r > .7 && g < .3 && b < .3] :> {0, 0,
          0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
          1}}];
    waldoMask = Closing[waldo2, 4];
    ImageCompose[waldo, {waldoMask, .5}]
]

以及“有效”的URL示例:

whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]

(Waldo是收银台):

Mathematica graphic


1511
2017-12-12 18:29


起源


现在我需要玩一个“收银机在哪里?”的游戏...... - abcd
@yoda-左上角,桌子上有很多鞋子,收银台和靠近桌子角落的Waldo。 - Arnoud Buzing
mathematica提案因各种原因而被关闭,但是它们允许我们通过创建一个提示来确定我们是否可以通过它来启动和运行 新的一个。如果你愿意,我们希望得到你的帮助。 - rcollyer
作为计算机视觉的博士生,我很想尝试一下......但我必须抗拒。对于它的价值,我会选择直方图梯度直方图+滑动窗口SVM,如 这个 非常有影响力的工作(警告:pdf)。 - dimatura
“哪里 沃利。“>。< - Lightness Races in Orbit


答案:


我找到了沃尔多!

waldo had been found

我是怎么做到的

首先,我将过滤掉所有不是红色的颜色

waldo = Import["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];

接下来,我正在计算这个图像与简单的黑白图案的相关性,以找到衬衫中的红色和白色过渡。

corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];

我用 Binarize 以足够高的相关性挑选图像中的像素,并在它们周围画出白色圆圈以强调它们 Dilation

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

我不得不在水平上玩一点。如果水平太高,则挑选出太多误报。

最后,我将此结果与原始图像组合以获得上述结果

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

1624
2017-12-12 19:32



@MikeBantegui虽然Heike的解决方案很棒,但我不会那么快将它打包成一个 WhereIsWaldo 功能,因为它不是一般解决方案。海克本人已经指出,在你获得积极成果之前,需要先发挥水平。要了解我的意思,请按原样尝试打包的功能 "http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg" 这个更难。 - abcd
这个图像比较棘手: 沃尔多。我认为,有一些东西可以突出潜在的Waldos仍然有用(对于'有用'的一些定义。)(这让我想起iPhoto有时会在我们的照片集中识别出一些面孔......) - Brett Champion
请看这篇Meta帖子: meta.stackexchange.com/questions/116401/... - Bill the Lizard
你似乎误解了Where's Waldo的规则。这是 明确地 作弊。 - Stefan Kendall
虽然这是一个很好的黑客,但它不起作用。它需要手动调整,仅适用于一个图像。我不明白为什么这个被投票,甚至被选为答案。它不鼓励其他人甚至试图用更好的工作方法来回答。 - sam hocevar


我猜测这是一种“防弹方式”(想想CIA随时在任何卫星图像中找到Waldo,而不仅仅是没有竞争元素的单个图像,比如条纹衬衫)......我会训练一个 玻尔兹曼机器 关于Waldo的许多图像 - 他坐着,站立,闭塞等的所有变化;衬衫,帽子,相机和所有的作品。你不需要大量的Waldos(也许3-5就够了),但越多越好。

这将为不同正确排列的各种元素分配概率云,然后建立(通过分割)平均对象大小是什么,将源图像分割成最类似于个体的对象的单元格(考虑可能的遮挡和姿势变化) ),但由于Waldo图片通常包含大量相同比例的人,这应该是一项非常简单的任务,然后为预先训练好的Boltzmann机器提供这些部分。它会给你每个人成为Waldo的概率。以最高概率获得一个。

这就是今天OCR,邮政编码阅读器和无笔划手写识别的工作原理。基本上你知道答案就在那里,你或多或少知道它应该是什么样的,其他一切可能都有共同的元素,但绝对是“不是它”,所以你不要打扰“不是它”,你只看一下你之前看过的所有可能的“它”的可能性“(例如,在邮政编码中,你只训练BM 1s,只需2s,只需3s等,然后喂每个数字到每台机器,并选择一个最有信心的。)这比所有数字的单个神经网络学习功能好很多。


140
2017-12-12 20:25



那不仅仅是普通的神经网络吗?此外,维基百科的文章声称Boltzmann机器不实用。 - GClaramunt
没有尝试我不确定,但如果足够大和足够复杂,神经网络应该足够任何东西。特别是对于复发。玻尔兹曼机器非常非常非常好地识别一组相当简单的数据,其中数据海洋中的噪声很大,与其本身不同。 - Gregory Klopper
邮政编码一直与Boltzmann机器一起阅读,邮件传递的准确性已经达到顶峰。 - Gregory Klopper


我同意@GregoryKlopper的说法  解决在任意图像中找到Waldo(或任何感兴趣的对象)的一般问题的方法是训练有监督的机器学习分类器。使用许多正面和负面标记的例子,算法如 支持向量机提升决策权 或者Boltzmann Machine可能会接受培训,以便在这个问题上实现高精度。 Mathematica甚至在其中包含了这些算法 机器学习框架

培训Waldo分类器的两个挑战是:

  1. 确定正确的图像特征变换。这是@Heike的答案有用的地方:红色滤镜和剥离图案检测器(例如,小波或DCT分解)将是将原始像素转换为分类算法可以学习的格式的好方法。还需要一个基于块的分解来评估图像的所有子部分......但是由于Waldo a)总是大致相同的大小并且b)在每个图像中始终只出现一次,因此这变得更容易。
  2. 获得足够的训练样例。 SVM最适合每个类至少100个示例。增强的商业应用(例如,数字相机中的面部聚焦)在数百万个正面和负面示例上进行训练。

快点 谷歌图片搜索 找到一些好的数据 - 我将收集一些培训示例并立即对其进行编码!

然而,即使是机器学习方法(或@iND建议的基于规则的方法)也会为像这样的图像而斗争 沃尔多斯的土地


46
2018-04-01 01:23



去年在计算机视觉和模式识别会议上展示了一种基于机器学习的计算机视觉系统,该系统试图解决现实世界中的“Where's Waldo”问题(即,在Flickr上的人群照片中寻找特定人物)。他们通过使用相同场景的多张照片添加一些3D位置信息来作弊。 - lubar
cs.washington.edu/homes/rahul/data/WheresWaldo.html - lubar
给予好评。当我读到这个时,我也想过小波。 - davec


我不知道Mathematica。 。 。太糟糕了。但在大多数情况下,我喜欢上面的答案。

仍然存在依赖条纹的重大缺陷 单独 收集答案(我个人没有问题  手动调整)。有一个例子(由Brett Champion列出, 这里这些表明他们有时打破了衬衫图案。那么它就变成了一个更复杂的模式。

我会尝试形状id和颜色的方法,以及空间关系。很像人脸识别,你可以找到彼此之间某些比例的几何图案。需要注意的是,通常这些形状中的一个或多个被遮挡。

在图像上获得白平衡,并从图像中红色显示红色。我相信Waldo总是具有相同的值/色调,但图像可能来自扫描或坏的副本。然后总是参考Waldo实际上的颜色数组:红色,白色,深棕色,蓝色,桃色,{鞋色}。

有一个衬衫图案,以及定义Waldo的裤子,眼镜,头发,面部,鞋子和帽子。此外,相对于图像中的其他人,沃尔多处于瘦弱的一面。

因此,找到随机的人来获得这张照片中的人的高度。测量图像中随机点的一堆东西的平均高度(简单的轮廓将产生相当多的个人)。如果每件事物都没有相互标准偏差,那么现在它们将被忽略。将高度的平均值与图像的高度进行比较。如果比例太大(例如,1:2,1:4,或类似地接近),则再试一次。运行10(?)次以确保样本非常接近,排除任何超出某些标准偏差的平均值。可能在Mathematica?

这是你的Waldo尺寸。 Walso很瘦,所以你正在寻找5:1或6:1(或其他)的东西:wd。但是,这还不够。如果Waldo部分隐藏,高度可能会改变。所以,你正在寻找一块~2:1的红白色块。但必须有更多的指标。

  1. 沃尔多有眼镜。在红白色上方搜索0.5:1的两个圆圈。
  2. 蓝裤子。在红白色的末端和到他的脚的距离之间的任何距离内的任何数量的蓝色。请注意,他穿着衬衫短,所以脚不太靠近。
  3. 帽子。红白色任何距离,最高可达头顶两倍。请注意,下面必须有深色头发,可能还有眼镜。
  4. 长袖。从主红白色的某个角度看的红白色。
  5. 黑发。
  6. 鞋子的颜色。我不知道颜色。

任何这些都可以适用。这些也是对照中类似人物的负面检查 - 例如,#2否定穿着红白色围裙(太靠近鞋子),#5消除浅色头发。此外,形状只是每个测试的一个指标。 。 。在指定距离内单独使用颜色可以产生良好的效果。

这将缩小要处理的范围。

存储这些结果将产生一组区域 应该 有沃尔多。排除所有其他区域(例如,对于每个区域,选择一个两倍于一般人的大小的圆圈),然后运行@Heike布局的过程除去除红色之外的所有区域,依此类推。

有关如何编码的任何想法?


编辑:

关于如何编码的想法。 。 。排除除Waldo红色之外的所有区域,对红色区域进行镂空,并将它们修剪为单个点。同样适用于Waldo棕色头发,Waldo裤子蓝色,Waldo鞋子颜色。对于Waldo肤色,排除,然后找到轮廓。

接下来,排除所有红色区域的非红色,扩张(很多),然后进行骨架化和修剪。这部分将列出可能的沃尔多中心点。这将是比较所有其他Waldo颜色部分的标记。

从这里开始,使用镂空的红色区域(不是扩张的区域),计算每个区域的线条。如果有正确的数字(四个,对吗?),这肯定是一个可能的区域。如果没有,我想只是排除它(作为一个沃尔多中心......它可能仍然是他的帽子)。

然后检查上面是否有脸形,上方有发点,裤子指向下方,鞋点位于下方,依此类推。

还没有代码 - 仍在阅读文档。


40
2018-01-10 09:36



也许您可以在您熟悉的系统/语言中展示概念证明。这也可以让您了解可能遇到的困难。 - Szabolcs
哦,我只是欣赏它所面临的挑战。它给了我在海滩散步和晚餐穿衣之间的一些事情。 - iND
所以。 。 。为什么倒下?这与其他推测性答案有何不同?这是一个建议,应该更认真地对待这个问题吗?或者只是我在调查中看起来更严重?我的做法真的错了吗? - iND
我没有向你投票,我认为downvotes不适合诚实的回答(除非他们提供错误的信息)。 downvotes最可能的原因是你似乎没有尝试过(相当复杂的声音)方法,找到一个好的解决方案可能需要进行大量的实际实验并排除许多想法。另一个推测性的答案暗示了一个 一般 过去曾用于类似问题的方法(作为一个起点),并且有大量的文献。试着解释发生了什么。 - Szabolcs
感谢您的解释。我想我并不关注这些想法的历史。 - iND


我有一个使用OpenCV查找Waldo的快速解决方案。

我用了 模板匹配 在OpenCV中可以找到Waldo的功能。

为此,需要一个模板。所以我从原始图像裁剪了Waldo并将其用作模板。

enter image description here

接下来我打电话给 cv2.matchTemplate() 与...一起发挥作用 归一化相关系数 作为使用的方法。它在单个区域返回的概率很高,如下面的白色所示(左上角区域的某处):

enter image description here

使用的最高可能区域的位置被发现 cv2.minMaxLoc() 函数,然后我用它绘制矩形以突出显示Waldo:

enter image description here


3
2018-04-11 11:11



试图解决SO最着名的图像处理问题? ;)你的解决方案很简单,但是只适用于这个特定的图像,并且需要事先想要找到的Waldo的确切图像,而我认为这个问题是关于在任何“Where's Waldo图像”中找到任何Waldo你会玩普通游戏:不知道他之前的样子。无论如何,这个问题很有趣 - Soltius
@Solitus哈哈!我特别为这张图片工作过。为不同的图像工作将是一个挑战虽然!! - Jeru Luke