Комментарии 24
А вообще интересно.
P.S. Параметры мы настраиваем исходя из уже известных данных.
В качестве практической реализации на C++ семейства подобных фильтров, могу порекомендовать библиотеку ITK. В ней наиболее полная реализация этого алгоритма обобщённого для N-мерных данных. Есть также реализация на OpenCL.
https://itk.org/Doxygen/html/group__ITKAnisotropicSmoothing.html
А также дополнительный модуль Anisotropic Diffusion LBR:
https://github.com/InsightSoftwareConsortium/ITKAnisotropicDiffusionLBR
Публикация: http://insight-journal.org/browse/publication/953
например I(x,y)=(r(x,y),g(x,y),b(x,y)), то из-за линейности операции дифференцирования для каждой координатной функции r,g,b будет записано свое уравнение анизотропной диффузии, поэтому, в целом, можно независимо по каналам считать. Правда, надо понимать, что при оценке границ в обычном фильтре мы используем градиент, и это просто вектор. А когда функция I — векторная, то градиент уже будет тензором, соответственно норма градиента будет другая и оценка этой нормы тоже. То есть поменяется расчет функции c. Если же применять в лоб алгоритм для каждого канала отдельно, то результат будет скорее всего «хуже», но все зависит от конкретной задачи.
Помимо уже упомянутой модификации фильтра можно преобразовать изображение в другое цветовое пространство вида "яркость + каналы цвета". Часто используют HSV, фотографы советуют более сложное но и лучше адаптированное к зрению LAB. Фильтр гоняют на яркостной компоненте, а цветовые хорошо ортогональны к ней и куда менее заметно влияют на результат, так что их вполне можно фильтровать независимо и более простыми фильтрами. Впрочем в медицине и прочих индустриальных применениях где нужны подобные фильтры интересующие нас данные почти всегда черно-белые.
А неявные схемы (чтобы увеличить шаг по времени — т.е. обсчитывать быстрее) пробовали? Или всё равно при увеличении Δt вылезает заметная погрешность, и выигрыша не получается (в смысле, ускорение за счёт доступного увеличения Δt "сжирается" усложнением схемы)?
Ну вы же понимаете, что все от случая к случаю. Данный фильтр в фотошопе называется surface blur и присутствует там уже лет 8 точно.Можно сразу протестировать.
Исходное:
Фильтр Перона и Малика (текст):
Билатеральный фильтр (текст):
Алгоритм предложенный Siarshai (текст):
Опять же повторюсь, что данные результаты не показатель качества работы фильтров.
Что касается вашего замечания о неустойчивости, вы, наверное, просто не заметили сверху над изображением такую строчку: «Теперь попробуем нарушить условие устойчивости». Что касается устойчивости, то как я уже писал в разделе теории, условие следующее: .
Сглаживание изображений фильтром анизотропной диффузии Перона и Малика