协慌网

登录 贡献 社区

我怎样才能找到带有 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"]

(Waldo 是收银台):

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

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

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

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

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

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

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

一个快速的谷歌图像搜索提供了一些好的数据 - 我将去收集一些培训示例并立即对其进行编码!

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