wolfram-mathematica - 如何从Mathematica找到Waldo?

  显示原文与译文双语对照的内容

这个周末打扰了我: 什么是解决那些 的好方法? [ 'Wally' outside of North America] 谜题,使用 Mathematica ( image-processing和其他功能)?

以下是我目前为止的一个功能,它通过淡化一些non-red颜色来降低视觉复杂性一点:


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

时间:

我找到了 Waldo !

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

我也赞同 @GregoryKlopper 出正确方式能解决一般问题化为求解尔多( 或者任何感兴趣的对象) 位于任意一个图片就只能去训练一个有指导的机器学习分类器。 在这个problem,使用许多正负有标记数据,基于算法,如支持向量机 推动了决策树桩算法或者玻尔兹曼机这些是可以训练成实现且精度高 Mathematica 甚至在它的机器学习框架中包括了这些算法。

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

  1. 确定正确的图像特征转换。 这就是 @Heike's 答案的用处: 红色过滤器和去除的图案检测器( e.g,小波或者DCT分解) 是将原始像素转换成分类算法可以从中学习的一种格式。 还需要评估图像所有部分的block-based分解。。 在每个image,但这是通过这一事实尔多是一个简化的) 总是差不多相同的大小和b ) 始终存在完全一分为二
  2. 获得足够的训练示例。支持向量机最多可以在每个类的100个示例中运行。 提升( e.g,数码相机中的face-focusing )的商业应用被训练在数百万个积极和消极的例子上。

一个快速的谷歌图片搜索我将会得到一些不错的数据--我将着手收集一些训练示例并立即编写代码 !

然而,即使是在rule-based从机器学习的角度( 或者方法建议通过 @iND)的斗争,一个图像会与土地的Waldos

...