Python 使用PIL用附近的颜色填充空白图像空间(也称为修复)

Python 使用PIL用附近的颜色填充空白图像空间(也称为修复),python,image-processing,numpy,python-imaging-library,Python,Image Processing,Numpy,Python Imaging Library,我用PIL创建了一个图像: 我需要填补空白(描绘为黑色)。我可以很容易地用静态颜色填充它,但我想做的是用附近的颜色填充像素。例如,边界后的第一个像素可能是填充像素的高斯模糊。或者可能是中描述的推拉式算法 我需要一些不是太慢的东西,因为我必须在很多图像上运行它。我可以访问其他库,比如numpy,您可以假设我知道外部区域或内部区域的边界或遮罩。关于如何处理这个问题有什么建议吗 更新: 正如belisarius所建议的,这种方法非常适合这种情况。下面是一些python代码,它们使用opencv实现了

我用PIL创建了一个图像:

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

我需要一些不是太慢的东西,因为我必须在很多图像上运行它。我可以访问其他库,比如numpy,您可以假设我知道外部区域或内部区域的边界或遮罩。关于如何处理这个问题有什么建议吗

更新:

正如belisarius所建议的,这种方法非常适合这种情况。下面是一些python代码,它们使用opencv实现了我想要的功能:

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()
以及生成的图像:


根据您部署此应用程序的方式,另一种选择可能是使用Gimp进行图像处理


我链接到的doc页面更倾向于用python编写GIMP插件,而不是与python应用程序中的背景GIMP实例交互,但我非常确定这也是可能的(我已经有一段时间没有使用GIMP/python接口了,我有点模糊)。

一个效果不错的方法是我知道OpenCV拥有它,我不知道比尔

你的例子是:

我和Mathematica一起做的

编辑

根据您的要求,代码为:

i = Import["http://i.stack.imgur.com/uEPqc.png"];
Inpaint[i, ColorNegate@Binarize@i, Method -> "NavierStokes"]
颜色否定。。。零件创建替换遮罩。
填充只需使用
Inpaint[]
命令即可完成。

您还可以使用函数
CreateImage()
创建遮罩,例如:

inpaint_mask = cv.CreateImage(cv.GetSize(im), 8, 1)

它有这样的例程吗?遗憾的是,我不确定它是否有一个符合你需要的插件。。。我主要是把它作为一个你可能不知道的选项发布的,因为它有一些更强大的工具来构建:遮罩、高斯模糊过滤器和一个到低层像素区域对象的pythonic接口。现在我仔细考虑了一下,对于您的目的来说,它可能过于夸张,特别是当您必须处理大量文件时。尽管有一种算法可能值得一试,那就是Gimp的插件,它是一种“内容感知填充”算法。我已经将一些示例python代码从PIL转换为opencv,并完成了我问题中的绘制。我接受了你的回答。谢谢@很高兴能帮忙!我也把你的问题投了赞成票,因为这是一个很好的例子,说明SO是多么有用。你知道为什么inpaint总是忽略图像的x=0和y=0(最上面一行和最左边一列)吗?