Перейти к содержимому
Compvision.ru
Smorodov

Решатель уравнения Пуассона и пара примеров применения.

Recommended Posts

Реализовал решатель уравнения Пуассона для изображений.

Если кратко, то по границе изображения и его градиентам восстанавливается исходное изображение.

Применяется для различных манипуляций в пространстве градиентов (блендинг, фильтры, и т.д.).

Например, реализовал на нем фильтр и блендер (в исходнике есть).

Примеры работы:

Смесь яблока апельсином:

post-1-0-76319100-1363520918_thumb.png

Фильтр обнуляющий слабые (меньше заданного порога) градиенты:

(Порог 0.035)

post-1-0-61103600-1363520926_thumb.png

(Порог 0.045)

post-1-0-68154100-1363521154_thumb.png

Исходник: poisson_main.cpp

ЗЫ: В качестве вспомогательных функций, реализованы прямое и обратное дискретное синусное преобразование изображения.

ЗЫЗЫ: Очень интересный редактор (посмотрите видео работы) в пространстве градиентов с исходным кодом (GPU):

http://graphics.cs.cmu.edu/projects/gradient-paint/

Хороший сайт с теорией и исходниками:

http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html

  • Like 2

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, было, я привел его в качестве иллюстрации.

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

Есть еще poisson matting, это когда разные пушистые объекты задаем грубо, а точная маска формируется автоматически.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У вас в коде в нескольких местах присутствуют примерно такие конструкции:


for(int i=0;i<H-1;i++)

{

	for(int j=0;j<W-1;j++)

	{

		gyy.at<float>(i+1,j)=gy.at<float>(i+1,j)-gy.at<float>(i,j);

		gxx.at<float>(i,j+1)=gx.at<float>(i,j+1)-gx.at<float>(i,j);

	}

}

Если тут использовать для обращения к отдельным элементам вместо .at<> явное обращение через указатель, то будет прирост производительности.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Согласен, но я больше старался чтобы код был более читаемым, тут еще большой простор для оптимизации.

Например, можно не считать каждый раз матрицу-делитель, не выделять столько матриц, и т.д.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А не пробовали скармливать этому солверу ГУ как у вас, а в качестве начальных условий например сифтовые дескрипторы? Интересно было-бы взглянуть на результаты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у вас poisson solver через fft, я так понял это работает только для прямоугольной области?

и не понятно почему у вас градиент считается из 2-х изображений через альфа смешивание градиентов?

тут sparse linear system через Jacobi Method (вроде как не оптимально)

http://www.ctralie.com/Teaching/PoissonImageEditing/

тут тоже poisson blending(уже выкладывался где то на форуме), Smorodov вы вроде его использовали где то(для переставки лиц вроде)?

там тоже sparse linear system, но через LU decomposition.

http://opencv.jp/opencv2-x-samples/poisson-blending

кстати тут вот еще код был для Laplacian pyramid blender вроде бы это попроще(сначала попробую его).

http://www.compvision.ru/forum/index.php?showtopic=558&view=findpost&p=5207'>http://www.compvision.ru/forum/index.php?showtopic=558&view=findpost&p=5207

http://www.morethantechnical.com/2011/11/13/just-a-simple-laplacian-pyramid-blender-using-opencv-wcode/

п.с. если искать по форуму то слова из 3 букв (типа PCA) нельзя, а если искать в гугле типа

PCA site:http://www.compvision.ru/forum/

то выдаёт какие то левые ссылки вообще

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, через fft только для прямоугольной области.

Альфа смешивание градиентов - самый простой способ совместить два изображения через уравнение Пуассона.

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

Решение через разреженную систему позволяет работать с произвольными областями.

Для перестановки лиц я его не использовал, там обычное альфа-смешивание через размытую маску.

По поводу поиска , посмотрю, но вроде это ограничение поискового движка (копать его код не хочется).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да нет, я имел ввиду часть начальных условий от одного, другая часть от другого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×