2014-01-15 81 views
2

我堆積了以當前顏色區間查找像素位置的問題。 這是非常緩慢:以當前顏色區間快速查找像素位置

def inRange(self, tgColor, excColor, jump): 
    if tgColor[0] > excColor[0] - jump and tgColor[0] < excColor[0] + jump and tgColor[1] > excColor[1] - jump and tgColor[1] < excColor[1] + jump and tgColor[2] > excColor[2] - jump and tgColor[2] < excColor[2] + jump: 
      return True 
    return False 

for iy in xrange(self.pilImage.size[1]): 
     for ix in xrange(self.pilImage.size[0]): 
      if self.inRange(data[ix, iy], self.targetColor, self.jump): 

所以,你可以幫我提高這個代碼,使其運行得更快。 (圖像大小 - 640 x 480) 也許另一個lib:OpenCV,pygame,PIL?

+1

這個問題似乎是題外話,因爲它屬於上http://codereview.stackexchange.com – jonrsharpe

回答

2

你的代碼可以是超慢

OpenCV的自帶功能cv2.inRange()。你傳遞最小和最大像素值,你會得到一個二值圖像,其像素爲白色,失敗像素爲黑色。

然後,您可以使用numpy.where()來查找白色像素的索引。

下面是一個灰度值的例子。它也可以擴展到彩色圖像。 [Link]

例子:

>>> import cv2 
>>> import numpy as np 
>>> x = np.random.randint(1,10, (5,5)) 
>>> x 
array([[9, 5, 1, 3, 1], 
     [7, 7, 2, 1, 7], 
     [9, 1, 4, 7, 4], 
     [3, 6, 6, 7, 2], 
     [3, 4, 2, 3, 1]]) 
>>> y = cv2.inRange(x,4,8) 
>>> y 
array([[ 0, 255, 0, 0, 0], 
     [255, 255, 0, 0, 255], 
     [ 0, 0, 255, 255, 255], 
     [ 0, 255, 255, 255, 0], 
     [ 0, 255, 0, 0, 0]], dtype=uint8) 

>>> z = np.transpose(np.where(y>0)) 
>>> z 
array([[0, 1], 
     [1, 0], 
     [1, 1], 
     [1, 4], 
     [2, 2], 
     [2, 3], 
     [2, 4], 
     [3, 1], 
     [3, 2], 
     [3, 3], 
     [4, 1]]) 
+0

是的,我的代碼是很慢的,因爲它必須這樣做307200次的迭代在週期:(但你的建議是非常有用的,謝謝。 – Megaxela