pythonimage-manipulationcolor-blending

Blend overlapping images in python


I am taking two images in python and overlapping the first image onto the second image. What I would like to do is blend the images where they overlap. Is there a way to do this in python other than a for loop?


Solution

  • PIL has a blend function which combines two RGB images with a fixed alpha:

    out = image1 * (1.0 - alpha) + image2 * alpha
    

    However, to use blend, image1 and image2 must be the same size. So to prepare your images you'll need to paste each of them into a new image of the appropriate (combined) size.

    Since blending with alpha=0.5 averages the RGB values from both images equally, we need to make two versions of the panorama -- one with img1 one top and one with img2 on top. Then regions with no overlap have RGB values which agree (so their averages will remain unchanged) and regions of overlap will get blended as desired.


    import operator
    from PIL import Image
    from PIL import ImageDraw
    
    # suppose img1 and img2 are your two images
    img1 = Image.new('RGB', size=(100, 100), color=(255, 0, 0))
    img2 = Image.new('RGB', size=(120, 130), color=(0, 255, 0))
    
    # suppose img2 is to be shifted by `shift` amount 
    shift = (50, 60)
    
    # compute the size of the panorama
    nw, nh = map(max, map(operator.add, img2.size, shift), img1.size)
    
    # paste img1 on top of img2
    newimg1 = Image.new('RGBA', size=(nw, nh), color=(0, 0, 0, 0))
    newimg1.paste(img2, shift)
    newimg1.paste(img1, (0, 0))
    
    # paste img2 on top of img1
    newimg2 = Image.new('RGBA', size=(nw, nh), color=(0, 0, 0, 0))
    newimg2.paste(img1, (0, 0))
    newimg2.paste(img2, shift)
    
    # blend with alpha=0.5
    result = Image.blend(newimg1, newimg2, alpha=0.5)
    

    img1:

    enter image description here

    img2:

    enter image description here

    result:

    enter image description here


    If you have two RGBA images here is a way to perform alpha compositing.