Fastest Way To Loop Through Every Pixel

Simon Forman rogue_pedro at yahoo.com
Fri Jul 28 03:05:49 EDT 2006


Chaos wrote:
> Simon Forman wrote:
> > Chaos wrote:
> > > As my first attempt to loop through every pixel of an image, I used
> > >
> > >         for thisY in range(0, thisHeight):
> > >             for thisX in range(0, thisWidth):
> > >                   #Actions here for Pixel thisX, thisY
> > >
> > > But it takes 450-1000 milliseconds
> > >
> > > I want speeds less than 10 milliseconds
> > >
> > > I have tried using SWIG, and pypy but they all are unsuccessfull in
> > > compiling my files.
> >
> > You could try the PIL package.
> >
> > >From the docs at
> > http://www.pythonware.com/library/pil/handbook/image.htm
> >
> > Image.eval(function, image) => image
> >
> > Applies the function (which should take one argument) to each pixel in
> > the given image. If the image has more than one band, the same function
> > is applied to each band. Note that the function is evaluated once for
> > each possible pixel value, so you cannot use random components or other
> > generators.
> >
> > HTH,
> > ~Simon
>
> I have tried PIL. Not only that, but the Image.eval function had no
> success either. I did some tests and I found out that Image.eval only
> called the function a certain number of times either 250, or 255.

It says "the function is evaluated once for each possible pixel value",
so if it's only calling the function 250 or 255 times it's because your
image only has 250 or 255 colors.

Obviously Image.eval() caches the results of your function for each
color/pixel-value and reuses them rather than recomputing them.

I take it that whatever you're doing to those pixels involves more
information than just the pixel values?  What are you doing to the
pixels? That's probably wher you should look to improve the speed of
the loop.

Peace,
~Simon




More information about the Python-list mailing list