这个周末一直困扰着我:有什么好方法来解决这些问题 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 在收银台旁边):
最佳答案
我找到了威利!
我是如何做到的
首先,我过滤掉所有非红色的颜色
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/