habrahabr

Расширяя полотно картины Ван Гога “Звездная ночь” с помощью языка Wolfram Language (Mathematica)

  • среда, 3 декабря 2014 г. в 02:11:33
http://habrahabr.ru/post/244729/


Перевод поста Piotr Wendykier "Extending Van Gogh's Starry Night with Inpainting"
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, можно здесь (архив, ~8 МБ).


Могут ли компьютеры научиться рисовать, как Ван Гог? Определенно да, до некоторой степени! Для этого, подобно художникам-копиистам, алгоритму сначало потребуется взять некоторое оригинальное произведение, а затем он сможет на их основе создать что-то сам. Насколько хорошо он сможет с этим справиться? Пожалуйста, судите сами.

ExtendingVanGoghStarryNightInpainting_1.gif
Вторая премия на фотоконкурсе ZEISS

Недавно, инженерный факультет Кембриджского университета объявил победителей ежегодного фотоконкурса под названием “The Art of Engineering: Images from the Frontiers of Technology”. Второе место досталось Ярину Галу (Yarin Gal), аспиранту в области машинного обучения, за его экстраполяцию картины Ван Гога “Звёздная ночь”, которая показана на изображении выше. Вы можете посмотреть эту и похожие “расширенные” с помощью компьютера изображения на сайте Ярина Extrapolated Art. В создании этих искусственных картин использовался алгоритм экстраполяционной зарисовки, который называется PatchMatch и в этом посте я расскажу вам, как вы можете создать подобный эффект с помощью языка Wolfram Language (Mathematica).

Термин “цифровое зарисовывание” (“digital inpainting”) был впервые введен в статье “Image Inpainting” на конференции SIGGRAPH 2000. Основной целью “зарисовывания” является восстановление поврежденных участков изображений. Однако, этот алгоритм также широко применяется для удаления или перемещения выделенных объектов на изображениях.

В язык Wolfram Language встроена функция Inpaint, которая реализует этот алгоритм. Регион, который нужно “зарисовать” (подретушировать) может быть дан в виде изображения, набора графических примитивов (векторной графики) или же матрицы.

In[1]:=

ExtendingVanGoghStarryNightInpainting_2.gif

Out[1]=

ExtendingVanGoghStarryNightInpainting_3.gif

Функция Inpaint может работать с 5 алгоритмами, при этом вы можете указать конкретный алгоритм с помощью опции Method, это: “Diffusion,” “TotalVariation,” “FastMarching,” “NavierStokes,” и “TextureSynthesis” (по умолчанию). “TextureSynthesis”, в отличие от других алгоритмов, не оперирует отдельно с каждым цветовым каналом и не создает никаких новых значений цветов пикселей. Другими словами, каждый пиксел, участвующий в “зарисовывании”, берется из частей исходного изображения, которые имеею нулевые значения маски (т. е., проще говоря, являются черными пикселями маски). Пример ниже ясно показывает, что метод “TextureSynthesis” отлично подходит для удаления больших объектов с изображения.

In[2]:=

ExtendingVanGoghStarryNightInpainting_4.gif

Out[2]=

ExtendingVanGoghStarryNightInpainting_5.gif

Метод “TextureSynthesis” основан на алгоритме, описанном в диссертации “Image Texture Tools” (P. Harrison). Этот алгоритм является улучшением метода наилучшего приближения, который был предложен в 1981 г. в докторской диссертации “Computational Models for Texture Analysis and Texture Synthesis” (D. Garber). Параметры алгоритма “TextureSynthesis” могут быть заданы с помощью двух подопций: “NeighborCount” (по умолчанию, 30) и “MaxSamples” (по умолчанию, 300). Первый параметр определяет количество близлежащих пикселей, которые будут использоваться в сравнении текстур, второй — задает максимальный объем выборки для подборки наилучшей текстуры.

Давайте же вернемся к экстраполяции картины Ван Гога. Для начала, мы импортируем ее изображение и удалим рамку.

In[3]:=

ExtendingVanGoghStarryNightInpainting_6.gif

Out[4]=

ExtendingVanGoghStarryNightInpainting_7.gif

Теперь нам потребуется расширить поле изображения, добавив к нему белое поле, а также создадим маску для “зарисовывания”.

In[5]:=

ExtendingVanGoghStarryNightInpainting_8.gif

Out[8]=

ExtendingVanGoghStarryNightInpainting_9.gif

Теперь мы можем экстраполировать изображение с помощью метода “TextureSynthesis”

In[9]:=

ExtendingVanGoghStarryNightInpainting_11.png

Out[9]=

ExtendingVanGoghStarryNightInpainting_12.gif

Не так плохо. Можно получить различный результат, изменяя значения параметров “NeighborCount” и “MaxSamples”.

In[10]:=

ExtendingVanGoghStarryNightInpainting_13.png

Out[10]=

ExtendingVanGoghStarryNightInpainting_14.gif

Вы можете также поэкспериментировать с другими значениями параметров и другими произведениями исскусства.*

In[11]:=

ExtendingVanGoghStarryNightInpainting_15.gif

Out[16]=

ExtendingVanGoghStarryNightInpainting_16.gif

С помощью этой методики вы, думаю, сможете создать оригинальный подарок к Новому году. Из ваших персональных фото или картин можно сделать действительно интересные вещи. Или же, вы можете удивить своего ребенка, показав ему импровизацию на тему его рисунка, как это сделано выше на основе рисунка 14-летней девочки. Все зависит только от вашего воображения!

Ресурсы для изучения Wolfram Language (Mathematica) на русском языке: http://habrahabr.ru/post/244451