我如何find与Python的Wally?

无耻地跳上了潮stream:-)

启发如何findWaldo与Mathematica和后续如何find与R的Waldo ,作为一个新的Python用户,我很想看看如何做到这一点。 似乎python会比R更适合这个,我们不必担心像Mathematica或Matlab那样的许可证。

在下面的例子中,显然简单地使用条纹是行不通的。 如果一个简单的基于规则的方法可以用于这样的困难例子,那将是有趣的。

在沙滩上

我已经添加了[机器学习]标签,因为我相信正确答案将不得不使用ML技术,例如Gregory Klopper在原始主题中提倡的限制玻尔兹曼机(RBM)方法。 Python中有一些可用的RBM代码 ,可能是一个很好的开始,但显然这种方法需要训练数据。

在2009年IEEE国际信号处理机器学习研讨会(MLSP 2009)上,他们进行了一个数据分析竞赛:Wally在哪里? 。 训练数据以matlab格式提供。 请注意,该网站上的链接已经失效,但数据(以及Sean McLoone及其同事所采取的方法的来源可以在这里find(请参阅SCM链接)。似乎只有一个地方可以开始。

这是一个与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)) 

分成红色,绿色和蓝色通道。 最好使用下面的浮点algorithm,所以我们转换在顶部。

 w = wfloat.mean(2) 

w是白色通道。

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

在垂直轴上build立+ 1,+ 1,-1,-1的模式。 这是wally的衬衫。

 v = mahotas.convolve(rw, pattern) 

卷起红色减去白色。 如果衬衫是这样的,这将会给予强烈的回应。

 mask = (v == v.max()) mask = mahotas.dilate(mask, np.ones((48,24))) 

寻找最大的价值,并扩大它,使其可见。 现在,我们调整整个形象,除了地区或利益:

 wally -= .8*wally * ~mask[:,:,None] imshow(wally) 

我们得到 沃尔

您可以尝试模板匹配,然后取下产生了最高相似度的模板,然后使用机器学习进一步缩小范围。 这也是非常困难的,并且与模板匹配的准确性,它可能只是返回每个面部或面部的形象。 我认为如果你希望一直这样做,你将不仅需要机器学习。

也许你应该把问题分解成两个小问题:

  1. 创build一个将人与背景分开的algorithm。
  2. 训练一个neural network分类器尽可能多的积极和消极的例子。

这些仍然是两个非常大的问题来解决…

顺便说一句,我会selectc ++和打开简历,它似乎更适合这个。

这不是不可能的,但是非常困难,因为你没有一个成功的比赛的例子。 通常有多个状态(在这种情况下,查找工具图纸的例子更多),然后可以将多个图像input到图像重构程序中,并将其视为隐马尔可夫模型,并使用类似于维特比algorithm进行推理( http:/ / /en.wikipedia.org/wiki/Viterbi_algorithm )。

这就是我会的方式,但假设你有多个图像,你可以给它正确的答案的例子,所以它可以学习。 如果你只有一张照片,那么我很抱歉,你可能需要采取另一种方法。

我认识到,有两个几乎总是可见的主要特点:

  1. 红白色的条纹衬衫
  2. 花式帽下深棕色的头发

所以我会这样做:

search条纹衬衫:

  • 过滤出红色和白色(HSV转换图像上的阈值)。 这给你两个蒙版图像。
  • 把它们加在一起 ​​- >这是search条纹衬衫的主要面具。
  • 将所有滤出的红色转换为纯红色(#FF0000),并将所有滤出的白色转换成纯白色(#FFFFFF)。
  • 现在把这个纯红白的图像与条纹图案相关联(我认为所有的waldo都有相当完美的水平条纹,所以不需要旋转图案)。 只在上面提到的主要面具内进行关联。
  • 尝试将可能由一件衬衫产生的群集合在一起。

如果有多个“衬衫”,也就是说,多于一个的正相关集群,则寻找其他特征,如深褐色的头发:

寻找棕色的头发

  • 使用HSV转换的图像和一些阈值滤出特定的棕色头发的颜色。
  • search这个蒙版图像中的某个区域 – 不是太大,也不是太小。
  • 现在search一个正好在(之前)检测到的条纹衬衫之上的“发区”,并与衬衫的中心有一定的距离。