NumPy, PIL adding an image
Question: I'm trying to add two images together using NumPy and PIL. The way I would do
this in [MATLAB](http://en.wikipedia.org/wiki/MATLAB) would be something like:

    
    
    >> M1 = imread('_1.jpg');
    >> M2 = imread('_2.jpg');
    >> resM = M1 + M2;
    >> imwrite(resM, 'res.jpg');
    

I get something like this:

![alt text](http://www.deadlink.cc/matlab.jpg)

Using a compositing program and adding the images the MATLAB result seems to
be right.

In Python I'm trying to do the same thing like this:

    
    
    from PIL import Image
    from numpy import *
    
    im1 = Image.open('/Users/rem7/Desktop/_1.jpg')
    im2 = Image.open('/Users/rem7/Desktop/_2.jpg')
    
    im1arr = asarray(im1)
    im2arr = asarray(im2)
    
    addition = im1arr + im2arr
    
    resultImage = Image.fromarray(addition)
    resultImage.save('/Users/rem7/Desktop/a.jpg')
    

and I get something like this:

![alt text](http://www.deadlink.cc/python.jpg)

Why am I getting all those funky colors? I also tried using
`ImageMath.eval("a+b", a=im1, b=im2)`, but I get an error about RGB
unsupported.

I also saw that there is an `Image.blend()` but that requires an alpha.

What's the best way to achieve what I'm looking for?

Source Images (images have been removed):

![alt text](http://www.deadlink.cc/_1.jpg) ![alt
text](http://www.deadlink.cc/_2.jpg)

Humm, OK, well I added the source images using the add image icon and they
show up when I'm editing the post, but for some reason the images don't show
up in the post.

(images have been removed) 2013 05 09


Answer: As everyone suggested already, the weird colors you're observing are overflow.
And as you point out in the [comment of schnaader's
answer](http://stackoverflow.com/questions/524930/numpy-pil-adding-an-
image/524943#524943) you **still get overflow** if you add your images like
this:

    
    
    addition=(im1arr+im2arr)/2
    

The reason for this overflow is that your NumPy arrays (_im1arr_ _im2arr_) are
of the **uint8** type (i.e. 8-bit). This means each element of the array can
only hold values up to 255, so when your sum exceeds 255, it loops back around
0:

    
    
    >>>array([255,10,100],dtype='uint8') +  array([1,10,160],dtype='uint8')
    array([ 0, 20,  4], dtype=uint8)
    

To avoid overflow, your arrays should be able to contain values beyond 255.
You need to **convert them to floats** for instance, perform the blending
operation and **convert the result back to uint8** :

    
    
    im1arrF = im1arr.astype('float')
    im2arrF = im2arr.astype('float')
    additionF = (im1arrF+im2arrF)/2
    addition = additionF.astype('uint8')
    

You **should not** do this:

    
    
    addition = im1arr/2 + im2arr/2
    

as you lose information, by squashing the dynamic of the image (you
effectively make the images 7-bit) before you perform the blending
information.

**MATLAB note** : the reason you don't see this problem in MATLAB, is probably
because MATLAB takes care of the overflow implicitly in one of its functions.

