I create an image with PIL:
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..
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?
As suggested by belisarius, opencv's 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): for y in range(im.size): 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: