Smorodov 579 Жалоба Опубликовано March 17, 2013 Реализовал решатель уравнения Пуассона для изображений. Если кратко, то по границе изображения и его градиентам восстанавливается исходное изображение. Применяется для различных манипуляций в пространстве градиентов (блендинг, фильтры, и т.д.). Например, реализовал на нем фильтр и блендер (в исходнике есть). Примеры работы: Смесь яблока апельсином: Фильтр обнуляющий слабые (меньше заданного порога) градиенты: (Порог 0.035) (Порог 0.045) Исходник: poisson_main.cpp ЗЫ: В качестве вспомогательных функций, реализованы прямое и обратное дискретное синусное преобразование изображения. ЗЫЗЫ: Очень интересный редактор (посмотрите видео работы) в пространстве градиентов с исходным кодом (GPU): http://graphics.cs.cmu.edu/projects/gradient-paint/ Хороший сайт с теорией и исходниками: http://www.umiacs.umd.edu/~aagrawal/ICCV2007Course/index.html 2 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано March 18, 2013 про блендинг вроде где то уже было, но я не вникал, как там выбирается граница между изображениями? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 18, 2013 Да, было, я привел его в качестве иллюстрации. Здесь, насколько я понимаю, самый простой вариант блендинга, когда берем границу от первого изображения, градиенты смешиваем по маске (размытой, иначе шов сильно виден), а затем восстанавливаем изображение по градиентам и границе. Преимущество работы с градиентами заключается в том, что мы задаем изменение цвета, а не его абсолютную величину, тем самым цвет встраиваемого объекта подгоняется под фоновую картинку. Есть еще poisson matting, это когда разные пушистые объекты задаем грубо, а точная маска формируется автоматически. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано March 18, 2013 У вас в коде в нескольких местах присутствуют примерно такие конструкции: 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<> явное обращение через указатель, то будет прирост производительности. 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано March 18, 2013 Согласен, но я больше старался чтобы код был более читаемым, тут еще большой простор для оптимизации. Например, можно не считать каждый раз матрицу-делитель, не выделять столько матриц, и т.д. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано March 19, 2013 А не пробовали скармливать этому солверу ГУ как у вас, а в качестве начальных условий например сифтовые дескрипторы? Интересно было-бы взглянуть на результаты. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 2, 2013 у вас 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/ то выдаёт какие то левые ссылки вообще Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 2, 2013 Да, через fft только для прямоугольной области. Альфа смешивание градиентов - самый простой способ совместить два изображения через уравнение Пуассона. Тут смысл в том, что начальные условия берутся от первого, а градиенты только оттеняют цвет, а не задают его жестко. Решение через разреженную систему позволяет работать с произвольными областями. Для перестановки лиц я его не использовал, там обычное альфа-смешивание через размытую маску. По поводу поиска , посмотрю, но вроде это ограничение поискового движка (копать его код не хочется). Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано April 2, 2013 когда изображения однородные и соответственно градиенты равны нулю получаем неработающий блендинг, т.е. получаем на выходе одно из изображений. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано April 2, 2013 Да нет, я имел ввиду часть начальных условий от одного, другая часть от другого. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах