2017-07-20 37 views
0

学习python 3.X作为一种爱好。我写了一个简单的像素搜索:Python嵌套for-loop到numpy

 im = Image.open("photo.jpg").convert('RGB').Load 
     for x1, y1 in product(range(300, 1100, 1), range(200, 500, 1)): 
      r,g,b =im[x1,y1] 
      rx,gx,bx = 200, 20, 20 
      if abs(rx - r)<=5 and abs(gx - g)<=5 and abs(bx - b)<=5: 
       do stuff 
       break 

我希望它能够实时检测屏幕上的特定颜色。但它有点慢。 我试图用numpy替换iteretools.product。

 for y in np.arange(200,500,1): 
      for x in np.arange(300,1100,1): 
       r,g,b =im[x1,y1] 

但它给出了一个错误:“Typeerror:一个整数是必需的。” 我在做什么错?并且是我的方法转换为numpy以改善性能的正确方法?

+0

首先,当您将循环变量重命名为'x'和'y'时,'x1'和'y1'没有在第二部分中定义。其次,你仍然有循环。为了提高性能,你应该摆脱这些,并用矢量化操作替换它们。否则,性能不会变好。然而,为了帮助你,你需要知道“做什么”是什么。 – jotasi

回答

0

你可以得到匹配的面具在矢量时尚为pre-processing一步,像这样 -

mask = (np.abs(im[300:1100, 200:500] - [200,20,20]) <= 5).all(-1) 

然后,使用这种面膜循环时 -

for yi,y in enumerate(np.arange(200,500,1)): 
    for xi,x in enumerate(np.arange(300,1100,1)): 
     if mask[xi,yi]: 
      #do something 

所以,这个想法是在嵌套循环中最小化工作。此外,随着“做某些事情”的更多信息,也可能对这些操作进行矢量化处理,并进一步提升性能。

+0

'做东西'将只是将鼠标移动到与rx,gx,bx颜色相匹配的像素。 也谢谢你的建议。会尝试一下:) – blr69

+0

@ blr69任何更新(S)? – Divakar

+0

我收到一个错误,说 'mask =(np.abs(im [300:1100,200:500] - [200,20,20])<= 5).all(-1) TypeError:整数是必需的' – blr69