Searching for patterns on the screen

Paul McGuire ptmcg at
Fri Sep 15 16:52:47 CEST 2006

"Jerry Hill" <malaclypse2 at> wrote in message 
news:mailman.125.1158327884.10491.python-list at
> Hello all,
> I have a piece of code I could use some help optimizing.  What I'm
> attempting to do is periodically grab a screenshot, and search for 2D
> patterns of black pixels in it.  I don't care about any color other
> than black.  Here's some simple code that simulates my worst-case
> scenario, scanning the whole screen for a sequence that does not
> exist:
> import ImageGrab  # From the PIL library
> def removeColor(rgb):
>    r, g, b = rgb
>    return (r == 0 and g == 0 and b == 0)
> BMP = ImageGrab.grab.getdata()
> x = map(removeColor, BMP)
> The idea is to search for sequences of black pixels on a background
> that can change colors.

I had to do a similar thing using pywinauto to interact with a IE browser 
running an embedded Flash application.  To speed things up, I included psyco 
to compile my functions.

As far as working just in Python, you could remove the tuple unpacking 
inside removeColor, and shorten it to just:

def removeColor(rgb):
    return rgb==(0,0,0)

or even better:

BLACK = (0,0,0)
def removeColor(rgb):
    return rgb==BLACK

By defining BLACK once and just referring to it by name, you also avoid 
dynamically constructing the (0,0,0) tuple in every call.

But you might also look at the PIL docs and see if there is a way to do this 
color manipulation using the PIL API - the advantage here is that then you 
would be invoking a C-compiled API routine, which will run way faster than 
any optimized Python method.

-- Paul

More information about the Python-list mailing list