Применение преобразования Пуассона для бесшовного наложения изображений

В задачах машинного зрения и автоматизированной обработки изображений зачастую встречается задача бесшовного наложения изображений. Для наглядности, сразу приведу пример.



Бесшовным наложением изображений (блендингом) будем называть метод, позволяющий вставить часть одного изображения в другое так, чтобы не было заметно швов на границах вставляемого изображения. Данный метод как бы подстраивает вставляемую часть под остальное изображение. На самом деле для получения результата используется только градиентное поле вставляемой части и значения пикселей исходного изображения на границе обрабатываемой области.

Постановка задачи

Пусть у нас имеются изображения А, на которое в определенном месте накладывается изображение В.

image


Для бесшовного блендинга необходимо чтобы градиент изображения А в области изображения В равнялся градиенту изображения В. Восстановление цвета на области В будет осуществляться на основе градиента в области В и данных о цвете изображения А на границе области В.
Это означает что для получения результирующего изображения необходимо восстановить изображение по его градиенту, т.е. решить задачу Пуассона.
Ниже приведено решение поставленной задачи для монотонного изображения. Для RGB изображения метод применяется к каждому каналу.

Решение

Определим границу вставляемой области следующим образом:

image


И вычислим градиент накладываемого изображения:

image


Теперь все данные имеются и мы можем составить уравнение Пуассона:

image

где (x, y) — координата текущего пикселя, N — число соседних пикселей не включая границы (не более 4), (dx, dy) — координаты соседних пикселей, могут принимать значения из множества {(-1, 0), (1, 0), (0, -1), (0, 1)}

Таким образом, для каждого неизвестного пикселя составляется уравнение. В итоге мы получим систему с M неизвестными, где М — число пикселей вставляемого изображения. Остается только решить эту систему. Методов для решения этой довольно много, но для решения обычно используют метод Якоби и метод Гаусса-Зейделя.

Зачастую, в накладываемой области смешивают градиентное поле с исходным изображением. Например, берут максимальное значение градиентов А или В в определенной точки. Лучше всего почувствовать разницу между исходным и комбинированным градиентом на примере.

Восстановление по градиенту изображения В:

image


Восстановление по максимальному градиенту изображений А и В:

image


Очевидно, что восстановление изображения по комбинированному градиенту целесообразно применять для объектов, имеющий прозрачную структуру (вода, радуга, облака и т. п.).

image


А вот как бы выглядело наложение радуги без комбинации градиентов

image


Применение преобразование блендинга Пуассона

  • Замена лиц / вставка новых объектов в кадр
  • Наложение объектов в кадр, имеющих прозрачную структуру
  • Сглаживание изображений при создании панорам
  • Сглаживание изображений при создании 3D-моделей объектов


Ссылки

Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 33

    0
    Вопрос к автору статьи: есть ли какие-либо автоматизированные программные методы для преобразования блендинга Пуассона? Или только это можно сделать только вручную в графическом редакторе?
      +1
      Что вы имеете ввиду под автоматизированными программными методами?
      В разделе «ссылки» два последних пункта — две программы, одна с исходниками.
        –6
        Я имею в ввиду, что есть ли программа, которая делала бы всё это автоматически?
          +23
          Автоматически вырезала бы акулу на одной фотке и лепила бы на другую?
            –1
            Нет, я имею в виду, чтобы можно выделить область на одном изображении и область вставки на другом, а дальше программа сама всё сделала
              –1
              Есть, называется «фотошоп» (healing brush). Тыкаешь в одну картинку, выбираешь откуда — тыкаешь в другую, оно вставляется таким вот образом, куда тыкнул.
                –1
                Она вставляет со «швами»
            0
            Чтобы автоматически выделяла область на исходном изображении и позиционировала на целевом — таких я не встречал. А с остальным справляются две последние программы в разделе «ссылки».
        +3
        А то, что здесь вычисляется — это действительно градиент? Формула выглядит больше похожей на лапласиан.
          0
          Вы правы, здесь используется Лапласиан, сумма вторых производных.
          +8
          blendme.ru/
          Комментарии там ну очень в стиле сайтов «бесплатно без смс».
            0
            Мона Пит
              +4
              Тайна улыбки Мона Лизы разгаданна.

              Для склейки панорам, думаю, лучше всего подойдет. Так, как фото наиболее близки по оттенкам.
                –1
                Ну мне кажется что для панорам лучше всё же использовать специализированные программы, например hugin
                  +1
                  Я имел ввиду выбор между предложенными применениями конкретно этого алгоритма.
                +2
                Оригинальный метод копирования градиента в 99% случаев бесполезен, сам когда-то писал похожую программку исходя из оригинальной статьи «Poisson Image Editing», по крайней мере формулы у меня похожие получались. Без серьезной ручной коррекции там обычно вообще никак. Если кому-то интересна эта тема, погуглите «seamless cloning», можно найти более умные версии алгоритма.

                Три года назад в GIMP хотели внедрить этот метод, но тогда от этой функции отказались. Ниже видео со специально подобранными картинками, но если вы возьмете любые другие случайные изображения, то скорее всего, у вас ничего не выйдет.

                  0
                  > если вы возьмете любые другие случайные изображения, то скорее всего, у вас ничего не выйдет
                  Не соглашусь. Если взять 2 изображения со схожей текстурой и градиенты на границе изображений будут близкими по значению, то все будет замечательно. Почти во всех случаях хорошо вставляются изображения с прозрачной структурой. Попробуйте вставлять радугу или облака, результат в большинстве случаев будет радовать.
                  –3
                  Напомнило
                    0
                    Здравствуйте! Спасибо за статью, но разрешите немного критики:

                    Мне интересна тема и я был бы рад видеть чуть более подробно о том, что и откуда берется и какой в этом «физический смысл» для людей, которые чуть дальше от преобразования Пуассона, чем вы :-)

                    Самая первая же формула: вы определяете H как множество точек из A, которые принадлежат какой-то dB. Или я не прав? Что такое dB? Значек похож на частную производную, но что-то она сюда не клеится.

                    Далее градиент: если я правильно помню — это вектор частных производных, в данном случае функции B. Для извлечения частных производных вы использовали приближенные формулы. А потом, для нахождения длины вектора вы просто (?!) сложили его составляющие x и y вместо того, чтобы извлечь корень из суммы квадратов? Но, вероятно я чего-то не знаю…

                    Далее уравнение Пуассона: честно говоря, наверное, в универе я прогулял эту лекцию, пришлось курить Википедию. Некоторые мгновения смотрел сюда, но так и не смог понять, что и откуда вы взяли. Поясните, пожалуйста для несведущих: что, откуда, и главное — какой «физический смысл».

                    Спасибо!
                      0
                      В первой формуле dB означает дифференциал области B. Физический смысл означает границу области.
                      Смысл первой формулы — каждый пиксель изображения А, который лежит на границе B.

                      Далее градиент. В математики градиент это производная по направлению. В обработке изображений это по сути разность между пикселями, как правило градиент применяется для выделения границ. Способов вычисления градиента довольно много. Во второй формуле используется оператор Лапласа (по сути это сумма вторых производных).

                      Третья формула это уравнение для определенного пикселя, который нужно найти. Для каждого пикселя составляется уравнение и решается система. Если изображение B содержит 100x100 пикселей, то нам для восстановления картинки необходимо решить систему из 10000 уравнений. Физический смысл такой: у нас есть область из множества пикселей, известны значения пикселей на границе области и разность между соседними пикселями на всей области. Необходимо найти значения пикселей на всей области.
                        0
                        оператор Лапласа и градиент, на сколько мне известно — разные вещи. А сумма частных производных в декартовом пространстве — это вообще дивергенция 0_o
                          0
                          Дивергенция — это вообще свойство векторного, а не скалярного поля. А лапласиан это и есть дивергенция градиента.
                            0
                            Согласен. И все равно в статье есть некая путаница с градиентом. Буду спамить, пока не исправят :-)
                          0
                          <зануда возвращается>ps: производная по направлению — проекция градиента :-)
                        0
                        Есть сильное подозрение, что при попытке применения преобразования Пуассона к каждому каналу RGB (как предложено в статье), возникнут новые цвета (то есть те, которых даже близко не было в гаммах исходного и накладываемого изображений). Пример я приводил в комментариях к статье о фильтре Кувахара. К сожалению, с ходу картинки я не сгенерирую, но при зуме такие горячие пиксели должны быть заметны.

                        В качестве решения предлагаю применять преобразование, например, к HSV.
                          0
                          В случае с Кувахара вы были абсолютно правы. Однако, здесь я даже не могу представить каким образом они могут появиться. Восстановление идет по Лапласиану. т.е. Лапласианы до преобразования и после должны быть эквивалентны. В случае возникновения новых цветов в виде точечного шума, Лапласиан будет отличаться.

                          Насчет HSV, можно поэкспериментировать. На вскидку даже не скажу изменится изображение или нет.
                            0
                            Что будет, если вклеить, скажем, яркое красное пятно с чёрной границей на равномерно зелёный фон? Насколько я понимаю, чёрный край станет зелёным, а красное пятно, соответственно, жёлтым. А если такое пятно вклеить в жёлтый фон, то в центре получится цвет 510:255:0 — красный окажется перенасыщенным.
                              0


                                0
                                Надо было брать красное пятно на чёрном, а не на белом фоне. Или, по крайней мере, проводить границу по чёрному участку.
                            +2
                            Мда, погорячился я с HSV. Результат получается плохой что с RGB, что с HSV. Решатель СЛАУ справляется как может, но алгоритм принципиально не желает сохранять схожесть цветов внутри изображения (как Insty пишет выше). Более того, что меня совсем добивает, даже если объединить в одну систему уравнений RGB, чтобы минимизировать различия сразу по трём каналам, то это практически не улучшает результат.

                            Если с однородным фоном алгоритм справляется:


                            … то с неоднородным фоном цвет уползает в оттенки фона…


                            Вот получившийся код на Python (также там несколько вспомогательных изображений, для тех, кто хочет разобраться в алгоритме).

                            Может, на СЛАУ навесить ещё каких-нибудь ограничений? Или минимизировать какой-нибудь другой параметр, а не разницу в отдельных каналах?
                              0
                              По сути алгоритм так и должен работать. Если нужно сохранить цвета, то можно попробовать выделить внешний контур накладываемого изображения и решить СЛАУ для пикселей, находящихся вне контура. На самом контуре применить альфа-блендинг, а внутри контура цвета не менять. Но выделить внешний контур не так-то просто и не всегда возможно.
                                0
                                Вот тут пишут о применении преобразования Пуассона только на яркость (luminance), а затем минимизируют геодезическое (?) цветовое расстояние на границах. К сожалению, полной версии в открытом доступе нет, но я предполагаю, что можно минимизировать по одной из формул цветового отличия, например, градиентным спуском.

                        Only users with full accounts can post comments. Log in, please.