如何使用Python找到Wally?

tdc*_*tdc 81 python machine-learning image-processing computer-vision

无耻地跳上潮流:-)

灵感来自我如何找到带有Mathematica的Waldo和后续如何找到Waldo with R,作为一个新的python用户,我很想知道如何做到这一点.看起来python比R更适合这个,我们不必像Mathematica或Matlab那样担心许可证.

在下面的例子中,显然只使用条纹是行不通的.如果能够制定一个简单的基于规则的方法来处理诸如此类的困难例子,那将会很有趣.

在沙滩上

我已经添加了[机器学习]标签,因为我认为正确的答案必须使用ML技术,例如Gregory Klopper在原始主题中提倡的Restricted Boltzmann Machine(RBM)方法.python中有一些RBM代码可能是一个很好的起点,但显然需要训练数据.

2009年IEEE国际信号处理机器学研讨会(MLSP 2009)上,他们举办了数据分析竞赛:Wally在哪里?.训练数据以matlab格式提供.请注意,该网站上的链接已经死亡,但是数据(以及Sean McLoone及其同事采用的方法的来源可以在这里找到(参见SCM链接).看起来像是一个开始的地方.

lui*_*dro 60

这是mahotas的实现

from pylab import imshow
import numpy as np
import mahotas
wally = mahotas.imread('DepartmentStore.jpg')

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))
Run Code Online (Sandbox Code Playgroud)

分为红色,绿色和蓝色通道.最好在下面使用浮点运算,因此我们在顶部进行转换.

w = wfloat.mean(2)
Run Code Online (Sandbox Code Playgroud)

w 是白色通道.

pattern = np.ones((24,16), float)
for i in xrange(2):
    pattern[i::4] = -1
Run Code Online (Sandbox Code Playgroud)

在垂直轴上构建+ 1,+ 1,-1,-1的模式.这是wally的衬衫.

v = mahotas.convolve(r-w, pattern)
Run Code Online (Sandbox Code Playgroud)

与红色减去白色相结合.这会给衬衫带来强烈反响.

mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))
Run Code Online (Sandbox Code Playgroud)

寻找最大值并扩大它以使其可见.现在,我们调整整个图像,除了区域或兴趣:

wally -= .8*wally * ~mask[:,:,None]
imshow(wally)
Run Code Online (Sandbox Code Playgroud)

我们得到了 沃尔!

  • 我尝试了海滩图像并且效果不佳:( Wally在前6或7次点击,但它不是最好的匹配.处理确实有帮助,因为我无法找到他自己(与我当我只有一堆小区域时,很容易. (3认同)
  • 太棒了:-)你有没有尝试过任何其他图像? (2认同)