我怎样才能用Python找到沃利?

2024-06-16 11:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

不知羞耻地赶时髦:-)

How do I find Waldo with Mathematica和后续的How to find Waldo with R启发,作为一个新的python用户,我很想看看如何做到这一点。似乎python比R更适合这种情况,而且我们不必像Mathematica或Matlab那样担心许可证问题。

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

At the beach

我添加了[机器学习]标签,因为我认为正确的答案必须使用ML技术,例如Gregory Klopper在原始线程中提倡的受限Boltzmann机器(RBM)方法。有一些RBM code available in python可能是一个很好的起点,但显然这种方法需要训练数据。

2009 IEEE International Workshop on MACHINE LEARNING FOR SIGNAL PROCESSING (MLSP 2009)他们运行了Data Analysis Competition: Where's Wally?。训练数据以matlab格式提供。请注意,该网站上的链接已经失效,但是可以找到数据(以及Sean McLoone和同事采用的方法的来源here(请参阅SCM链接)。似乎只有一个起点。


Tags: to数据方法用户机器链接withfind
3条回答

你可以尝试模板匹配,然后取下产生最高相似度的模板,然后使用机器学习来缩小范围。这也很困难,而且由于模板匹配的准确性,它可能只会返回每个人脸或类人脸的图像。我认为如果你希望一直这样做,你需要的不仅仅是机器学习。

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

  1. 创建一个将人与背景分离的算法。
  2. 训练一个尽可能多的正负例子的神经网络分类器。

这仍然是两个需要解决的大问题。。。

顺便说一句,我会选择c++和open CV,它似乎更适合这个。

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

分成红、绿、蓝三个频道。下面最好使用浮点运算,所以我们在上面转换。

w = wfloat.mean(2)

w是白色通道。

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

在垂直轴上建立+1、+1、-1、-1的图案。这是沃利的衬衫。

v = mahotas.convolve(r-w, pattern)

用红色减白色卷积。这会给衬衫所在的地方一个强烈的反应。

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

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

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

我们得到waldo

相关问题 更多 >