如何在Mathematica中找到Waldo?


1542

这个周末困扰着我:解决那些“沃尔多在哪里”的好方法是什么 [ 北美以外的'Wally' ]使用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"]

(沃尔多在收银机旁):

原始图片

Mathematica图形


31
@yoda-左上角,桌子上有很多鞋子,收银机和桌子角落附近的Waldo。
Arnoud Buzing 2011年

8
作为计算机视觉博士学位的学生,我很想尝试一下……但是我必须抗拒。对于这个有价值的东西,我会选择“定向梯度直方图+滑动窗口SVM”,就像这项很有影响力的工作一样(警告:pdf)。
dimatura 2011年

54
沃利在哪里。” >。<
轻轨赛于

2
我们是否可以更改问题以支持其他语言?我曾考虑过用Matlab
来做

2
@ArnoudBuzing:在您的问题中,您可以通过查看其中最白的选择来找到Waldo。:/
Tamara Wijsman 2012年

Answers:


1640

我找到沃尔多了!

瓦尔多被发现

我是如何做到的

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

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]]

52
@MikeBantegui虽然Heike的解决方案很棒,但将其打包为WhereIsWaldo函数并不是一个通用的解决方案,我不会那么快。Heike自己已经指出,在获得肯定之前,必须先进行一些练习。要了解我的意思,请尝试按原样打包功能"http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"
abcd

17
此图像比较复杂:Waldo。我认为,尽管有一些可以突出潜在Waldos的东西仍然有用(对于“有用”的定义。)(这使我想起了iPhoto有时会在我们的照片集中标识为面孔的某些东西...)
布雷特冠军


155
您似乎误解了Waldo的规则。这显然是作弊。
Stefan Kendall,

91
虽然这是一个不错的技巧,但却行不通。它需要手动调整,并且只能处理一张图像。我不明白为什么要对此予以支持甚至选择作为答案。它使其他人不敢尝试用更好的工作方法回答。
sam hocevar 2011年

144

我的猜测是“做到这一点的防弹方式”(想想CIA随时都能在任何卫星图像中找到Waldo,而不仅仅是没有竞争元素的单个图像,例如条纹衬衫)...我会在许多Waldo图像上训练Boltzmann机器 -他的坐姿,站立姿势,被遮挡姿势等的所有变化;衬衫,帽子,相机和所有作品。您不需要庞大的Waldos语料库(也许3-5个就足够了),但越多越好。

这会将概率云分配给以任何正确排列出现的各种元素,然后(通过分段)确定平均物体大小是什么,将源图像分解为最类似于单个人的物体单元(考虑可能的遮挡和姿势变化) ),但由于Waldo图片通常包含许多大约相同比例的人物,因此这应该是一件非常容易的事情,然后将这些经过训练的Boltzmann机器的片段送入。它会给您每个人都是Waldo的可能性。以最高的概率。

今天,这就是OCR,邮政编码读取器和无笔迹手写识别的工作方式。基本上,您知道答案在那里,您或多或少知道它的外观,并且其他所有内容可能都有共同的元素,但绝对是“ not it”,因此您不必理会“ not it”,您只需看一下您之前见过的所有可能的“ it”中的“ it”的可能性即可(例如,在邮政编码中,您训练BM的时间仅为1s,2s,3s等),然后分别喂入数字到每台机器,然后选择一个最有信心的机器。这比所有数字的单个神经网络学习功能要好得多。


13
仅仅普通的神经网络还不够吗?此外,维基百科文章声称玻尔兹曼机器是不实际的。
GClaramunt 2011年

2
如果不尝试,我不确定,但是如果足够大和足够复杂,那么神经网络就足够了。特别是经常性的。Boltzmann机器非常出色,因为它可以识别出非常复杂的数据集,而数据集中的噪声却与其本身不同,但噪声量却很大。
格林戈里·克洛珀

14
始终使用Boltzmann机器读取邮政编码,并且邮件传递的准确性越来越高。
格林戈里·克洛珀

47

我同意@GregoryKlopper的观点,解决在任意图像中找到Waldo(或任何感兴趣的对象)的一般问题的正确方法是训练有监督的机器学习分类器。使用许多带有正面和负面标记的示例,可能会训练诸如支持向量机Boosted Decision Stump或Boltzmann机之类的算法来实现此问题的高精度。Mathematica甚至将这些算法包括在其机器学习框架中

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

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

快速的Google图片搜索会发现一些好的数据-我将立即收集一些培训示例并立即进行编码!

但是,即使是机器学习方法(或@iND建议的基于规则的方法)也将难以获得Waldos之类的形象


去年的“计算机视觉与模式识别”会议上提出了一种基于机器学习的计算机视觉系统,该系统试图解决现实世界中的“ Waldo's Waldo”问题(即在Flickr上找到人群照片中的特定人)。他们通过使用同一场景的多张照片添加一些3D位置信息来作弊。
lubar 2012年

41

我不认识Mathematica。。。太糟糕了。但在大多数情况下,我喜欢上述答案。

依靠条纹收集答案仍然存在一个重大缺陷(我个人没有一个手动调整的问题)。有一个示例(由Brett Champion列出,在此处)显示该示例有时会破坏衬衫样式。因此,它变成了一个更复杂的模式。

我会尝试使用形状ID和颜色以及空间关系的方法。就像人脸识别一样,您可以按一定比例查找几何图案。需要注意的是,通常会阻塞这些形状中的一个或多个形状。

在图像上获得白平衡,并从图像中获得红色平衡。我相信Waldo始终是相同的值/色相,但是图像可能来自扫描或不良副本。然后,始终引用Waldo实际使用的颜色数组:红色,白色,深棕色,蓝色,桃红色,{鞋子颜色}。

有衬衫的图案,还有定义Waldo的裤子,眼镜,头发,脸,鞋子和帽子。此外,相对于图像中的其他人,Waldo处于瘦弱的一面。

因此,在这张照片中,找到随机的人以获得人的高度。在图像的随机点测量一堆东西的平均高度(简单的轮廓会产生很多个人)。如果每个事物彼此之间的标准偏差都不在一定范围内,则暂时将其忽略。比较平均高度与图像高度。如果比率太大(例如1:2、1:4或类似的比率),请重试。运行10次(?),以确保所有样本都非常接近,不包括任何超出标准偏差的平均值。在Mathematica中可能吗?

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

  1. 沃尔多有眼镜。在红白色上方搜索0.5:1的两个圆圈。
  2. 蓝色的裤子。在红白底端与脚之间的任何距离内,相同宽度的任何数量的蓝色。请注意,他的衬衫穿得短,所以脚不要太紧。
  3. 帽子。红白色,距离不超过他头顶的两倍。请注意,它下面必须有一头黑发,可能还有眼镜。
  4. 长袖。红白色与主红白色成一定角度。
  5. 黑头发。
  6. 鞋的颜色。我不知道颜色。

这些都可以适用。这些也是对图片中相似人物的否定检查-例如,#2否定穿着红白色围裙(太靠近鞋子),#5否定浅色头发。同样,形状只是这些测试中每一项的指标。。。在指定距离内单独使用颜色可以提供良好的效果。

这将缩小要处理的区域。

存储这些结果将产生一组应该包含Waldo 的区域。排除所有其他区域(例如,对于每个区域,选择一个比普通人大两倍的圆圈),然后运行@Heike布置的过程,除去所有红色,以此类推。

关于如何编写代码有什么想法?


编辑:

关于如何编写此代码的思考。。。排除沃尔多(Waldo)红色以外的所有区域,对红色区域进行骨架化,然后将它们修剪到一个点。对于Waldo头发棕色,Waldo裤子蓝色,Waldo鞋子颜色也是如此。对于Waldo肤色,排除后找到轮廓。

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

从这里开始,使用带骨架的红色区域(而不是膨胀的红色区域),计算每个区域中的线。如果有正确的数字(四个,对吗?),则肯定是可能的区域。如果不是的话,我想就把它排除在外了(作为沃尔多中心……那可能仍然是他的帽子)。

然后检查上方是否有面部形状,上方是否有头发点,下方是否有裤子点,下方是否有鞋子点等等。

尚无代码-仍在阅读文档。


8
也许您可以在任何熟悉的系统/语言中显示概念证明。这也会给你一个感受这里的困难可能会进来,
索博

1
哦,我只是享受挑战。它给了我一些在海滩散步和晚餐穿衣服之间要做的事情。
iND 2012年

1
所以。。。为什么要下票?这与这里的其他推测性答案有何不同?这是否意味着应该更认真地考虑这个问题?还是只是我应该在调查中显得更加认真?我的方法真的错了吗?
iND 2012年

3
我没有对您投反对票,我也不认为对真正的回答尝试应使用降票(除非他们给出错误的信息)。拒绝投票的最可能原因是您似乎没有尝试过(相当复杂的方法)方法,而找到一个好的解决方案可能需要大量的实践实验并排除许多想法。另一个推测性的答案表明,过去曾使用过一种通用方法(作为起点)来解决类似问题,并且有大量的文献资料。只是想解释发生了什么。
Szabolcs

感谢您的解释。我想我不是在关注这些思想的历史。
iND 2012年

2

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

我使用OpenCV中可用的模板匹配功能来查找Waldo。

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

在此处输入图片说明

接下来,我将cv2.matchTemplate()函数以及归一化相关系数作为所使用的方法进行调用。如下面的白色所示(在左上角的某处),它在单个区域返回的概率很高:

在此处输入图片说明

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

在此处输入图片说明


7
试图解决SO最著名的图像处理问题吗?;)您的解决方案既简单又方便,但是a /仅适用于该特定图像,而b /需要您要事先找到的Waldo的确切图像,而我认为问题是关于在任何“ Waldo图像在哪里”中找到任何Waldo您会玩正常的游戏:事先不知道他的样子。无论如何,这个问题很有趣
Soltius'4

@Solitus哈哈!我只为这张图片工作过。虽然为不同的图像工作将是一个挑战!
杰鲁·卢克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.