寻找沃利

这原本是一个 answer on stackoverflow 我们可以使用它作为一个简单的教程示例。

问题是要在下面的图片中找到沃利(他在美国的名字是沃尔多):

from pylab import imshow, show
import mahotas
import mahotas.demos
wally = mahotas.demos.load('Wally')
imshow(wally)
show()

(Source code, png, hires.png, pdf)

_images/wally-1.png

从2013年10月11日起(1.0.4或更高版本),您可以从mahotas获取Wally图像::

import mahotas.demos
wally = mahotas.demos.load('Wally')

你能看到他吗?

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 range(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]

我们得到的信息如下:

wfloat = wally.astype(float)
r,g,b = wfloat.transpose((2,0,1))
w = wfloat.mean(2)
pattern = np.ones((24,16), float)
for i in range(2):
    pattern[i::4] = -1
v = mahotas.convolve(r-w, pattern)
mask = (v == v.max())
mask = mahotas.dilate(mask, np.ones((48,24)))
np.subtract(wally, .8*wally * ~mask[:,:,None], out=wally, casting='unsafe')
imshow(wally)
show()

(Source code, png, hires.png, pdf)

_images/wally-2.png