Как стать автором
Обновить

Комментарии 33

Вопрос к автору статьи: есть ли какие-либо автоматизированные программные методы для преобразования блендинга Пуассона? Или только это можно сделать только вручную в графическом редакторе?
Что вы имеете ввиду под автоматизированными программными методами?
В разделе «ссылки» два последних пункта — две программы, одна с исходниками.
Я имею в ввиду, что есть ли программа, которая делала бы всё это автоматически?
Автоматически вырезала бы акулу на одной фотке и лепила бы на другую?
Нет, я имею в виду, чтобы можно выделить область на одном изображении и область вставки на другом, а дальше программа сама всё сделала
НЛО прилетело и опубликовало эту надпись здесь
Она вставляет со «швами»
Чтобы автоматически выделяла область на исходном изображении и позиционировала на целевом — таких я не встречал. А с остальным справляются две последние программы в разделе «ссылки».
А то, что здесь вычисляется — это действительно градиент? Формула выглядит больше похожей на лапласиан.
Вы правы, здесь используется Лапласиан, сумма вторых производных.
blendme.ru/
Комментарии там ну очень в стиле сайтов «бесплатно без смс».
Тайна улыбки Мона Лизы разгаданна.

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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


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

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

Публикации

Истории