Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fast finding pixel position with current color interval

I stacked with problem of finding pixel position with current color interval. This is very slow:

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):

So, can you help me to improve this code, to make it work faster. (Image size - 640 x 480) Maybe another lib: OpenCV, pygame, PIL?

like image 659
Megaxela Avatar asked Dec 04 '25 08:12

Megaxela


1 Answers

Your code can be super-slow

OpenCV comes with a function cv2.inRange(). You pass the minimum and maximum pixel values and you get a binary image with passed pixels as white and failed pixels as black.

Then you can use numpy.where() to find the indices of pixels who are white.

Below is an example with grayscale values. It can be extended to color images also. [Link]

Example:

>>> 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]])
like image 138
Abid Rahman K Avatar answered Dec 05 '25 22:12

Abid Rahman K