Использование PIL для заполнения пустого пространства изображения соседними цветами (также известное как inpainting)

Я создаю изображение с помощью PIL:

example image

Мне нужно заполнить пустое пространство (обозначенное черным). Я мог бы легко заполнить его статическим цветом, но я бы хотел заполнить пиксели соседними цветами. Например, первый пиксель после границы может быть размытием по Гауссу заполненных пикселей. Или, возможно, алгоритм типа push-pull, описанный в The Lumigraph, Gortler и др. .

Мне нужно что-то не слишком медленное, потому что мне приходится запускать его на многих изображениях. У меня есть доступ к другим библиотекам, таким как numpy, и вы можете предположить, что я знаю границы или маску внешней или внутренней области. Есть предложения, как подойти к этому?

ОБНОВЛЕНИЕ:

Как было предложено belisarius, метод opencv inpaint идеально подходит для этого. Вот код 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()

И получившееся изображение:

painted image

10
задан jterrace 5 October 2011 в 18:38
поделиться