使用PIL用附近的颜色填充空图像空间(又称修复)

jte*_*ace 10 python numpy image-processing python-imaging-library

我用PIL创建一个图像:

示例图片

我需要填补空白区域(描绘为黑色).我可以很容易地用静态颜色填充它,但我想做的是用附近的颜色填充像素.例如,边界之后的第一个像素可能是填充像素的高斯模糊.或者可能是Lumigraph,Gortler等人所述的推挽式算法..

我需要一些不太慢的东西,因为我必须在许多图像上运行它.我可以访问其他库,比如numpy,你可以假设我知道边界或外部区域或区域内的掩码.有关如何处理此问题的任何建议?

更新:

正如belisarius所建议的那样,opencv的inpaint方法是完美的.这里有一些使用opencv来实现我想要的python代码:

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()
Run Code Online (Sandbox Code Playgroud)

结果图像:

画的图像

Dr.*_*ius 8

一个结果很好的方法是Navier-Stokes图像恢复.我知道OpenCV有它,不知道PIL.

你的例子:

在此输入图像描述 在此输入图像描述

我是用Mathematica做的.

编辑

根据您的请求,代码是:

i = Import["http://i.stack.imgur.com/uEPqc.png"];
Inpaint[i, ColorNegate@Binarize@i, Method -> "NavierStokes"]
Run Code Online (Sandbox Code Playgroud)

ColorNegate @ ...部分创建替换蒙版.仅使用Inpaint[]命令完成填充.