周末这让我烦恼:解决那些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 是收银台):
我找到了沃尔多!
我是怎么做到的
首先,我将过滤掉所有不是红色的颜色
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 分类器的两个挑战是:
一个快速的谷歌图像搜索提供了一些好的数据 - 我将去收集一些培训示例并立即对其进行编码!