[Image-SIG] How to display a masked image?
Russell E. Owen
rowen at cesmail.net
Thu Apr 13 22:28:46 CEST 2006
I'm trying to use PIL to display a grayscale image with an associated
mask. I want the user to clearly see which pixels are masked, yet still
be able to see the original data in the masked areas.
The algorithm I've come up with is to average the grayscale image with a
mask that consists of a tint color. It seems to work (but if there's a
better algorithm I'd love to hear of it).
However, my code to implement this looks pretty messy. Is there a better
way?
def addMask(im, mask, maskrgb, intens=75):
"""Add a mask to a grayscale image in such a way that the
masked areas of the image can still be seen.
Inputs:
- im is an "F" grayscale image that has been scaled into 0-255 range
- mask is a mask such that 0 = unmasked, nonzero=masked
- maskrgb is a tuple of RGB color values 0-255 each
- intens is the intensity of the displayed mask 0-255
Returns the masked image in color
"""
lmask = mask.convert("L")
rgbmaskset = []
# create color image of mask
for colval in maskrgb:
rgbmaskset.append(lmask.point(lambda i: i * colval))
rgbmask = Image.merge("RGB", rgbmaskset)
# create transparency version of mask
transmask = lmask.point(lambda i: i * intens)
# merge mask and image
rgbim = im.convert("RGB")
rgbim.paste(rgbmask, mask=transmask)
return rgbim
-- Russell
More information about the Image-SIG
mailing list