image-processing - 如何使用 Mathematica 查找 Waldo?

标签 image-processing wolfram-mathematica

这个周末一直困扰着我:有什么好方法来解决这些问题 Where's 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 在收银台旁边):

Original image

Mathematica graphic

最佳答案

我找到了威利!

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

我使用二值化来挑选图像中具有足够高相关性的像素,并在它们周围绘制白色圆圈以使用扩张来强调它们

pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];

我必须稍微调整一下关卡。如果级别太高,则会挑选出太多误报。

最后我将这个结果与原始图像结合起来得到上面的结果

found = ImageMultiply[waldo, ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

关于image-processing - 如何使用 Mathematica 查找 Waldo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8479058/

相关文章:

matlab - 在matlab中定义掩码的代码

image-processing - 使用 Lanczos 过滤器对图像进行 2 倍下采样

wolfram-mathematica - CellDingbat 位于 Cell 的第一行下方

plot - 处理 Mathematica 图表中的刻度

wolfram-mathematica - 如何直接添加元素 'Show Animation Control'(不使用Manipulate控件设置)?

c# - 如何使用矩阵转换鼠标坐标?

android - 如何在 Android 中扭曲图像?

image-processing - 如何检查图像中是否有自定义字符?

wolfram-mathematica - 具有许多奇点的 Mathematica 积分

wolfram-mathematica - 数学 : Solving a PDE that contains Conjugate of a function or Abs of a function