Wolfram Language, Mathematica, Wolfram Alpha и др.
44,49
рейтинг
2 декабря 2014 в 01:06

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


Перевод поста 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
Автор: @OsipovRoman Piotr Wendykier
Wolfram Research
рейтинг 44,49
Wolfram Language, Mathematica, Wolfram Alpha и др.

Комментарии (36)

  • 0
    Эта методика была бы полезна в графических редакторах. Очень часто надо «зарисовать» или «расширить» изображение. И эти паттерны приходится ручками клонировать. Но специалисты по граф.пакетам, часто не специалисты в программирование, а особенно в такой экзотике, как wolfram.
    • +6
      В Photoshop есть Content-Aware Fill.
      • 0
        Замечательно. Не знал. Но не фотошопом единым живет дизайнер :)
        • +2
          В pixelmator тоже есть, но оно там работает немного иначе. Расширять не получается, а внутренние дыры хорошо латает.
    • +1
      На сайте extrapolated-art.com/ как раз и написано, как это сделано:
      We used Photoshop's implementation of PatchMatch on the frame of the painting rather than inside it

      Скриншот

    • +1
      Для GIMP есть плагин G'MIC, там это поддерживается
  • +9
    А Чёрный Квадрат могёт?
    • +12
      Черный квадрат даже пэйнт могёт.
      • +6
        Даже с учётом того что он не совсем чёрный и совсем не квадрат?
        • +5
          Не совсем пэйнт с этим справится.
    • +9
      Понятно, что чем абстрактнее картина, тем будет лучше визуально результат.


      Джаспер Джонс, Фальстарт
      (картина стоит 80 млн. долларов, можно сказать, что так ее стоимость вырастет до 320 млн. за счет увеличения площади в 4 раза, шутка конечно)
      • +1
        Поллак тоже хорошо смотрится:

        Сближение

        С третьего раза только получилось, виснет сервис жутко. Хабраэффект?)
        • 0
          Вы в Wolfram Cloud делали?
          • 0
            Да, в облаке.
            • +1
              Если у вас Free аккаунт, то там довольно ограниченная производительность, которая правда обычно не мешает при работе коротких программ. Видимо сама картинка на вход подавалась довольно большого размера. Это может быть незаметно, так как фронт-энд автоматически масштабирует их для более удобного отображения.
              Wolfram Programming Cloud пока еще Beta-версия, так что может немного подтормаживать, сейчас над ним ведется большая работа еще.
  • +1
    А какая картина взяла первое место?
    • +6
      image
      Asteroidea Electrica by Indrat Aria
      • 0
        а в чем смысл этой работы? С Вольфрамом понятно — алгоритмическое дорисовывание. А тут?
        • +1
          The image is a false coloured low magnification electron micrograph of free-standing graphene foam, which is made by growing layers of graphene on the surface of a porous metal foam skeleton using chemical vapour deposition. The skeleton is then carefully dissolved so that only the graphene foam remains. As it is electrically conductive, highly porous and lightweight, graphene foam could be used in applications such as chemical sensing, energy storage and ultra-lightweight structures.

          www.cam.ac.uk/research/news/the-art-of-engineering-images-from-the-frontiers-of-technology
          • +2
            На самом деле «псевдораскрашивание» тоже очень интересное направление.
            Приведу небольшой пример:





            Код
            im=ImageCrop[ImageResize[Import["http://www3.nd.edu/~kamatlab/images/Facilities/ZnONR.jpg"],1000],600]; GraphicsGrid[{{im,ReliefPlot[ImageData[ColorConvert[ImageReflect[ImageRotate[im,Pi],Left-> Right],"GrayLevel"]],ColorFunction->ColorData["AvocadoColors"],ImageSize->600,PlotRangePadding->0,PerformanceGoal->"Quality"]}, {ReliefPlot[ImageData[ColorConvert[ImageReflect[ImageRotate[im,Pi],Left-> Right],"GrayLevel"]],ColorFunction->ColorData["DeepSeaColors"],ImageSize->600,PlotRangePadding->0,PerformanceGoal->"Quality"],ReliefPlot[ImageData[ColorConvert[ImageReflect[ImageRotate[im,Pi],Left-> Right],"GrayLevel"]],ColorFunction->Function[{z},RGBColor[z,0,0,z]],ImageSize->600,PlotRangePadding->0,PerformanceGoal->"Quality"]}},ImageSize->700,Spacings->0]


  • 0
    Очень интересно! А есть где-то описание применяющихся алгоритмов?
    • +1
      В тексте есть ссылки на диссертации, в которых рассматриваются эти алгоритмы.
      • 0
        Суховато. Надо поискать что-нибудь более простое. Но всё равно спасибо огромное!
  • +9
    Ярину Галу надо допилить свой алгоритм, там такое должно быть.
    Скрытый текст

    =)


    А если серьёзно — впечатляет. Особенно Ван Гог.
  • 0
    А рамочку убрать можно?
  • 0
    С рамкой:



    Без рамки:

    • 0
      Как именно её убрать-то? (:
      • +2
        Применить алгоритм, дорисовывающий недостающие части. Об этом и статья :)
    • +2
      Без рамки стык бросается в глаза. С рамкой он не так заметен.
    • 0
      Покажите пожалуйста код.
      • 0
        Так он же в статье приведен.
        • 0
          я имел ввиду для удаления рамки :)
          • 0
            В коде In[9] оставьте только конструкцию Inpaint[...].
  • 0
    А где выше приведена ссылка на/рисунок детский, который упоминается в конце статьи?
    • 0
      • 0
        Ах, теперь разобрался, спасибо (по ссылке переходил, был удивлен, что она на wiki и не обратил внимания на второй рисунок там).

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка