Используя PIL, чтобы заполнить пустое пространство изображения близлежащими цветами (иначе рисование) - PullRequest
10 голосов
/ 17 августа 2011

Я создаю изображение с PIL:

example image

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

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

ОБНОВЛЕНИЕ:

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

Ответы [ 3 ]

8 голосов
/ 18 августа 2011

Метод с хорошими результатами - Восстановление изображения Навье-Стокса . Я знаю, что в OpenCV это есть, не знаю о PIL.

Ваш пример:

enter image description here enter image description here

Я сделал это с Mathematica.

Редактировать

Согласно вашему запросу, кодis:

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

Часть ColorNegate @ ... создает маску замены.Заполнение выполняется только командой Inpaint[].

0 голосов
/ 12 апреля 2014

Вы также можете создать маску с помощью функции CreateImage(), например:

inpaint_mask = cv.CreateImage(cv.GetSize(im), 8, 1)
0 голосов
/ 17 августа 2011

В зависимости от того, как вы развертываете это приложение, другой вариант может заключаться в использовании интерфейса Python Gimp для манипулирования изображениями.

Страница документа, на которую я ссылался, больше ориентирована на написание плагинов GIMP на python, а не на взаимодействие с фоновым экземпляром gimp из приложения на python, но я уверен, что это тоже возможно (давно я играл с интерфейс gimp / python, я немного смутный).

...