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

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

Пример изображения

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

Мне нужно что-то не слишком медленное, потому что я должен запускать это на многих изображениях. У меня есть доступ к другим библиотекам, например 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() 

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

окрашенное изображение

3 Solutions collect form web for “Использование PIL для заполнения пустого пространства изображения соседними цветами (например, inpainting)”

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

Ваш пример:

введите описание изображения здесьвведите описание изображения здесь

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

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

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

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

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

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

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

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

 inpaint_mask = cv.CreateImage(cv.GetSize(im), 8, 1) 
  • Как gauss-filter (размытие) массива nump с плавающей запятой
  • Укажите цвет заполнения изображения при повороте в python с помощью PIL и установите для параметра expand значение true
  • Интерпретация GPS-информации exif-данных с фото в python
  • ОТКРЫТЬ ИЗОБРАЖЕНИЕ ИСПОЛЬЗОВАНИЕ PYTHON, показывая ошибку
  • Django: изменение размера изображения и загрузка на S3
  • Python сохраняет фигуру matplotlib на объекте PIL Image
  • Установка PIL с поддержкой JPEG в Mac OS X
  • Скриншот цветовое усреднение прямоугольников
  •  
    Interesting Posts for Van-Lav

    Есть ли способ использовать два условия if в списках в python

    Какие легкие альтернативы django-sentry для регистрации?

    Как pythonically имеют частично взаимоисключающие необязательные аргументы?

    Изменение размера разделительной линии в wxpython?

    Невозможно загрузить относительный файл конфигурации с помощью ConfigParser из подкаталога

    Как сделать больше или меньше, чем использовать MongoDB?

    Использование setuptools для создания пакета cython, вызывающего внешнюю библиотеку C

    Значение @classmethod и @staticmethod для начинающих?

    Удалить високосный год из базы данных pandas

    Местоположение или масштабирование текста HUD Pyglet

    Можно ли переключить определенный шаг в конвейере sklearn?

    Определенные длины кромок на сетевом / играфе (Python)

    Проверка имени модуля внутри 'except ImportError'

    Возможно ли запустить программу на базе iOS в качестве статической библиотеки?

    Как я могу извлечь адрес из необработанного текста, используя NLTK в python?

    Python - лучший язык программирования в мире.