On Jun 25, 2:37 pm, idiolect <[EMAIL PROTECTED]> wrote: > Hi all - Sorry to plague you with another newbie question from a > lurker. Hopefully, this will be simple. > > I have a list full of RGB pixel values read from an image. I want to > test each RGB band value per pixel, and set it to something else if it > meets or falls below a certain threshold - i.e., a Red value of 0 > would be changed to 50. > > I've built my list by using a Python Image Library statement akin to > the following: > > data = list(image.getdata()) > > Which produces a very long list that looks like [(0,150,175), > (50,175,225),...]. I'm trying to figure out a fast and pythonic way > to perform my operation. The closest I've come so far to a succinct > statement is a list comprehension along the syntax of: > > source = [((x,y,z),(x+50,y+50,z+50))[bool(x or y or z < 50)] for > (x,y,z) in source] > > ...which kind of approaches the effect I'm looking for, but it doesn't > really test and change each value in the tuple individually. My > understanding of the things you can do with lists and python in > general is rather naive, so I would appreciate any insight anyone can > offer since I am not sure if I'm even headed down the correct path > with list comprehensions. > > Much obliged!
List comprehension is just a tool. If it looks more complicated than it would if you used a regular for loop, then use a regular for loop. It seems like you are evaluating a lot of data, so I would take advantage of pythons (lazy) generators to save a lot of memory: def brighten(seq, threshold=50): # I don't know what the generic name for this operation is for pixel in seq: if any(channel < threshold for channel in pixel): r, g, b = pixel yield r + threshold, g + threshold, b + threshold then... source = brighten(image.getdata()) Source is going to be a lazy generator, so you can cast it to list, or just pass it to something else that takes a sequence. The latter is preferred. Matt -- http://mail.python.org/mailman/listinfo/python-list