如何用Mathematica找到Waldo?

这在周末给我带来了麻烦:什么是解决问题的好方法Waldo在哪里? [北美以外的'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图形


我找到了沃尔多!

沃尔多已被发现

我是如何做到的

首先,我滤出所有不是红色的颜色

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

我猜想采用“防弹的方式来做到这一点”(想想中情局在任何时候都可以找到任何卫星图像中的沃尔多,而不是像没有竞争性元素的单幅图像,比如条纹衬衫)......我会在沃尔多的许多图像上训练玻尔兹曼机器 - 他坐着,站立,遮挡等各种变化; 衬衫,帽子,相机和所有作品。 你不需要大量的瓦尔多斯语料库(可能有3-5个就足够了),但越多越好。

这将把概率云分配给发生在任何正确布置中的各种元素,然后建立(通过分割)什么是平均对象大小,将源图像分成与个人最相似的对象的细胞(考虑可能的遮挡和姿势改变),但是由于沃尔多的照片通常包含大量相同规模的人,因此这应该是一件非常简单的任务,然后将这些预先训练好的玻尔兹曼机器的部分进行喂食。 它会给你每个人作为Waldo的可能性。 以最高的概率取一个。

这就是OCR,ZIP代码阅读器和无笔迹手写识别如何在今天工作。 基本上你知道答案就在那里,你或多或少地知道它应该是什么样子,其他所有东西都可能有共同的元素,但肯定是“不是”,所以你不用为“不是”而烦恼,你只是看看你以前见过的所有可能的“它”之间的“it”的可能性(例如在邮政编码中,例如,你只需训练BM 1s,2s,3s等等,然后每个然后选择一个最有信心的数字),这比单个神经网络学习所有数字的特征要好得多。


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

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

  • 确定正确的图像特征变换。 这就是@ Heike的答案是有用的:红色滤波器和剥离模式检测器(例如小波或DCT分解)将是将原始像素转换为分类算法可以学习的格式的好方法。 评估图像所有子部分的基于块的分解也将是必需的......但是由于Waldo的a)总是大致相同的大小并且b)总是在每个图像中总是呈现一次,所以这更容易。
  • 获得足够的训练实例。 支持向量机在每个类的至少100个示例中效果最佳。 增强的商业应用(例如,数码相机中的面部聚焦)在数百万个正面和负面的例子中训练。
  • 一个快速的谷歌图片搜索提供了一些很好的数据 - 我将去收集一些培训示例,并立即编码!

    然而,即使是机器学习方法(或者@iND提出的基于规则的方法)也会为像沃尔多斯之地这样的形象而奋斗!

    链接地址: http://www.djcxy.com/p/6053.html

    上一篇: How do I find Waldo with Mathematica?

    下一篇: Exporting Mathematica Print[] Output to a .txt file