Так-то оно верно, но может ввести в заблуждение начинающих. Все-таки копию массива не редко делают, чтобы что-то поменять в копии, сохранив оригинал. А потом человек недоумевает, почему объект поменялся везде.
Стоило бы сказать, что приведенные методы копирования массивов — только повторяют структуру массива и копируют только примитивные значения. Если какой-то элемент массива — объект, то в клонированном массиве будет ссылка на этот же объект, а не копия этого объекта.
Обратите внимание на функцию F. Там за счет скалярного, как я понял, произведения оператора градиента на градиент функции «фи», выходят ее вторые производные.
Не совсем понимаю, зачем судить по программе, когда в разделе теории я написал по поводу аппроксимации. Норма градиента аппроксимируется длинной проекции градиента. Как я уже упоминал в статье, Перона и Малик предложили такую аппроксимацию, хотя она и не совсем соответствует исходному уравнению, потому что она достаточно «дешевая» в плане вычислений и использование более точных аппроксимаций качественно не меняет общий результат. Кстати, изначально я как раз через центральные разности делал, разницы практически никакой не было, по крайней мере для алгоритма сегментации.
Что касается вашего замечания о неустойчивости, вы, наверное, просто не заметили сверху над изображением такую строчку: «Теперь попробуем нарушить условие устойчивости». Что касается устойчивости, то как я уже писал в разделе теории, условие следующее: .
Не пробовал, на это есть несколько причин. Во-первых, как вы уже заметили — сильно возрастает погрешность, то есть, в неявной схеме придется решать системы нелинейных уравнений (в зависимости от аппроксимации, в лучшем случае это может быть система многочленов), их тоже надо как-то аппроксимировать, отсюда — появляются дополнительные вычисление, возрастает невязка решения в целом. Во-вторых, решение, приведенное у меня в статье, легко распараллелить на вычислительном кластере, cpu и gpu.
Пробовал только ради интереса на одной картинке. Конечно, все зависит от конкретного алгоритма. Применять можно. Я взял исходное изображение из статьиSiarshai, прогнал через онлайновый файнридер результат анизотропной диффузии (t=15,k=14, функция g как у меня в реализации), результат билатерального фильтра (gmic online Spatial variance=3, Value variance=32, Iterations=6) и результат автора статьи. Ниже приведены исходное изображение, сглаженные и текст, распознанный файнридером. Ссылки на текст ведут на pastebin, изображения кликабельны.
Если честно, не слышал про обобщение. Но если принять, что функция изображения I — вектор-функция,
например I(x,y)=(r(x,y),g(x,y),b(x,y)), то из-за линейности операции дифференцирования для каждой координатной функции r,g,b будет записано свое уравнение анизотропной диффузии, поэтому, в целом, можно независимо по каналам считать. Правда, надо понимать, что при оценке границ в обычном фильтре мы используем градиент, и это просто вектор. А когда функция I — векторная, то градиент уже будет тензором, соответственно норма градиента будет другая и оценка этой нормы тоже. То есть поменяется расчет функции c. Если же применять в лоб алгоритм для каждого канала отдельно, то результат будет скорее всего «хуже», но все зависит от конкретной задачи.
Спасибо за ссылку! Тут даже не просто фильтр Перона и Малика, а обобщенный для анизотропного размытия. У Перона и Малика ведь функция c — это скаляр, а вообще на месте функции c может стоять какой-то тензор. К тому же, если я правильно понял, плагин предлагает несколько вариантов дискретизации уравнения, что тоже не мало важно.
Это далеко не дилетантский взгляд, действительно — все зависит от задачи и исходных данных, особенно от типа шумов, ведь обычно их природа известна (хотя бы в теории). Вот, например, я сейчас занимаюсь обработкой изображений срезов керна (уже получены с томографа после обратного преобразования Радона) и там много шумов разной природы, даже больше скажу, некоторые «правильные» данные мы также трактуем как шумы, из-за их очень малой значимости для задачи в целом. Так вот, перед сегментацией мы фильтруем изображения кучей разных фильтров с различными параметрами, причем тут еще важен порядок.
P.S. Параметры мы настраиваем исходя из уже известных данных.
Спасибо! На самом деле сравнивать так фильтры сложно, каждый выполняет свою задачу. Я привел для сравнения «на глаз» именно сглаживание Гаусса, потому что фильтр Перона-Малика по теории получается модификацией фильтра Гаусса (это на самом деле не совсем так, но когда функция c равняется единице, сглаживание фильтром анизотропной диффузии будет сходиться к гауссову сглаживанию).
Так-то оно верно, но может ввести в заблуждение начинающих. Все-таки копию массива не редко делают, чтобы что-то поменять в копии, сохранив оригинал. А потом человек недоумевает, почему объект поменялся везде.
Стоило бы сказать, что приведенные методы копирования массивов — только повторяют структуру массива и копируют только примитивные значения. Если какой-то элемент массива — объект, то в клонированном массиве будет ссылка на этот же объект, а не копия этого объекта.
Что касается вашего замечания о неустойчивости, вы, наверное, просто не заметили сверху над изображением такую строчку: «Теперь попробуем нарушить условие устойчивости». Что касается устойчивости, то как я уже писал в разделе теории, условие следующее: .
Исходное:
Фильтр Перона и Малика (текст):
Билатеральный фильтр (текст):
Алгоритм предложенный Siarshai (текст):
Опять же повторюсь, что данные результаты не показатель качества работы фильтров.
например I(x,y)=(r(x,y),g(x,y),b(x,y)), то из-за линейности операции дифференцирования для каждой координатной функции r,g,b будет записано свое уравнение анизотропной диффузии, поэтому, в целом, можно независимо по каналам считать. Правда, надо понимать, что при оценке границ в обычном фильтре мы используем градиент, и это просто вектор. А когда функция I — векторная, то градиент уже будет тензором, соответственно норма градиента будет другая и оценка этой нормы тоже. То есть поменяется расчет функции c. Если же применять в лоб алгоритм для каждого канала отдельно, то результат будет скорее всего «хуже», но все зависит от конкретной задачи.
P.S. Параметры мы настраиваем исходя из уже известных данных.