Using PIL to fill empty image space with nearby colors (aka inpainting)
Question: I create an image with PIL:

![example image](http://i.stack.imgur.com/uEPqc.png)

I need to fill in the empty space (depicted as black). I could easily fill it
with a static color, but what I'd like to do is fill the pixels in with nearby
colors. For example, the first pixel after the border might be a Gaussian blur
of the filled-in pixels. Or perhaps a push-pull type algorithm described in
[The Lumigraph, Gortler, et
al.](http://research.microsoft.com/apps/pubs/default.aspx?id=68168).

I need something that is not too slow because I have to run this on many
images. I have access to other libraries, like numpy, and you can assume that
I know the borders or a mask of the outside region or inside region. Any
suggestions on how to approach this?

**UPDATE:**

As suggested by belisarius, [opencv's
inpaint](http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-
inpaint) method is perfect for this. Here's some python code that uses opencv
to achieve what I wanted:

    
    
    import Image, ImageDraw, cv
    
    im = Image.open("u7XVL.png")
    pix = im.load()
    
    #create a mask of the background colors
    # this is slow, but easy for example purposes
    mask = Image.new('L', im.size)
    maskdraw = ImageDraw.Draw(mask)
    for x in range(im.size[0]):
        for y in range(im.size[1]):
            if pix[(x,y)] == (0,0,0):
                maskdraw.point((x,y), 255)
    
    #convert image and mask to opencv format
    cv_im = cv.CreateImageHeader(im.size, cv.IPL_DEPTH_8U, 3)
    cv.SetData(cv_im, im.tostring())
    cv_mask = cv.CreateImageHeader(mask.size, cv.IPL_DEPTH_8U, 1)
    cv.SetData(cv_mask, mask.tostring())
    
    #do the inpainting
    cv_painted_im = cv.CloneImage(cv_im)
    cv.Inpaint(cv_im, cv_mask, cv_painted_im, 3, cv.CV_INPAINT_NS)
    
    #convert back to PIL
    painted_im = Image.fromstring("RGB", cv.GetSize(cv_painted_im), cv_painted_im.tostring())
    painted_im.show()
    

And the resulting image:

![painted image](http://i.stack.imgur.com/Sf7fv.png)


Answer: A method with nice results is the [**Navier-Stokes Image
Restoration**.](http://www.dtic.upf.edu/~mbertalmio/final-cvpr.pdf) I know
OpenCV has it, don't know about PIL.

Your example:

![enter image description here](http://i.stack.imgur.com/u7XVL.png) ![enter
image description here](http://i.stack.imgur.com/IXarX.png)

I did it with Mathematica.

**Edit**

As per your reuquest, the code is:

    
    
    i = Import["http://i.stack.imgur.com/uEPqc.png"];
    Inpaint[i, ColorNegate@Binarize@i, Method -> "NavierStokes"]
    

The ColorNegate@ ... part creates the replacement mask. The filling is done
with just the `Inpaint[]` command.

